From 4c91eaec02737a3b7445a41510598d3e7b53f89a Mon Sep 17 00:00:00 2001 From: Mike Kershaw / Dragorn Date: Thu, 4 Aug 2022 10:44:30 -0400 Subject: [PATCH] Hak5 WiFi Coconut 1.0.0 import --- .gitignore | 30 +- CMakeLists.txt | 96 + CMakeSettings.json | 22 + LICENSE | 58 +- LICENSE.firmware | 2 + README.md | 8 + cmake/modules/FindPthread.cmake | 236 + cmake/modules/FindUSB1.cmake | 43 + cmake/modules/Findlibusb-1.0.cmake | 96 + cmake/set_release.cmake | 28 + getopt/getopt.c | 1086 +++ getopt/getopt.h | 180 + libwifiuserspace/CMakeLists.txt | 109 + .../firmware/LICENSE-ralink-mediatek.txt | 39 + libwifiuserspace/firmware/rt2870.bin | Bin 0 -> 8192 bytes libwifiuserspace/kernel/average.h | 78 + libwifiuserspace/kernel/bitops.h | 98 + libwifiuserspace/kernel/bits.h | 39 + libwifiuserspace/kernel/cfg80211.c | 64 + libwifiuserspace/kernel/cfg80211.h | 309 + libwifiuserspace/kernel/crc_ccit.c | 119 + libwifiuserspace/kernel/crc_ccit.h | 31 + libwifiuserspace/kernel/endian.h | 92 + libwifiuserspace/kernel/etherdevice.h | 80 + libwifiuserspace/kernel/ieee80211.h | 310 + libwifiuserspace/kernel/ieee80211_radiotap.h | 368 + libwifiuserspace/kernel/if_ether.h | 31 + libwifiuserspace/kernel/kernel.h | 265 + libwifiuserspace/kernel/le_byteshift.h | 76 + libwifiuserspace/kernel/log2.h | 229 + libwifiuserspace/kernel/mac80211.h | 1391 +++ libwifiuserspace/kernel/nl80211.h | 182 + libwifiuserspace/kernel/types.h | 49 + libwifiuserspace/kernel/usb.h | 157 + libwifiuserspace/rt2800usb/rt2800.h | 3218 +++++++ libwifiuserspace/rt2800usb/rt2800lib.c | 7737 +++++++++++++++++ libwifiuserspace/rt2800usb/rt2800lib.h | 215 + libwifiuserspace/rt2800usb/rt2800usb.c | 2467 ++++++ libwifiuserspace/rt2800usb/rt2800usb.h | 109 + libwifiuserspace/rt2800usb/rt2x00.c | 28 + libwifiuserspace/rt2800usb/rt2x00.h | 1010 +++ libwifiuserspace/rt2800usb/rt2x00lib.h | 80 + libwifiuserspace/rt2800usb/rt2x00mac.c | 120 + libwifiuserspace/rt2800usb/rt2x00queue.h | 98 + libwifiuserspace/rt2800usb/rt2x00reg.h | 255 + libwifiuserspace/rt2800usb/rt2x00usb.c | 410 + libwifiuserspace/rt2800usb/rt2x00usb.h | 296 + libwifiuserspace/userspace/userspace.c | 832 ++ libwifiuserspace/userspace/userspace.h | 434 + macos/AppIcon.icns | Bin 0 -> 1257977 bytes macos/Info.plist | 18 + macos/WiFiCoconut | 12 + macos/finish_release.zsh | 30 + simple_ringbuf_c/simple_ringbuf_c.c | 363 + simple_ringbuf_c/simple_ringbuf_c.h | 129 + wifi_capture.c | 500 ++ wifi_coconut.c | 1023 +++ wifi_coconut/wifi_coconut.c | 654 ++ wifi_coconut/wifi_coconut.h | 254 + windows/LICENSE_LIBUSB.txt | 504 ++ windows/LICENSE_PTHREADS.txt | 148 + windows/README.txt | 65 + windows/finish_release.bat | 6 + 63 files changed, 26986 insertions(+), 30 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 CMakeSettings.json create mode 100644 LICENSE.firmware create mode 100644 README.md create mode 100644 cmake/modules/FindPthread.cmake create mode 100644 cmake/modules/FindUSB1.cmake create mode 100644 cmake/modules/Findlibusb-1.0.cmake create mode 100644 cmake/set_release.cmake create mode 100644 getopt/getopt.c create mode 100644 getopt/getopt.h create mode 100644 libwifiuserspace/CMakeLists.txt create mode 100644 libwifiuserspace/firmware/LICENSE-ralink-mediatek.txt create mode 100644 libwifiuserspace/firmware/rt2870.bin create mode 100644 libwifiuserspace/kernel/average.h create mode 100644 libwifiuserspace/kernel/bitops.h create mode 100644 libwifiuserspace/kernel/bits.h create mode 100644 libwifiuserspace/kernel/cfg80211.c create mode 100644 libwifiuserspace/kernel/cfg80211.h create mode 100644 libwifiuserspace/kernel/crc_ccit.c create mode 100644 libwifiuserspace/kernel/crc_ccit.h create mode 100644 libwifiuserspace/kernel/endian.h create mode 100644 libwifiuserspace/kernel/etherdevice.h create mode 100644 libwifiuserspace/kernel/ieee80211.h create mode 100644 libwifiuserspace/kernel/ieee80211_radiotap.h create mode 100644 libwifiuserspace/kernel/if_ether.h create mode 100644 libwifiuserspace/kernel/kernel.h create mode 100644 libwifiuserspace/kernel/le_byteshift.h create mode 100644 libwifiuserspace/kernel/log2.h create mode 100644 libwifiuserspace/kernel/mac80211.h create mode 100644 libwifiuserspace/kernel/nl80211.h create mode 100644 libwifiuserspace/kernel/types.h create mode 100644 libwifiuserspace/kernel/usb.h create mode 100644 libwifiuserspace/rt2800usb/rt2800.h create mode 100644 libwifiuserspace/rt2800usb/rt2800lib.c create mode 100644 libwifiuserspace/rt2800usb/rt2800lib.h create mode 100644 libwifiuserspace/rt2800usb/rt2800usb.c create mode 100644 libwifiuserspace/rt2800usb/rt2800usb.h create mode 100644 libwifiuserspace/rt2800usb/rt2x00.c create mode 100644 libwifiuserspace/rt2800usb/rt2x00.h create mode 100644 libwifiuserspace/rt2800usb/rt2x00lib.h create mode 100644 libwifiuserspace/rt2800usb/rt2x00mac.c create mode 100644 libwifiuserspace/rt2800usb/rt2x00queue.h create mode 100644 libwifiuserspace/rt2800usb/rt2x00reg.h create mode 100644 libwifiuserspace/rt2800usb/rt2x00usb.c create mode 100644 libwifiuserspace/rt2800usb/rt2x00usb.h create mode 100644 libwifiuserspace/userspace/userspace.c create mode 100644 libwifiuserspace/userspace/userspace.h create mode 100644 macos/AppIcon.icns create mode 100644 macos/Info.plist create mode 100755 macos/WiFiCoconut create mode 100755 macos/finish_release.zsh create mode 100644 simple_ringbuf_c/simple_ringbuf_c.c create mode 100644 simple_ringbuf_c/simple_ringbuf_c.h create mode 100644 wifi_capture.c create mode 100644 wifi_coconut.c create mode 100644 wifi_coconut/wifi_coconut.c create mode 100644 wifi_coconut/wifi_coconut.h create mode 100644 windows/LICENSE_LIBUSB.txt create mode 100644 windows/LICENSE_PTHREADS.txt create mode 100755 windows/README.txt create mode 100644 windows/finish_release.bat diff --git a/.gitignore b/.gitignore index 46f42f8..93881d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,19 @@ -CMakeLists.txt.user -CMakeCache.txt -CMakeFiles -CMakeScripts -Testing -Makefile -cmake_install.cmake -install_manifest.txt -compile_commands.json -CTestTestfile.cmake -_deps +*.o +*.swp +*.swo +*.d +*.log +*.pcap +*~ +*.exe + +a.out + +.vs/* + +out/* +*/out/* +build/* +*/build/* + +.cache/* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a9650e5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,96 @@ +# Based on the hackrf cmakefiles, in turn based on the libftdi cmake + +cmake_minimum_required(VERSION 2.8) +project(userspace-wifi C) +set(PACKAGE userspace-wifi) +include(${PROJECT_SOURCE_DIR}/cmake/set_release.cmake) +add_definitions(-DRELEASE="${RELEASE}") +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules) + +if (MSVC) + include_directories(getopt) + add_definitions(/D _CRT_SECURE_NO_WARNINGS) + if (FIND_DEBUG) + add_definitions(/D FIND_DEBUG) + endif() +else() + add_definitions(-Wall) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + if (FIND_DEBUG) + add_definitions(-DFIND_DEBUG=1) + endif() +endif() + +set(prefix ${CMAKE_INSTALL_PREFIX}) + +if(MSVC) + find_package(PThread REQUIRED) + include_directories(${PTHREAD_INCLUDE_DIR}) + set(INT_THREAD_LIBS ${PTHREADS_LIBRARY}) + + find_package(LibUSB-1.0 REQUIRED) + include_directories(${LIBUSB_1_INCLUDE_DIR}) + link_directories(${LIBUSB_1_LIBRARY_DIR}) + set(INT_LIBUSB_LIBS ${LIBUSB_1_LIBRARIES}) + + set (firmwaredir .) +else() + find_package(Threads REQUIRED) + set(INT_THREAD_LIBS ${THREADS_LIBRARY}) + + find_package(USB1 REQUIRED) + include_directories(${LIBUSB_INCLUDE_DIR}) + set(INT_LIBUSB_LIBS ${LIBUSB_LIBRARIES}) + + set (firmwaredir \${prefix}/share/wifiuserspace/firmware) + +endif() + + +add_subdirectory(libwifiuserspace) + +include_directories(${PROJECT_SOURCE_DIR}/libwifiuserspace) + +SET(TOOLS + wifi_coconut_capture + wifi_coconut +) + +if (MSVC) + add_library(libgetopt_static STATIC + getopt/getopt.c + ) +endif() + +LIST(APPEND TOOLS_LINK_LIBS wifiuserspace-static) +LIST(APPEND TOOLS_LINK_LIBS ${INT_THREAD_LIBS}) +LIST(APPEND TOOLS_LINK_LIBS ${INT_LIBUSB_LIBS}) +LIST(APPEND TOOLS_LINK_LIBS ${CMAKE_THREAD_LIBS_INIT}) + +include_directories(${PROJECT_SOURCE_DIR}) + +if (MSVC) + LIST(APPEND TOOLS_LINK_LIBS libgetopt_static) + + add_custom_target(copydlls) +endif() + +add_executable(wifi_coconut_capture + wifi_capture.c +) + +add_executable(wifi_coconut + wifi_coconut.c + wifi_coconut/wifi_coconut.c +) + +foreach(tool ${TOOLS}) + target_link_libraries(${tool} ${TOOLS_LINK_LIBS}) + install(TARGETS ${tool} RUNTIME DESTINATION bin) +endforeach(tool) + +INSTALL( + DIRECTORY ${PROJECT_SOURCE_DIR}/libwifiuserspace/firmware/ + DESTINATION ${firmwaredir} +) + diff --git a/CMakeSettings.json b/CMakeSettings.json new file mode 100644 index 0000000..ec26005 --- /dev/null +++ b/CMakeSettings.json @@ -0,0 +1,22 @@ +{ + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "clang_cl_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "variables": [ + { + "name": "CMAKE_TOOLCHAIN_FILE", + "value": "C:\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake", + "type": "STRING" + }, + ] + } + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE index d159169..ff0812f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,12 +1,31 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 +Valid-License-Identifier: GPL-2.0 +Valid-License-Identifier: GPL-2.0-only +Valid-License-Identifier: GPL-2.0+ +Valid-License-Identifier: GPL-2.0-or-later +SPDX-URL: https://spdx.org/licenses/GPL-2.0.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU General Public License (GPL) version 2 only' use: + SPDX-License-Identifier: GPL-2.0 + or + SPDX-License-Identifier: GPL-2.0-only + For 'GNU General Public License (GPL) version 2 or any later version' use: + SPDX-License-Identifier: GPL-2.0+ + or + SPDX-License-Identifier: GPL-2.0-or-later +License-Text: - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -15,7 +34,7 @@ software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to +the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,8 +74,8 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - - GNU GENERAL PUBLIC LICENSE + + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -110,7 +129,7 @@ above, provided that you also meet all of these conditions: License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +187,7 @@ access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +244,7 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -255,7 +274,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -277,9 +296,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it @@ -303,9 +322,10 @@ the "copyright" line and a pointer to where the full notice is found. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Also add information on how to contact you by electronic and paper mail. @@ -335,5 +355,5 @@ necessary. Here is a sample; alter the names: This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General +library. If this is what you want to do, use the GNU Library General Public License instead of this License. diff --git a/LICENSE.firmware b/LICENSE.firmware new file mode 100644 index 0000000..d1b63c8 --- /dev/null +++ b/LICENSE.firmware @@ -0,0 +1,2 @@ +Firmware binaries are licensed according to their corresponding vendor +licenses, found in the firmware/ directory. diff --git a/README.md b/README.md new file mode 100644 index 0000000..00c438f --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Hak5 Wi-Fi Coconut + +A user-space driver for USB Wi-Fi NICs and the Hak5 Wi-Fi Coconut + +## Documentation + +See the full documentation at [docs.hak5.org](https://docs.hak5.org/wifi-coconut) for info about usage, pre-built binaries, and compiling instructions for different platforms! + diff --git a/cmake/modules/FindPthread.cmake b/cmake/modules/FindPthread.cmake new file mode 100644 index 0000000..718dbd8 --- /dev/null +++ b/cmake/modules/FindPthread.cmake @@ -0,0 +1,236 @@ +# Updated FindThreads.cmake that supports pthread-win32 +# Downloaded from http://www.vtk.org/Bug/bug_view_advanced_page.php?bug_id=6399 + +# - This module determines the thread library of the system. +# +# The following variables are set +# CMAKE_THREAD_LIBS_INIT - the thread library +# CMAKE_USE_SPROC_INIT - are we using sproc? +# CMAKE_USE_WIN32_THREADS_INIT - using WIN32 threads? +# CMAKE_USE_PTHREADS_INIT - are we using pthreads +# CMAKE_HP_PTHREADS_INIT - are we using hp pthreads +# +# If use of pthreads-win32 is desired, the following variables +# can be set. +# +# THREADS_USE_PTHREADS_WIN32 - +# Setting this to true searches for the pthreads-win32 +# port (since CMake 2.8.0) +# +# THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME +# C = no exceptions (default) +# (NOTE: This is the default scheme on most POSIX thread +# implementations and what you should probably be using) +# CE = C++ Exception Handling +# SE = Structure Exception Handling (MSVC only) +# (NOTE: Changing this option from the default may affect +# the portability of your application. See pthreads-win32 +# documentation for more details.) +# +#====================================================== +# Example usage where threading library +# is provided by the system: +# +# find_package(Threads REQUIRED) +# add_executable(foo foo.cc) +# target_link_libraries(foo ${CMAKE_THREAD_LIBS_INIT}) +# +# Example usage if pthreads-win32 is desired on Windows +# or a system provided thread library: +# +# set(THREADS_USE_PTHREADS_WIN32 true) +# find_package(Threads REQUIRED) +# include_directories(${THREADS_PTHREADS_INCLUDE_DIR}) +# +# add_executable(foo foo.cc) +# target_link_libraries(foo ${CMAKE_THREAD_LIBS_INIT}) +# + +INCLUDE (CheckIncludeFiles) +INCLUDE (CheckLibraryExists) +SET(Threads_FOUND FALSE) + +IF(WIN32 AND NOT CYGWIN AND THREADS_USE_PTHREADS_WIN32) + SET(_Threads_ptwin32 true) +ENDIF() + +# Do we have sproc? +IF(CMAKE_SYSTEM MATCHES IRIX) + CHECK_INCLUDE_FILES("sys/types.h;sys/prctl.h" CMAKE_HAVE_SPROC_H) +ENDIF() + +IF(CMAKE_HAVE_SPROC_H) + # We have sproc + SET(CMAKE_USE_SPROC_INIT 1) + +ELSEIF(_Threads_ptwin32) + + IF(NOT DEFINED THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME) + # Assign the default scheme + SET(THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME "C") + ELSE() + # Validate the scheme specified by the user + IF(NOT THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "C" AND + NOT THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "CE" AND + NOT THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "SE") + MESSAGE(FATAL_ERROR "See documentation for FindPthreads.cmake, only C, CE, and SE modes are allowed") + ENDIF() + IF(NOT MSVC AND THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "SE") + MESSAGE(FATAL_ERROR "Structured Exception Handling is only allowed for MSVC") + ENDIF(NOT MSVC AND THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "SE") + ENDIF() + + FIND_PATH(THREADS_PTHREADS_INCLUDE_DIR NAMES pthread.h) + + + # Determine the library filename + IF(MSVC) + SET(_Threads_pthreads_libname + pthreadsV${THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME}2) + ELSEIF(MINGW) + SET(_Threads_pthreads_libname + pthreadsG${THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME}2) + ELSE() + MESSAGE(FATAL_ERROR "This should never happen") + ENDIF() + + FIND_LIBRARY(THREADS_PTHREADS_WIN32_LIBRARY + NAMES ${_Threads_pthreads_libname} + ) + + IF(THREADS_PTHREADS_INCLUDE_DIR AND THREADS_PTHREADS_WIN32_LIBRARY) + MARK_AS_ADVANCED(THREADS_PTHREADS_INCLUDE_DIR) + SET(CMAKE_THREAD_LIBS_INIT ${THREADS_PTHREADS_WIN32_LIBRARY}) + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + SET(Threads_FOUND TRUE) + ENDIF() + + MARK_AS_ADVANCED(THREADS_PTHREADS_WIN32_LIBRARY) + +ELSE() + # Do we have pthreads? + CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H) + IF(CMAKE_HAVE_PTHREAD_H) + # + # We have pthread.h + # Let's check for the library now. + # + SET(CMAKE_HAVE_THREADS_LIBRARY) + IF(NOT THREADS_HAVE_PTHREAD_ARG) + + # Do we have -lpthreads + CHECK_LIBRARY_EXISTS(pthreads pthread_create "" CMAKE_HAVE_PTHREADS_CREATE) + IF(CMAKE_HAVE_PTHREADS_CREATE) + SET(CMAKE_THREAD_LIBS_INIT "-lpthreads") + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + SET(Threads_FOUND TRUE) + ENDIF() + + # Ok, how about -lpthread + CHECK_LIBRARY_EXISTS(pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE) + IF(CMAKE_HAVE_PTHREAD_CREATE) + SET(CMAKE_THREAD_LIBS_INIT "-lpthread") + SET(Threads_FOUND TRUE) + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + ENDIF() + + IF(CMAKE_SYSTEM MATCHES "SunOS.*") + # On sun also check for -lthread + CHECK_LIBRARY_EXISTS(thread thr_create "" CMAKE_HAVE_THR_CREATE) + IF(CMAKE_HAVE_THR_CREATE) + SET(CMAKE_THREAD_LIBS_INIT "-lthread") + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + SET(Threads_FOUND TRUE) + ENDIF() + ENDIF(CMAKE_SYSTEM MATCHES "SunOS.*") + + ENDIF(NOT THREADS_HAVE_PTHREAD_ARG) + + IF(NOT CMAKE_HAVE_THREADS_LIBRARY) + # If we did not found -lpthread, -lpthread, or -lthread, look for -pthread + IF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG") + MESSAGE(STATUS "Check if compiler accepts -pthread") + TRY_RUN(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG + ${CMAKE_BINARY_DIR} + ${CMAKE_ROOT}/Modules/CheckForPthreads.c + CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread + COMPILE_OUTPUT_VARIABLE OUTPUT) + + IF(THREADS_HAVE_PTHREAD_ARG) + IF(THREADS_PTHREAD_ARG MATCHES "^2$") + SET(Threads_FOUND TRUE) + MESSAGE(STATUS "Check if compiler accepts -pthread - yes") + ELSE() + MESSAGE(STATUS "Check if compiler accepts -pthread - no") + FILE(APPEND + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if compiler accepts -pthread returned ${THREADS_PTHREAD_ARG} instead of 2. The compiler had the following output:\n${OUTPUT}\n\n") + ENDIF() + ELSE() + MESSAGE(STATUS "Check if compiler accepts -pthread - no") + FILE(APPEND + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if compiler accepts -pthread failed with the following output:\n${OUTPUT}\n\n") + ENDIF() + + ENDIF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG") + + IF(THREADS_HAVE_PTHREAD_ARG) + SET(Threads_FOUND TRUE) + SET(CMAKE_THREAD_LIBS_INIT "-pthread") + ENDIF() + + ENDIF(NOT CMAKE_HAVE_THREADS_LIBRARY) + ENDIF(CMAKE_HAVE_PTHREAD_H) +ENDIF() + +IF(CMAKE_THREAD_LIBS_INIT) + SET(CMAKE_USE_PTHREADS_INIT 1) + SET(Threads_FOUND TRUE) +ENDIF() + +IF(CMAKE_SYSTEM MATCHES "Windows" + AND NOT THREADS_USE_PTHREADS_WIN32) + SET(CMAKE_USE_WIN32_THREADS_INIT 1) + SET(Threads_FOUND TRUE) +ENDIF() + +IF(CMAKE_USE_PTHREADS_INIT) + IF(CMAKE_SYSTEM MATCHES "HP-UX-*") + # Use libcma if it exists and can be used. It provides more + # symbols than the plain pthread library. CMA threads + # have actually been deprecated: + # http://docs.hp.com/en/B3920-90091/ch12s03.html#d0e11395 + # http://docs.hp.com/en/947/d8.html + # but we need to maintain compatibility here. + # The CMAKE_HP_PTHREADS setting actually indicates whether CMA threads + # are available. + CHECK_LIBRARY_EXISTS(cma pthread_attr_create "" CMAKE_HAVE_HP_CMA) + IF(CMAKE_HAVE_HP_CMA) + SET(CMAKE_THREAD_LIBS_INIT "-lcma") + SET(CMAKE_HP_PTHREADS_INIT 1) + SET(Threads_FOUND TRUE) + ENDIF(CMAKE_HAVE_HP_CMA) + SET(CMAKE_USE_PTHREADS_INIT 1) + ENDIF() + + IF(CMAKE_SYSTEM MATCHES "OSF1-V*") + SET(CMAKE_USE_PTHREADS_INIT 0) + SET(CMAKE_THREAD_LIBS_INIT ) + ENDIF() + + IF(CMAKE_SYSTEM MATCHES "CYGWIN_NT*") + SET(CMAKE_USE_PTHREADS_INIT 1) + SET(Threads_FOUND TRUE) + SET(CMAKE_THREAD_LIBS_INIT ) + SET(CMAKE_USE_WIN32_THREADS_INIT 0) + ENDIF() +ENDIF(CMAKE_USE_PTHREADS_INIT) + +INCLUDE(FindPackageHandleStandardArgs) +IF(_Threads_ptwin32) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Threads DEFAULT_MSG + THREADS_PTHREADS_WIN32_LIBRARY THREADS_PTHREADS_INCLUDE_DIR) +ELSE() + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Threads DEFAULT_MSG Threads_FOUND) +ENDIF() \ No newline at end of file diff --git a/cmake/modules/FindUSB1.cmake b/cmake/modules/FindUSB1.cmake new file mode 100644 index 0000000..2f3138d --- /dev/null +++ b/cmake/modules/FindUSB1.cmake @@ -0,0 +1,43 @@ +# - Try to find the freetype library +# Once done this defines +# +# LIBUSB_FOUND - system has libusb +# LIBUSB_INCLUDE_DIR - the libusb include directory +# LIBUSB_LIBRARIES - Link these to use libusb + +# Copyright (c) 2006, 2008 Laurent Montel, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +if (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + + # in cache already + set(LIBUSB_FOUND TRUE) + +else (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + IF (NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + pkg_check_modules(PC_LIBUSB libusb-1.0) + ENDIF(NOT WIN32) + + set(LIBUSB_LIBRARY_NAME usb-1.0) + IF(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + set(LIBUSB_LIBRARY_NAME usb) + ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + + FIND_PATH(LIBUSB_INCLUDE_DIR libusb.h + PATHS ${PC_LIBUSB_INCLUDEDIR} ${PC_LIBUSB_INCLUDE_DIRS}) + + FIND_LIBRARY(LIBUSB_LIBRARIES NAMES ${LIBUSB_LIBRARY_NAME} + PATHS ${PC_LIBUSB_LIBDIR} ${PC_LIBUSB_LIBRARY_DIRS}) + + include(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBUSB DEFAULT_MSG LIBUSB_LIBRARIES LIBUSB_INCLUDE_DIR) + + MARK_AS_ADVANCED(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) + +endif (LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) \ No newline at end of file diff --git a/cmake/modules/Findlibusb-1.0.cmake b/cmake/modules/Findlibusb-1.0.cmake new file mode 100644 index 0000000..acbd23c --- /dev/null +++ b/cmake/modules/Findlibusb-1.0.cmake @@ -0,0 +1,96 @@ +# - Try to find libusb-1.0 +# Once done this will define +# +# LIBUSB_1_FOUND - system has libusb +# LIBUSB_1_INCLUDE_DIRS - the libusb include directory +# LIBUSB_1_LIBRARIES - Link these to use libusb +# LIBUSB_1_DEFINITIONS - Compiler switches required for using libusb +# +# Adapted from cmake-modules Google Code project +# +# Copyright (c) 2006 Andreas Schneider +# +# (Changes for libusb) Copyright (c) 2008 Kyle Machulis +# +# Redistribution and use is allowed according to the terms of the New BSD license. +# +# CMake-Modules Project New BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of the CMake-Modules Project nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +if (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) + # in cache already + set(LIBUSB_FOUND TRUE) +else (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) + find_path(LIBUSB_1_INCLUDE_DIR + NAMES +libusb.h + PATHS + /usr/include + /usr/local/include + /sw/include +PATH_SUFFIXES +libusb-1.0 + ) + + find_library(LIBUSB_1_LIBRARY + NAMES + usb-1.0 usb libusb-1.0 + PATHS + /usr/lib + /usr/local/lib + /sw/lib + ) + + set(LIBUSB_1_INCLUDE_DIRS + ${LIBUSB_1_INCLUDE_DIR} + ) + set(LIBUSB_1_LIBRARIES + ${LIBUSB_1_LIBRARY} +) + + if (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) + set(LIBUSB_1_FOUND TRUE) + endif (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) + + if (LIBUSB_1_FOUND) + if (NOT libusb_1_FIND_QUIETLY) + message(STATUS "Found libusb-1.0:") +message(STATUS " - Includes: ${LIBUSB_1_INCLUDE_DIRS}") +message(STATUS " - Libraries: ${LIBUSB_1_LIBRARIES}") + endif (NOT libusb_1_FIND_QUIETLY) + else (LIBUSB_1_FOUND) + if (libusb_1_FIND_REQUIRED) + message(FATAL_ERROR "Could not find libusb") + endif (libusb_1_FIND_REQUIRED) + endif (LIBUSB_1_FOUND) + + # show the LIBUSB_1_INCLUDE_DIRS and LIBUSB_1_LIBRARIES variables only in the advanced view + mark_as_advanced(LIBUSB_1_INCLUDE_DIRS LIBUSB_1_LIBRARIES) + +endif (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) diff --git a/cmake/set_release.cmake b/cmake/set_release.cmake new file mode 100644 index 0000000..b7cea78 --- /dev/null +++ b/cmake/set_release.cmake @@ -0,0 +1,28 @@ +# Get the current git version to set a release number + +#set(RELEASE "") + +if(NOT DEFINED RELEASE) + execute_process( + COMMAND git log -n 1 --format=%h + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE GIT_EXIT_VALUE + ERROR_QUIET + OUTPUT_VARIABLE GIT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (GIT_EXIT_VALUE) + set(RELEASE "unknown") + else (GIT_EXIT_VALUE) + execute_process( + COMMAND git status -s --untracked-files=no + OUTPUT_VARIABLE DIRTY + ) + if ( NOT "${DIRTY}" STREQUAL "" ) + set(DIRTY_FLAG "*") + else() + set(DIRTY_FLAG "") + endif() + set(RELEASE "git-${GIT_VERSION}${DIRTY_FLAG}") + endif (GIT_EXIT_VALUE) +endif() diff --git a/getopt/getopt.c b/getopt/getopt.c new file mode 100644 index 0000000..4415554 --- /dev/null +++ b/getopt/getopt.c @@ -0,0 +1,1086 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# ifndef _ +# define _(msgid) gettext (msgid) +# endif +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +# if 1 //HAVE_STRING_H +# include +# else +# include +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +#ifdef _MSC_VER +// DDK will complain if you don't use the stdlib defined getenv +#include +#else +extern char *getenv (); +#endif +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (posixly_correct == NULL + && argc == __libc_argc && argv == __libc_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +int +getopt_long ( + int argc, + char *const *argv, + const char *options, + const struct option *long_options, + int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. +If an option that starts with '-' (not '--') doesn't match a long option, +but does match a short option, it is parsed as a short option +instead. */ + +int +getopt_long_only ( + int argc, + char *const *argv, + const char *options, + const struct option *long_options, + int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (print_errors) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + fprintf (stderr, _("\ + %s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/getopt/getopt.h b/getopt/getopt.h new file mode 100644 index 0000000..a1b8dd6 --- /dev/null +++ b/getopt/getopt.h @@ -0,0 +1,180 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if (defined __STDC__ && __STDC__) || defined __cplusplus +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/libwifiuserspace/CMakeLists.txt b/libwifiuserspace/CMakeLists.txt new file mode 100644 index 0000000..0be1cde --- /dev/null +++ b/libwifiuserspace/CMakeLists.txt @@ -0,0 +1,109 @@ +# Based on the hackrf cmakefiles, in turn based on the libftdi cmake + +cmake_minimum_required(VERSION 2.8) +project(libwifiuserspace C) +set(PACKAGE libwifiuserspace) +include(${PROJECT_SOURCE_DIR}/../cmake/set_release.cmake) +add_definitions(-DRELEASE="${RELEASE}") +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../cmake/modules) + +if(MSVC) + find_package(PThread REQUIRED) + include_directories(${PTHREAD_INCLUDE_DIR}) + set(INT_THREAD_LIBS ${PTHREADS_LIBRARY}) + + find_package(LibUSB-1.0 REQUIRED) + include_directories(${LIBUSB_1_INCLUDE_DIR}) + link_directories(${LIBUSB_1_LIBRARY_DIR}) + set(INT_LIBUSB_LIBS ${LIBUSB_1_LIBRARIES}) + + set(sharedir "./") + set(INSTALL_LIB_DIR "./") + set(INSTALL_DEFAULT_BINDIR "./") +else() + find_package(Threads REQUIRED) + set(INT_THREAD_LIBS ${THREADS_LIBRARY}) + + find_package(USB1 REQUIRED) + include_directories(${LIBUSB_INCLUDE_DIR}) + set(INT_LIBUSB_LIBS ${LIBUSB_LIBRARIES}) + + set (sharedir \${prefix}/share/wifiuserspace/firmware) + + set(INSTALL_LIB_DIR \${lib}suffix) + + set(INSTALL_DEFAULT_BINDIR "bin") +endif() + +add_definitions(-DFIRMWAREDIR="${prefix}/share/wifiuserspace/firmware") + +set(c_sources + ${CMAKE_CURRENT_SOURCE_DIR}/rt2800usb/rt2800lib.c + ${CMAKE_CURRENT_SOURCE_DIR}/rt2800usb/rt2800usb.c + ${CMAKE_CURRENT_SOURCE_DIR}/rt2800usb/rt2x00.c + ${CMAKE_CURRENT_SOURCE_DIR}/rt2800usb/rt2x00mac.c + ${CMAKE_CURRENT_SOURCE_DIR}/rt2800usb/rt2x00usb.c + + ${CMAKE_CURRENT_SOURCE_DIR}/kernel/cfg80211.c + ${CMAKE_CURRENT_SOURCE_DIR}/kernel/crc_ccit.c + + ${CMAKE_CURRENT_SOURCE_DIR}/userspace/userspace.c + + CACHE INTERNAL "List of C sources") + +set(c_kernel_headers + ${CMAKE_CURRENT_SOURCE_DIR}/kernel/kernel.h + ${CMAKE_CURRENT_SOURCE_DIR}/kernel/types.h + ${CMAKE_CURRENT_SOURCE_DIR}/kernel/usb.h + CACHE INTERNAL "List of userspace-kernel headers") +set(c_userspace_headers + ${CMAKE_CURRENT_SOURCE_DIR}/userspace/userspace.h + CACHE INTERNAL "List of userspace API eaders") + +add_library(wifiuserspace SHARED ${c_sources}) +set_target_properties(wifiuserspace PROPERTIES VERSION 2019.09.0 SOVERSION 0) + +add_library(wifiuserspace-static STATIC ${c_sources}) +if (MSVC) + set_target_properties(wifiuserspace-static PROPERTIES OUTPUT_NAME "wifiuserspace_static") +else() + set_target_properties(wifiuserspace-static PROPERTIES OUTPUT_NAME "wifiuserspace") +endif() + +set_target_properties(wifiuserspace PROPERTIES CLEAN_DIRECT_OUTPUT 1) +set_target_properties(wifiuserspace-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + +target_link_libraries(wifiuserspace ${INT_THREAD_LIBS} ${INT_LIBUSB_LIBS} ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(wifiuserspace-static ${INT_THREAD_LIBS} ${INT_LIBUSB_LIBS} ${CMAKE_THREAD_LIBS_INIT}) + + +if(INSTALL_LIBUSERSPACE) + if(MSVC) + # Static linkage only on win32 + else() + install(TARGETS wifiuserspace + LIBRARY DESTINATION ${INSTALL_LIB_DIR} + COMPONENT sharedlibs + ) + install(TARGETS wifiuserspace-static + ARCHIVE DESTINATION ${INSTALL_LIB_DIR} + COMPONENT staticlibs + ) + install(FILES ${c_kernel_headers} + DESTINATION include/${PROJECT_NAME} + COMPONENT headers + ) + install(FILES ${c_userspace_headers} + DESTINATION include/${PROJECT_NAME} + COMPONENT headers + ) + endif() + + INSTALL( + DIRECTORY ${PROJECT_SOURCE_DIR}/firmware/ + DESTINATION ${sharedir} + ) +endif(INSTALL_LIBUSERSPACE) + +include_directories(${PROJECT_SOURCE_DIR}) + diff --git a/libwifiuserspace/firmware/LICENSE-ralink-mediatek.txt b/libwifiuserspace/firmware/LICENSE-ralink-mediatek.txt new file mode 100644 index 0000000..fef16b6 --- /dev/null +++ b/libwifiuserspace/firmware/LICENSE-ralink-mediatek.txt @@ -0,0 +1,39 @@ +Copyright (c) 2013, Ralink, A MediaTek Company +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Ralink Technology Corporation nor the names of its + suppliers may be used to endorse or promote products derived from this + software without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Ralink Technology Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/libwifiuserspace/firmware/rt2870.bin b/libwifiuserspace/firmware/rt2870.bin new file mode 100644 index 0000000000000000000000000000000000000000..9ddac4a4bb190770789b1fbd7e28cea0a6349854 GIT binary patch literal 8192 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 30); \ + BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \ + e->internal = 0; \ + } \ + static inline unsigned long \ + ewma_##name##_read(struct ewma_##name *e) \ + { \ + BUILD_BUG_ON(!__builtin_constant_p(_precision)); \ + BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \ + BUILD_BUG_ON((_precision) > 30); \ + BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \ + return e->internal >> (_precision); \ + } \ + static inline void ewma_##name##_add(struct ewma_##name *e, \ + unsigned long val) \ + { \ + unsigned long internal = READ_ONCE(e->internal); \ + unsigned long weight_rcp = ilog2(_weight_rcp); \ + unsigned long precision = _precision; \ + \ + BUILD_BUG_ON(!__builtin_constant_p(_precision)); \ + BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \ + BUILD_BUG_ON((_precision) > 30); \ + BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \ + \ + WRITE_ONCE(e->internal, internal ? \ + (((internal << weight_rcp) - internal) + \ + (val << precision)) >> weight_rcp : \ + (val << precision)); \ + } + + +#endif /* ifndef USERSPACE_AVERAGE_H */ + diff --git a/libwifiuserspace/kernel/bitops.h b/libwifiuserspace/kernel/bitops.h new file mode 100644 index 0000000..a5407d1 --- /dev/null +++ b/libwifiuserspace/kernel/bitops.h @@ -0,0 +1,98 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#ifndef __USERSPACE_BITOPS_H__ +#define __USERSPACE_BITOPS_H__ + +#include "kernel/bits.h" +#include "kernel/types.h" + +#define BITS_PER_TYPE(type) (sizeof(type) * BITS_PER_BYTE) +#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_TYPE(long)) + +/** + * __test_and_clear_bit - Clear a bit and return its old value + * @nr: Bit to clear + * @addr: Address to count from + * + * This operation is non-atomic and can be reordered. + * If two examples of this operation race, one can appear to succeed + * but actually fail. You must protect multiple accesses with a lock. + */ +static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long old = *p; + + *p = old & ~mask; + return (old & mask) != 0; +} +#define test_and_clear_bit(nr, addr) __test_and_clear_bit((nr), (addr)) + + +/* + * Kluge swab16 + */ +static inline __u16 ___swab16(__u16 x) +{ + return x<<8 | x>>8; +} +#define swab16(x) ___swab16(x) + +/* + * Kluge FLS from generic + */ +/** + * fls - find last (most-significant) bit set + * @x: the word to search + * + * This is defined the same way as ffs. + * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. + */ + +static int __fls(unsigned int x) +{ + int r = 32; + + if (!x) + return 0; + if (!(x & 0xffff0000u)) { + x <<= 16; + r -= 16; + } + if (!(x & 0xff000000u)) { + x <<= 8; + r -= 8; + } + if (!(x & 0xf0000000u)) { + x <<= 4; + r -= 4; + } + if (!(x & 0xc0000000u)) { + x <<= 2; + r -= 2; + } + if (!(x & 0x80000000u)) { + x <<= 1; + r -= 1; + } + return r; +} + +static int __fls64(__u64 x) +{ + __u32 h = x >> 32; + if (h) + return __fls(h) + 32; + return __fls(x); +} + +#define __fls_long(x) __fls64(x) + + +#endif /* ifndef USERSPACE_BITOPS_H */ + diff --git a/libwifiuserspace/kernel/bits.h b/libwifiuserspace/kernel/bits.h new file mode 100644 index 0000000..be4ef33 --- /dev/null +++ b/libwifiuserspace/kernel/bits.h @@ -0,0 +1,39 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __BITS_H__ +#define __BITS_H__ + +#include + +#define BIT(nr) (1UL << (nr)) +#define BIT_ULL(nr) (1ULL << (nr)) +#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG) +#define BITS_PER_BYTE 8 +#define BITS_PER_LONG (8 * BITS_PER_BYTE) + +static inline void set_bit(int bit, unsigned long *x) { + *x |= (1UL << bit); +} + +static inline void clear_bit(int bit, unsigned long *x) { + *x &= ~(1UL << bit); +} + +static inline bool test_bit(int bit, unsigned long *x) { + return (*x & (1UL << bit)); +} + +#define __clear_bit(n, r) clear_bit((n), (r)) +#define __get_bit(n, r) get_bit((n), (r)) +#define __set_bit(n, r) set_bit((n), (r)) + +#endif /* ifndef BITS_H */ + diff --git a/libwifiuserspace/kernel/cfg80211.c b/libwifiuserspace/kernel/cfg80211.c new file mode 100644 index 0000000..403e9fc --- /dev/null +++ b/libwifiuserspace/kernel/cfg80211.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Wireless utility functions + * + * Copyright 2007-2009 Johannes Berg + * Copyright 2013-2014 Intel Mobile Communications GmbH + * Copyright 2017 Intel Deutschland GmbH + * Copyright (C) 2018-2019 Intel Corporation + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#include "cfg80211.h" +#include "kernel.h" + +int ieee80211_channel_to_frequency(int chan, enum nl80211_band band) +{ + /* see 802.11 17.3.8.3.2 and Annex J + * there are overlapping channel numbers in 5GHz and 2GHz bands */ + if (chan <= 0) + return 0; /* not supported */ + switch (band) { + case NL80211_BAND_2GHZ: + if (chan == 14) + return 2484; + else if (chan < 14) + return 2407 + chan * 5; + break; + case NL80211_BAND_5GHZ: + if (chan >= 182 && chan <= 196) + return 4000 + chan * 5; + else + return 5000 + chan * 5; + break; + case NL80211_BAND_60GHZ: + if (chan < 7) + return 56160 + chan * 2160; + break; + default: + ; + } + return 0; /* not supported */ +} +EXPORT_SYMBOL(ieee80211_channel_to_frequency); + +int ieee80211_frequency_to_channel(int freq) +{ + /* see 802.11 17.3.8.3.2 and Annex J */ + if (freq == 2484) + return 14; + else if (freq < 2484) + return (freq - 2407) / 5; + else if (freq >= 4910 && freq <= 4980) + return (freq - 4000) / 5; + else if (freq <= 45000) /* DMG band lower limit */ + return (freq - 5000) / 5; + else if (freq >= 58320 && freq <= 70200) + return (freq - 56160) / 2160; + else + return 0; +} +EXPORT_SYMBOL(ieee80211_frequency_to_channel); diff --git a/libwifiuserspace/kernel/cfg80211.h b/libwifiuserspace/kernel/cfg80211.h new file mode 100644 index 0000000..661bead --- /dev/null +++ b/libwifiuserspace/kernel/cfg80211.h @@ -0,0 +1,309 @@ +/* + * 802.11 device and configuration interface + * + * Copyright 2006-2010 Johannes Berg + * Copyright 2013-2014 Intel Mobile Communications GmbH + * Copyright 2015-2017 Intel Deutschland GmbH + * Copyright (C) 2018-2019 Intel Corporation + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#ifndef __USERSPACE_CFG80211_H__ +#define __USERSPACE_CFG80211_H__ + +#include + +#include "kernel/bits.h" +#include "kernel/types.h" +#include "kernel/nl80211.h" +#include "kernel/ieee80211.h" + +/** + * struct ieee80211_channel - channel definition + * + * This structure describes a single channel for use + * with cfg80211. + * + * @center_freq: center frequency in MHz + * @hw_value: hardware-specific value for the channel + * @flags: channel flags from &enum ieee80211_channel_flags. + * @orig_flags: channel flags at registration time, used by regulatory + * code to support devices with additional restrictions + * @band: band this channel belongs to. + * @max_antenna_gain: maximum antenna gain in dBi + * @max_power: maximum transmission power (in dBm) + * @max_reg_power: maximum regulatory transmission power (in dBm) + * @beacon_found: helper to regulatory code to indicate when a beacon + * has been found on this channel. Use regulatory_hint_found_beacon() + * to enable this, this is useful only on 5 GHz band. + * @orig_mag: internal use + * @orig_mpwr: internal use + * @dfs_state: current state of this channel. Only relevant if radar is required + * on this channel. + * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered. + * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels. + */ +struct ieee80211_channel { + enum nl80211_band band; + u32 center_freq; + u16 hw_value; + u32 flags; + int max_antenna_gain; + int max_power; + int max_reg_power; + bool beacon_found; + u32 orig_flags; + int orig_mag, orig_mpwr; + enum nl80211_dfs_state dfs_state; + unsigned long dfs_state_entered; + unsigned int dfs_cac_ms; +}; + +/** + * struct cfg80211_chan_def - channel definition + * @chan: the (control) channel + * @width: channel width + * @center_freq1: center frequency of first segment + * @center_freq2: center frequency of second segment + * (only with 80+80 MHz) + */ +struct cfg80211_chan_def { + struct ieee80211_channel *chan; + enum nl80211_chan_width width; + u32 center_freq1; + u32 center_freq2; +} +; +/** + * struct ieee80211_rate - bitrate definition + * + * This structure describes a bitrate that an 802.11 PHY can + * operate with. The two values @hw_value and @hw_value_short + * are only for driver use when pointers to this structure are + * passed around. + * + * @flags: rate-specific flags + * @bitrate: bitrate in units of 100 Kbps + * @hw_value: driver/hardware value for this rate + * @hw_value_short: driver/hardware value for this rate when + * short preamble is used + */ +struct ieee80211_rate { + u32 flags; + u16 bitrate; + u16 hw_value, hw_value_short; +}; + +/** + * struct ieee80211_sta_ht_cap - STA's HT capabilities + * + * This structure describes most essential parameters needed + * to describe 802.11n HT capabilities for an STA. + * + * @ht_supported: is HT supported by the STA + * @cap: HT capabilities map as described in 802.11n spec + * @ampdu_factor: Maximum A-MPDU length factor + * @ampdu_density: Minimum A-MPDU spacing + * @mcs: Supported MCS rates + */ +struct ieee80211_sta_ht_cap { + u16 cap; /* use IEEE80211_HT_CAP_ */ + bool ht_supported; + u8 ampdu_factor; + u8 ampdu_density; + struct ieee80211_mcs_info mcs; +}; + +/** + * struct ieee80211_sta_vht_cap - STA's VHT capabilities + * + * This structure describes most essential parameters needed + * to describe 802.11ac VHT capabilities for an STA. + * + * @vht_supported: is VHT supported by the STA + * @cap: VHT capabilities map as described in 802.11ac spec + * @vht_mcs: Supported VHT MCS rates + */ +struct ieee80211_sta_vht_cap { + bool vht_supported; + u32 cap; /* use IEEE80211_VHT_CAP_ */ + struct ieee80211_vht_mcs_info vht_mcs; +}; + +#define IEEE80211_HE_PPE_THRES_MAX_LEN 25 + +/** + * struct ieee80211_sta_he_cap - STA's HE capabilities + * + * This structure describes most essential parameters needed + * to describe 802.11ax HE capabilities for a STA. + * + * @has_he: true iff HE data is valid. + * @he_cap_elem: Fixed portion of the HE capabilities element. + * @he_mcs_nss_supp: The supported NSS/MCS combinations. + * @ppe_thres: Holds the PPE Thresholds data. + */ +struct ieee80211_sta_he_cap { + bool has_he; + struct ieee80211_he_cap_elem he_cap_elem; + struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp; + u8 ppe_thres[IEEE80211_HE_PPE_THRES_MAX_LEN]; +}; + +#define IEEE80211_MAX_CHAINS 4 + +/** + * enum station_info_rate_flags - bitrate info flags + * + * Used by the driver to indicate the specific rate transmission + * type for 802.11n transmissions. + * + * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS + * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS + * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval + * @RATE_INFO_FLAGS_60G: 60GHz MCS + * @RATE_INFO_FLAGS_HE_MCS: HE MCS information + */ +enum rate_info_flags { + RATE_INFO_FLAGS_MCS = BIT(0), + RATE_INFO_FLAGS_VHT_MCS = BIT(1), + RATE_INFO_FLAGS_SHORT_GI = BIT(2), + RATE_INFO_FLAGS_60G = BIT(3), + RATE_INFO_FLAGS_HE_MCS = BIT(4), +}; + +/** + * enum rate_info_bw - rate bandwidth information + * + * Used by the driver to indicate the rate bandwidth. + * + * @RATE_INFO_BW_5: 5 MHz bandwidth + * @RATE_INFO_BW_10: 10 MHz bandwidth + * @RATE_INFO_BW_20: 20 MHz bandwidth + * @RATE_INFO_BW_40: 40 MHz bandwidth + * @RATE_INFO_BW_80: 80 MHz bandwidth + * @RATE_INFO_BW_160: 160 MHz bandwidth + * @RATE_INFO_BW_HE_RU: bandwidth determined by HE RU allocation + */ +enum rate_info_bw { + RATE_INFO_BW_20 = 0, + RATE_INFO_BW_5, + RATE_INFO_BW_10, + RATE_INFO_BW_40, + RATE_INFO_BW_80, + RATE_INFO_BW_160, + RATE_INFO_BW_HE_RU, +}; + +/** + * struct rate_info - bitrate information + * + * Information about a receiving or transmitting bitrate + * + * @flags: bitflag of flags from &enum rate_info_flags + * @mcs: mcs index if struct describes an HT/VHT/HE rate + * @legacy: bitrate in 100kbit/s for 802.11abg + * @nss: number of streams (VHT & HE only) + * @bw: bandwidth (from &enum rate_info_bw) + * @he_gi: HE guard interval (from &enum nl80211_he_gi) + * @he_dcm: HE DCM value + * @he_ru_alloc: HE RU allocation (from &enum nl80211_he_ru_alloc, + * only valid if bw is %RATE_INFO_BW_HE_RU) + */ +struct rate_info { + u8 flags; + u8 mcs; + u16 legacy; + u8 nss; + u8 bw; + u8 he_gi; + u8 he_dcm; + u8 he_ru_alloc; +}; + +/** + * ieee80211_channel_to_frequency - convert channel number to frequency + * @chan: channel number + * @band: band, necessary due to channel number overlap + * Return: The corresponding frequency (in MHz), or 0 if the conversion failed. + */ +int ieee80211_channel_to_frequency(int chan, enum nl80211_band band); + +/** + * ieee80211_frequency_to_channel - convert frequency to channel number + * @freq: center frequency + * Return: The corresponding channel, or 0 if the conversion failed. + */ +int ieee80211_frequency_to_channel(int freq); + +/** + * enum ieee80211_rate_flags - rate flags + * + * Hardware/specification flags for rates. These are structured + * in a way that allows using the same bitrate structure for + * different bands/PHY modes. + * + * @IEEE80211_RATE_SHORT_PREAMBLE: Hardware can send with short + * preamble on this bitrate; only relevant in 2.4GHz band and + * with CCK rates. + * @IEEE80211_RATE_MANDATORY_A: This bitrate is a mandatory rate + * when used with 802.11a (on the 5 GHz band); filled by the + * core code when registering the wiphy. + * @IEEE80211_RATE_MANDATORY_B: This bitrate is a mandatory rate + * when used with 802.11b (on the 2.4 GHz band); filled by the + * core code when registering the wiphy. + * @IEEE80211_RATE_MANDATORY_G: This bitrate is a mandatory rate + * when used with 802.11g (on the 2.4 GHz band); filled by the + * core code when registering the wiphy. + * @IEEE80211_RATE_ERP_G: This is an ERP rate in 802.11g mode. + * @IEEE80211_RATE_SUPPORTS_5MHZ: Rate can be used in 5 MHz mode + * @IEEE80211_RATE_SUPPORTS_10MHZ: Rate can be used in 10 MHz mode + */ +enum ieee80211_rate_flags { + IEEE80211_RATE_SHORT_PREAMBLE = 1<<0, + IEEE80211_RATE_MANDATORY_A = 1<<1, + IEEE80211_RATE_MANDATORY_B = 1<<2, + IEEE80211_RATE_MANDATORY_G = 1<<3, + IEEE80211_RATE_ERP_G = 1<<4, + IEEE80211_RATE_SUPPORTS_5MHZ = 1<<5, + IEEE80211_RATE_SUPPORTS_10MHZ = 1<<6, +}; + +/** + * struct ieee80211_supported_band - frequency band definition + * + * This structure describes a frequency band a wiphy + * is able to operate in. + * + * @channels: Array of channels the hardware can operate in + * in this band. + * @band: the band this structure represents + * @n_channels: Number of channels in @channels + * @bitrates: Array of bitrates the hardware can operate with + * in this band. Must be sorted to give a valid "supported + * rates" IE, i.e. CCK rates first, then OFDM. + * @n_bitrates: Number of bitrates in @bitrates + * @ht_cap: HT capabilities in this band + * @vht_cap: VHT capabilities in this band + * @n_iftype_data: number of iftype data entries + * @iftype_data: interface type data entries. Note that the bits in + * @types_mask inside this structure cannot overlap (i.e. only + * one occurrence of each type is allowed across all instances of + * iftype_data). + */ +struct ieee80211_supported_band { + struct ieee80211_channel *channels; + struct ieee80211_rate *bitrates; + enum nl80211_band band; + int n_channels; + int n_bitrates; + struct ieee80211_sta_ht_cap ht_cap; + struct ieee80211_sta_vht_cap vht_cap; + u16 n_iftype_data; + const struct ieee80211_sband_iftype_data *iftype_data; +}; + +#endif /* ifndef USERSPACE_CFG80211_H */ diff --git a/libwifiuserspace/kernel/crc_ccit.c b/libwifiuserspace/kernel/crc_ccit.c new file mode 100644 index 0000000..331bd53 --- /dev/null +++ b/libwifiuserspace/kernel/crc_ccit.c @@ -0,0 +1,119 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * linux/lib/crc-ccitt.c + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#include "crc_ccit.h" + +/* + * This mysterious table is just the CRC of each possible byte. It can be + * computed using the standard bit-at-a-time methods. The polynomial can + * be seen in entry 128, 0x8408. This corresponds to x^0 + x^5 + x^12. + * Add the implicit x^16, and you have the standard CRC-CCITT. + */ +u16 const crc_ccitt_table[256] = { + 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, + 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, + 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, + 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, + 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, + 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, + 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, + 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, + 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, + 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, + 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, + 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, + 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, + 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, + 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, + 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, + 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, + 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, + 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, + 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, + 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, + 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, + 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, + 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, + 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, + 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, + 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, + 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, + 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, + 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, + 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, + 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 +}; + +/* + * Similar table to calculate CRC16 variant known as CRC-CCITT-FALSE + * Reflected bits order, does not augment final value. + */ +u16 const crc_ccitt_false_table[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 +}; + +/** + * crc_ccitt - recompute the CRC (CRC-CCITT variant) for the data + * buffer + * @crc: previous CRC value + * @buffer: data pointer + * @len: number of bytes in the buffer + */ +u16 crc_ccitt(u16 crc, u8 const *buffer, size_t len) +{ + while (len--) + crc = crc_ccitt_byte(crc, *buffer++); + return crc; +} + +/** + * crc_ccitt_false - recompute the CRC (CRC-CCITT-FALSE variant) + * for the data buffer + * @crc: previous CRC value + * @buffer: data pointer + * @len: number of bytes in the buffer + */ +u16 crc_ccitt_false(u16 crc, u8 const *buffer, size_t len) +{ + while (len--) + crc = crc_ccitt_false_byte(crc, *buffer++); + return crc; +} + diff --git a/libwifiuserspace/kernel/crc_ccit.h b/libwifiuserspace/kernel/crc_ccit.h new file mode 100644 index 0000000..a61f79b --- /dev/null +++ b/libwifiuserspace/kernel/crc_ccit.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#ifndef __USERSPACE_CCIT_H__ +#define __USERSPACE_CCIT_H__ + +#include + +#include "kernel/types.h" + +extern u16 const crc_ccitt_table[256]; +extern u16 const crc_ccitt_false_table[256]; + +extern u16 crc_ccitt(u16 crc, const u8 *buffer, size_t len); +extern u16 crc_ccitt_false(u16 crc, const u8 *buffer, size_t len); + +static inline u16 crc_ccitt_byte(u16 crc, const u8 c) +{ + return (crc >> 8) ^ crc_ccitt_table[(crc ^ c) & 0xff]; +} + +static inline u16 crc_ccitt_false_byte(u16 crc, const u8 c) +{ + return (crc << 8) ^ crc_ccitt_false_table[(crc >> 8) ^ c]; +} + +#endif /* ifndef USERSPACE_CCIT_H */ + diff --git a/libwifiuserspace/kernel/endian.h b/libwifiuserspace/kernel/endian.h new file mode 100644 index 0000000..c9a7721 --- /dev/null +++ b/libwifiuserspace/kernel/endian.h @@ -0,0 +1,92 @@ +/* + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __USERSPACE_ENDIAN_H__ +#define __USERSPACE_ENDIAN_H__ + +/** compatibility header for endian.h + * This is a simple compatibility shim to convert + * BSD/Linux endian macros to the Mac OS X equivalents. + * It is public domain. + * */ + +/* Derived from + * + * https://gist.githubusercontent.com/yinyin/2027912/raw/6b3e394dc6a37817410d66d6ba4d7cd6b8d5d03d/endian.h + * + */ + +#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64) || defined(__WIN32__)) && !defined(__WINDOWS__) +#define __WINDOWS__ +#endif + +#if defined(__APPLE__) +#include + +#define htobe16(x) OSSwapHostToBigInt16(x) +#define htole16(x) OSSwapHostToLittleInt16(x) +#define be16toh(x) OSSwapBigToHostInt16(x) +#define le16toh(x) OSSwapLittleToHostInt16(x) + +#define htobe32(x) OSSwapHostToBigInt32(x) +#define htole32(x) OSSwapHostToLittleInt32(x) +#define be32toh(x) OSSwapBigToHostInt32(x) +#define le32toh(x) OSSwapLittleToHostInt32(x) + +#define htobe64(x) OSSwapHostToBigInt64(x) +#define htole64(x) OSSwapHostToLittleInt64(x) +#define be64toh(x) OSSwapBigToHostInt64(x) +#define le64toh(x) OSSwapLittleToHostInt64(x) + +#elif defined(__WINDOWS__) + +#include + +#define htobe16(x) htons(x) +#define htole16(x) (x) +#define be16toh(x) ntohs(x) +#define le16toh(x) (x) + +#define htobe32(x) htonl(x) +#define htole32(x) (x) +#define be32toh(x) ntohl(x) +#define le32toh(x) (x) + +#define htobe64(x) htonll(x) +#define htole64(x) (x) +#define be64toh(x) ntohll(x) +#define le64toh(x) (x) + +#else + +#include + +#endif + +#define cpu_to_le16(x) \ + htole16(x) +#define le16_to_cpu(x) \ + le16toh(x) + +#define cpu_to_le32(x) \ + htole32(x) +#define le32_to_cpu(x) \ + le32toh(x) + +#define cpu_to_be16(x) \ + htobe16(x) +#define be16_to_cpu(x) \ + be16toh(x) + +#define cpu_to_be32(x) \ + htobe32(x) +#define be32_to_cpu(x) \ + be32toh(x) + +#endif /* ifndef ENDIAN_H */ + diff --git a/libwifiuserspace/kernel/etherdevice.h b/libwifiuserspace/kernel/etherdevice.h new file mode 100644 index 0000000..0b86868 --- /dev/null +++ b/libwifiuserspace/kernel/etherdevice.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. NET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Definitions for the Ethernet handlers. + * + * Version: @(#)eth.h 1.0.4 05/13/93 + * + * Authors: Ross Biro + * Fred N. van Kempen, + * + * Relocated to include/linux where it belongs by Alan Cox + * + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#ifndef __USERSPACE_ETHERDEVICE_H__ +#define __USERSPACE_ETHERDEVICE_H__ + +#include + +#include "kernel/endian.h" +#include "kernel/if_ether.h" +#include "kernel/kernel.h" +#include "kernel/types.h" + +/* Reserved Ethernet Addresses per IEEE 802.1Q */ +static const u8 eth_reserved_addr_base[ETH_ALEN] __aligned(2) = +{ 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; +#define eth_stp_addr eth_reserved_addr_base + +/** + * is_link_local_ether_addr - Determine if given Ethernet address is link-local + * @addr: Pointer to a six-byte array containing the Ethernet address + * + * Return true if address is link local reserved addr (01:80:c2:00:00:0X) per + * IEEE 802.1Q 8.6.3 Frame filtering. + * + * Please note: addr must be aligned to u16. + */ +static inline bool is_link_local_ether_addr(const u8 *addr) +{ + __be16 *a = (__be16 *)addr; + static const __be16 *b = (const __be16 *)eth_reserved_addr_base; + __be16 m = cpu_to_be16(0xfff0); + +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) + return (((*(const u32 *)addr) ^ (*(const u32 *)b)) | + (__force int)((a[2] ^ b[2]) & m)) == 0; +#else + return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | ((a[2] ^ b[2]) & m)) == 0; +#endif +} + +/** + * is_zero_ether_addr - Determine if give Ethernet address is all zeros. + * @addr: Pointer to a six-byte array containing the Ethernet address + * + * Return true if the address is all zeroes. + * + * Please note: addr must be aligned to u16. + */ +static inline bool is_zero_ether_addr(const u8 *addr) +{ +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) + return ((*(const u32 *)addr) | (*(const u16 *)(addr + 4))) == 0; +#else + return (*(const u16 *)(addr + 0) | + *(const u16 *)(addr + 2) | + *(const u16 *)(addr + 4)) == 0; +#endif +} + + +#endif /* ifndef USERSPACE_ETHERDEVICE_H */ diff --git a/libwifiuserspace/kernel/ieee80211.h b/libwifiuserspace/kernel/ieee80211.h new file mode 100644 index 0000000..69c4036 --- /dev/null +++ b/libwifiuserspace/kernel/ieee80211.h @@ -0,0 +1,310 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * IEEE 802.11 defines + * + * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen + * + * Copyright (c) 2002-2003, Jouni Malinen + * Copyright (c) 2005, Devicescape Software, Inc. + * Copyright (c) 2006, Michael Wu + * Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH + * Copyright (c) 2016 - 2017 Intel Deutschland GmbH + * Copyright (c) 2018 - 2019 Intel Corporation + */ + +/* + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __USERSPACE_IEEE80211_H__ +#define __USERSPACE_IEEE80211_H__ + +#include "kernel/kernel.h" +#include "kernel/nl80211.h" +#include "kernel/types.h" + +#define WLAN_SA_QUERY_TR_ID_LEN 2 +#define WLAN_MEMBERSHIP_LEN 8 +#define WLAN_USER_POSITION_LEN 16 + +/* miscellaneous IEEE 802.11 constants */ +#define IEEE80211_MAX_FRAG_THRESHOLD 2352 +#define IEEE80211_MAX_RTS_THRESHOLD 2353 +#define IEEE80211_MAX_AID 2007 +#define IEEE80211_MAX_TIM_LEN 251 +#define IEEE80211_MAX_MESH_PEERINGS 63 +/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section + 6.2.1.1.2. + + 802.11e clarifies the figure in section 7.1.2. The frame body is + up to 2304 octets long (maximum MSDU size) plus any crypt overhead. */ +#define IEEE80211_MAX_DATA_LEN 2304 +/* 802.11ad extends maximum MSDU size for DMG (freq > 40Ghz) networks + * to 7920 bytes, see 8.2.3 General frame format + */ +#define IEEE80211_MAX_DATA_LEN_DMG 7920 +/* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */ +#define IEEE80211_MAX_FRAME_LEN 2352 + +/* Maximal size of an A-MSDU that can be transported in a HT BA session */ +#define IEEE80211_MAX_MPDU_LEN_HT_BA 4095 + +/* Maximal size of an A-MSDU */ +#define IEEE80211_MAX_MPDU_LEN_HT_3839 3839 +#define IEEE80211_MAX_MPDU_LEN_HT_7935 7935 + +#define IEEE80211_MAX_MPDU_LEN_VHT_3895 3895 +#define IEEE80211_MAX_MPDU_LEN_VHT_7991 7991 +#define IEEE80211_MAX_MPDU_LEN_VHT_11454 11454 + +#define IEEE80211_MAX_SSID_LEN 32 + +#define IEEE80211_MAX_MESH_ID_LEN 32 + +#define IEEE80211_FIRST_TSPEC_TSID 8 +#define IEEE80211_NUM_TIDS 16 + +/* number of user priorities 802.11 uses */ +#define IEEE80211_NUM_UPS 8 +/* number of ACs */ +#define IEEE80211_NUM_ACS 4 + +#define IEEE80211_QOS_CTL_LEN 2 +/* 1d tag mask */ +#define IEEE80211_QOS_CTL_TAG1D_MASK 0x0007 +/* TID mask */ +#define IEEE80211_QOS_CTL_TID_MASK 0x000f +/* EOSP */ +#define IEEE80211_QOS_CTL_EOSP 0x0010 +/* ACK policy */ +#define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL 0x0000 +#define IEEE80211_QOS_CTL_ACK_POLICY_NOACK 0x0020 +#define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL 0x0040 +#define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK 0x0060 +#define IEEE80211_QOS_CTL_ACK_POLICY_MASK 0x0060 +/* A-MSDU 802.11n */ +#define IEEE80211_QOS_CTL_A_MSDU_PRESENT 0x0080 +/* Mesh Control 802.11s */ +#define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT 0x0100 + +/* Mesh Power Save Level */ +#define IEEE80211_QOS_CTL_MESH_PS_LEVEL 0x0200 +/* Mesh Receiver Service Period Initiated */ +#define IEEE80211_QOS_CTL_RSPI 0x0400 + +/* U-APSD queue for WMM IEs sent by AP */ +#define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD (1<<7) +#define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK 0x0f + +/* U-APSD queues for WMM IEs sent by STA */ +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO (1<<0) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI (1<<1) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK (1<<2) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE (1<<3) +#define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK 0x0f + +/* U-APSD max SP length for WMM IEs sent by STA */ +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL 0x00 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_2 0x01 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_4 0x02 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_6 0x03 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK 0x03 +#define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT 5 + +#define IEEE80211_HT_CTL_LEN 4 + +/* 802.11 BAR control masks */ +#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000 +#define IEEE80211_BAR_CTRL_MULTI_TID 0x0002 +#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004 +#define IEEE80211_BAR_CTRL_TID_INFO_MASK 0xf000 +#define IEEE80211_BAR_CTRL_TID_INFO_SHIFT 12 + +#define IEEE80211_HT_MCS_MASK_LEN 10 + +/** + * struct ieee80211_mcs_info - MCS information + * @rx_mask: RX mask + * @rx_highest: highest supported RX rate. If set represents + * the highest supported RX data rate in units of 1 Mbps. + * If this field is 0 this value should not be used to + * consider the highest RX data rate supported. + * @tx_params: TX parameters + */ +struct ieee80211_mcs_info { + u8 rx_mask[IEEE80211_HT_MCS_MASK_LEN]; + __le16 rx_highest; + u8 tx_params; + u8 reserved[3]; +} __packed; + +/* 802.11n HT capability MSC set */ +#define IEEE80211_HT_MCS_RX_HIGHEST_MASK 0x3ff +#define IEEE80211_HT_MCS_TX_DEFINED 0x01 +#define IEEE80211_HT_MCS_TX_RX_DIFF 0x02 +/* value 0 == 1 stream etc */ +#define IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK 0x0C +#define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT 2 +#define IEEE80211_HT_MCS_TX_MAX_STREAMS 4 +#define IEEE80211_HT_MCS_TX_UNEQUAL_MODULATION 0x10 + +/* + * 802.11n D5.0 20.3.5 / 20.6 says: + * - indices 0 to 7 and 32 are single spatial stream + * - 8 to 31 are multiple spatial streams using equal modulation + * [8..15 for two streams, 16..23 for three and 24..31 for four] + * - remainder are multiple spatial streams using unequal modulation + */ +#define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START 33 +#define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START_BYTE \ + (IEEE80211_HT_MCS_UNEQUAL_MODULATION_START / 8) + +/** + * struct ieee80211_ht_cap - HT capabilities + * + * This structure is the "HT capabilities element" as + * described in 802.11n D5.0 7.3.2.57 + */ +struct ieee80211_ht_cap { + __le16 cap_info; + u8 ampdu_params_info; + + /* 16 bytes MCS information */ + struct ieee80211_mcs_info mcs; + + __le16 extended_ht_cap_info; + __le32 tx_BF_cap_info; + u8 antenna_selection_info; +} __packed; + +/* 802.11n HT capabilities masks (for cap_info) */ +#define IEEE80211_HT_CAP_LDPC_CODING 0x0001 +#define IEEE80211_HT_CAP_SUP_WIDTH_20_40 0x0002 +#define IEEE80211_HT_CAP_SM_PS 0x000C +#define IEEE80211_HT_CAP_SM_PS_SHIFT 2 +#define IEEE80211_HT_CAP_GRN_FLD 0x0010 +#define IEEE80211_HT_CAP_SGI_20 0x0020 +#define IEEE80211_HT_CAP_SGI_40 0x0040 +#define IEEE80211_HT_CAP_TX_STBC 0x0080 +#define IEEE80211_HT_CAP_RX_STBC 0x0300 +#define IEEE80211_HT_CAP_RX_STBC_SHIFT 8 +#define IEEE80211_HT_CAP_DELAY_BA 0x0400 +#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 +#define IEEE80211_HT_CAP_DSSSCCK40 0x1000 +#define IEEE80211_HT_CAP_RESERVED 0x2000 +#define IEEE80211_HT_CAP_40MHZ_INTOLERANT 0x4000 +#define IEEE80211_HT_CAP_LSIG_TXOP_PROT 0x8000 + +/* 802.11n HT extended capabilities masks (for extended_ht_cap_info) */ +#define IEEE80211_HT_EXT_CAP_PCO 0x0001 +#define IEEE80211_HT_EXT_CAP_PCO_TIME 0x0006 +#define IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT 1 +#define IEEE80211_HT_EXT_CAP_MCS_FB 0x0300 +#define IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT 8 +#define IEEE80211_HT_EXT_CAP_HTC_SUP 0x0400 +#define IEEE80211_HT_EXT_CAP_RD_RESPONDER 0x0800 + +/* 802.11n HT capability AMPDU settings (for ampdu_params_info) */ +#define IEEE80211_HT_AMPDU_PARM_FACTOR 0x03 +#define IEEE80211_HT_AMPDU_PARM_DENSITY 0x1C +#define IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT 2 + +/** + * struct ieee80211_vht_mcs_info - VHT MCS information + * @rx_mcs_map: RX MCS map 2 bits for each stream, total 8 streams + * @rx_highest: Indicates highest long GI VHT PPDU data rate + * STA can receive. Rate expressed in units of 1 Mbps. + * If this field is 0 this value should not be used to + * consider the highest RX data rate supported. + * The top 3 bits of this field indicate the Maximum NSTS,total + * (a beamformee capability.) + * @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams + * @tx_highest: Indicates highest long GI VHT PPDU data rate + * STA can transmit. Rate expressed in units of 1 Mbps. + * If this field is 0 this value should not be used to + * consider the highest TX data rate supported. + * The top 2 bits of this field are reserved, the + * 3rd bit from the top indiciates VHT Extended NSS BW + * Capability. + */ +struct ieee80211_vht_mcs_info { + __le16 rx_mcs_map; + __le16 rx_highest; + __le16 tx_mcs_map; + __le16 tx_highest; +} __packed; + +/** + * struct ieee80211_he_cap_elem - HE capabilities element + * + * This structure is the "HE capabilities element" fixed fields as + * described in P802.11ax_D4.0 section 9.4.2.242.2 and 9.4.2.242.3 + */ +struct ieee80211_he_cap_elem { + u8 mac_cap_info[6]; + u8 phy_cap_info[11]; +} __packed; + +/** + * enum ieee80211_he_mcs_support - HE MCS support definitions + * @IEEE80211_HE_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the + * number of streams + * @IEEE80211_HE_MCS_SUPPORT_0_9: MCSes 0-9 are supported + * @IEEE80211_HE_MCS_SUPPORT_0_11: MCSes 0-11 are supported + * @IEEE80211_HE_MCS_NOT_SUPPORTED: This number of streams isn't supported + * + * These definitions are used in each 2-bit subfield of the rx_mcs_* + * and tx_mcs_* fields of &struct ieee80211_he_mcs_nss_supp, which are + * both split into 8 subfields by number of streams. These values indicate + * which MCSes are supported for the number of streams the value appears + * for. + */ +enum ieee80211_he_mcs_support { + IEEE80211_HE_MCS_SUPPORT_0_7 = 0, + IEEE80211_HE_MCS_SUPPORT_0_9 = 1, + IEEE80211_HE_MCS_SUPPORT_0_11 = 2, + IEEE80211_HE_MCS_NOT_SUPPORTED = 3, +}; + +/** + * struct ieee80211_he_mcs_nss_supp - HE Tx/Rx HE MCS NSS Support Field + * + * This structure holds the data required for the Tx/Rx HE MCS NSS Support Field + * described in P802.11ax_D2.0 section 9.4.2.237.4 + * + * @rx_mcs_80: Rx MCS map 2 bits for each stream, total 8 streams, for channel + * widths less than 80MHz. + * @tx_mcs_80: Tx MCS map 2 bits for each stream, total 8 streams, for channel + * widths less than 80MHz. + * @rx_mcs_160: Rx MCS map 2 bits for each stream, total 8 streams, for channel + * width 160MHz. + * @tx_mcs_160: Tx MCS map 2 bits for each stream, total 8 streams, for channel + * width 160MHz. + * @rx_mcs_80p80: Rx MCS map 2 bits for each stream, total 8 streams, for + * channel width 80p80MHz. + * @tx_mcs_80p80: Tx MCS map 2 bits for each stream, total 8 streams, for + * channel width 80p80MHz. + */ +struct ieee80211_he_mcs_nss_supp { + __le16 rx_mcs_80; + __le16 tx_mcs_80; + __le16 rx_mcs_160; + __le16 tx_mcs_160; + __le16 rx_mcs_80p80; + __le16 tx_mcs_80p80; +} __packed; + +/* for operation_mode */ +#define IEEE80211_HT_OP_MODE_PROTECTION 0x0003 +#define IEEE80211_HT_OP_MODE_PROTECTION_NONE 0 +#define IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER 1 +#define IEEE80211_HT_OP_MODE_PROTECTION_20MHZ 2 +#define IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED 3 +#define IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT 0x0004 +#define IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT 0x0010 +#define IEEE80211_HT_OP_MODE_CCFS2_SHIFT 5 +#define IEEE80211_HT_OP_MODE_CCFS2_MASK 0x1fe0 + +#endif /* ifndef USERSPACE_IEEE80211_H */ diff --git a/libwifiuserspace/kernel/ieee80211_radiotap.h b/libwifiuserspace/kernel/ieee80211_radiotap.h new file mode 100644 index 0000000..4ee3dc4 --- /dev/null +++ b/libwifiuserspace/kernel/ieee80211_radiotap.h @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2017 Intel Deutschland GmbH + * Copyright (c) 2018-2019 Intel Corporation + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#ifndef __RADIOTAP_H +#define __RADIOTAP_H + +#include "kernel/kernel.h" +#include "kernel/types.h" +#include "kernel/le_byteshift.h" + +/** + * struct ieee82011_radiotap_header - base radiotap header + */ +struct ieee80211_radiotap_header { + /** + * @it_version: radiotap version, always 0 + */ + uint8_t it_version; + + /** + * @it_pad: padding (or alignment) + */ + uint8_t it_pad; + + /** + * @it_len: overall radiotap header length + */ + __le16 it_len; + + /** + * @it_present: (first) present word + */ + __le32 it_present; +} __packed; + +/* version is always 0 */ +#define PKTHDR_RADIOTAP_VERSION 0 + +/* see the radiotap website for the descriptions */ +enum ieee80211_radiotap_presence { + IEEE80211_RADIOTAP_TSFT = 0, + IEEE80211_RADIOTAP_FLAGS = 1, + IEEE80211_RADIOTAP_RATE = 2, + IEEE80211_RADIOTAP_CHANNEL = 3, + IEEE80211_RADIOTAP_FHSS = 4, + IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5, + IEEE80211_RADIOTAP_DBM_ANTNOISE = 6, + IEEE80211_RADIOTAP_LOCK_QUALITY = 7, + IEEE80211_RADIOTAP_TX_ATTENUATION = 8, + IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9, + IEEE80211_RADIOTAP_DBM_TX_POWER = 10, + IEEE80211_RADIOTAP_ANTENNA = 11, + IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, + IEEE80211_RADIOTAP_DB_ANTNOISE = 13, + IEEE80211_RADIOTAP_RX_FLAGS = 14, + IEEE80211_RADIOTAP_TX_FLAGS = 15, + IEEE80211_RADIOTAP_RTS_RETRIES = 16, + IEEE80211_RADIOTAP_DATA_RETRIES = 17, + /* 18 is XChannel, but it's not defined yet */ + IEEE80211_RADIOTAP_MCS = 19, + IEEE80211_RADIOTAP_AMPDU_STATUS = 20, + IEEE80211_RADIOTAP_VHT = 21, + IEEE80211_RADIOTAP_TIMESTAMP = 22, + IEEE80211_RADIOTAP_HE = 23, + IEEE80211_RADIOTAP_HE_MU = 24, + IEEE80211_RADIOTAP_ZERO_LEN_PSDU = 26, + IEEE80211_RADIOTAP_LSIG = 27, + + /* valid in every it_present bitmap, even vendor namespaces */ + IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, + IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, + IEEE80211_RADIOTAP_EXT = 31 +}; + +/* for IEEE80211_RADIOTAP_FLAGS */ +enum ieee80211_radiotap_flags { + IEEE80211_RADIOTAP_F_CFP = 0x01, + IEEE80211_RADIOTAP_F_SHORTPRE = 0x02, + IEEE80211_RADIOTAP_F_WEP = 0x04, + IEEE80211_RADIOTAP_F_FRAG = 0x08, + IEEE80211_RADIOTAP_F_FCS = 0x10, + IEEE80211_RADIOTAP_F_DATAPAD = 0x20, + IEEE80211_RADIOTAP_F_BADFCS = 0x40, + IEEE80211_RADIOTAP_F_SHORTGI = 0x80, +}; + +/* for IEEE80211_RADIOTAP_CHANNEL */ +enum ieee80211_radiotap_channel_flags { + IEEE80211_CHAN_CCK = 0x0020, + IEEE80211_CHAN_OFDM = 0x0040, + IEEE80211_CHAN_2GHZ = 0x0080, + IEEE80211_CHAN_5GHZ = 0x0100, + IEEE80211_CHAN_DYN = 0x0400, + IEEE80211_CHAN_HALF = 0x4000, + IEEE80211_CHAN_QUARTER = 0x8000, +}; + +/* for IEEE80211_RADIOTAP_RX_FLAGS */ +enum ieee80211_radiotap_rx_flags { + IEEE80211_RADIOTAP_F_RX_BADPLCP = 0x0002, +}; + +/* for IEEE80211_RADIOTAP_TX_FLAGS */ +enum ieee80211_radiotap_tx_flags { + IEEE80211_RADIOTAP_F_TX_FAIL = 0x0001, + IEEE80211_RADIOTAP_F_TX_CTS = 0x0002, + IEEE80211_RADIOTAP_F_TX_RTS = 0x0004, + IEEE80211_RADIOTAP_F_TX_NOACK = 0x0008, +}; + +/* for IEEE80211_RADIOTAP_MCS "have" flags */ +enum ieee80211_radiotap_mcs_have { + IEEE80211_RADIOTAP_MCS_HAVE_BW = 0x01, + IEEE80211_RADIOTAP_MCS_HAVE_MCS = 0x02, + IEEE80211_RADIOTAP_MCS_HAVE_GI = 0x04, + IEEE80211_RADIOTAP_MCS_HAVE_FMT = 0x08, + IEEE80211_RADIOTAP_MCS_HAVE_FEC = 0x10, + IEEE80211_RADIOTAP_MCS_HAVE_STBC = 0x20, +}; + +enum ieee80211_radiotap_mcs_flags { + IEEE80211_RADIOTAP_MCS_BW_MASK = 0x03, + IEEE80211_RADIOTAP_MCS_BW_20 = 0, + IEEE80211_RADIOTAP_MCS_BW_40 = 1, + IEEE80211_RADIOTAP_MCS_BW_20L = 2, + IEEE80211_RADIOTAP_MCS_BW_20U = 3, + + IEEE80211_RADIOTAP_MCS_SGI = 0x04, + IEEE80211_RADIOTAP_MCS_FMT_GF = 0x08, + IEEE80211_RADIOTAP_MCS_FEC_LDPC = 0x10, + IEEE80211_RADIOTAP_MCS_STBC_MASK = 0x60, + IEEE80211_RADIOTAP_MCS_STBC_1 = 1, + IEEE80211_RADIOTAP_MCS_STBC_2 = 2, + IEEE80211_RADIOTAP_MCS_STBC_3 = 3, + IEEE80211_RADIOTAP_MCS_STBC_SHIFT = 5, +}; + +/* for IEEE80211_RADIOTAP_AMPDU_STATUS */ +enum ieee80211_radiotap_ampdu_flags { + IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN = 0x0001, + IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN = 0x0002, + IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN = 0x0004, + IEEE80211_RADIOTAP_AMPDU_IS_LAST = 0x0008, + IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR = 0x0010, + IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN = 0x0020, + IEEE80211_RADIOTAP_AMPDU_EOF = 0x0040, + IEEE80211_RADIOTAP_AMPDU_EOF_KNOWN = 0x0080, +}; + +/* for IEEE80211_RADIOTAP_VHT */ +enum ieee80211_radiotap_vht_known { + IEEE80211_RADIOTAP_VHT_KNOWN_STBC = 0x0001, + IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA = 0x0002, + IEEE80211_RADIOTAP_VHT_KNOWN_GI = 0x0004, + IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS = 0x0008, + IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM = 0x0010, + IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED = 0x0020, + IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH = 0x0040, + IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID = 0x0080, + IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID = 0x0100, +}; + +enum ieee80211_radiotap_vht_flags { + IEEE80211_RADIOTAP_VHT_FLAG_STBC = 0x01, + IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA = 0x02, + IEEE80211_RADIOTAP_VHT_FLAG_SGI = 0x04, + IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 = 0x08, + IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM = 0x10, + IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED = 0x20, +}; + +enum ieee80211_radiotap_vht_coding { + IEEE80211_RADIOTAP_CODING_LDPC_USER0 = 0x01, + IEEE80211_RADIOTAP_CODING_LDPC_USER1 = 0x02, + IEEE80211_RADIOTAP_CODING_LDPC_USER2 = 0x04, + IEEE80211_RADIOTAP_CODING_LDPC_USER3 = 0x08, +}; + +/* for IEEE80211_RADIOTAP_TIMESTAMP */ +enum ieee80211_radiotap_timestamp_unit_spos { + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MASK = 0x000F, + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MS = 0x0000, + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US = 0x0001, + IEEE80211_RADIOTAP_TIMESTAMP_UNIT_NS = 0x0003, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_MASK = 0x00F0, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_BEGIN_MDPU = 0x0000, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_PLCP_SIG_ACQ = 0x0010, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_PPDU = 0x0020, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_MPDU = 0x0030, + IEEE80211_RADIOTAP_TIMESTAMP_SPOS_UNKNOWN = 0x00F0, +}; + +enum ieee80211_radiotap_timestamp_flags { + IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT = 0x00, + IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT = 0x01, + IEEE80211_RADIOTAP_TIMESTAMP_FLAG_ACCURACY = 0x02, +}; + +struct ieee80211_radiotap_he { + __le16 data1, data2, data3, data4, data5, data6; +}; + +enum ieee80211_radiotap_he_bits { + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MASK = 3, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_SU = 0, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_EXT_SU = 1, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MU = 2, + IEEE80211_RADIOTAP_HE_DATA1_FORMAT_TRIG = 3, + + IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN = 0x0004, + IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN = 0x0008, + IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN = 0x0010, + IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN = 0x0020, + IEEE80211_RADIOTAP_HE_DATA1_DATA_DCM_KNOWN = 0x0040, + IEEE80211_RADIOTAP_HE_DATA1_CODING_KNOWN = 0x0080, + IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN = 0x0100, + IEEE80211_RADIOTAP_HE_DATA1_STBC_KNOWN = 0x0200, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN = 0x0400, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE2_KNOWN = 0x0800, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE3_KNOWN = 0x1000, + IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE4_KNOWN = 0x2000, + IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN = 0x4000, + IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN = 0x8000, + + IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_KNOWN = 0x0001, + IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN = 0x0002, + IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN = 0x0004, + IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN = 0x0008, + IEEE80211_RADIOTAP_HE_DATA2_TXBF_KNOWN = 0x0010, + IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN = 0x0020, + IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN = 0x0040, + IEEE80211_RADIOTAP_HE_DATA2_MIDAMBLE_KNOWN = 0x0080, + IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET = 0x3f00, + IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET_KNOWN = 0x4000, + IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC = 0x8000, + + IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR = 0x003f, + IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE = 0x0040, + IEEE80211_RADIOTAP_HE_DATA3_UL_DL = 0x0080, + IEEE80211_RADIOTAP_HE_DATA3_DATA_MCS = 0x0f00, + IEEE80211_RADIOTAP_HE_DATA3_DATA_DCM = 0x1000, + IEEE80211_RADIOTAP_HE_DATA3_CODING = 0x2000, + IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG = 0x4000, + IEEE80211_RADIOTAP_HE_DATA3_STBC = 0x8000, + + IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE = 0x000f, + IEEE80211_RADIOTAP_HE_DATA4_MU_STA_ID = 0x7ff0, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1 = 0x000f, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2 = 0x00f0, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3 = 0x0f00, + IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE4 = 0xf000, + + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC = 0x000f, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_20MHZ = 0, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_40MHZ = 1, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_80MHZ = 2, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_160MHZ = 3, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_26T = 4, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_52T = 5, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_106T = 6, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_242T = 7, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_484T = 8, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_996T = 9, + IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_2x996T = 10, + + IEEE80211_RADIOTAP_HE_DATA5_GI = 0x0030, + IEEE80211_RADIOTAP_HE_DATA5_GI_0_8 = 0, + IEEE80211_RADIOTAP_HE_DATA5_GI_1_6 = 1, + IEEE80211_RADIOTAP_HE_DATA5_GI_3_2 = 2, + + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE = 0x00c0, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_UNKNOWN = 0, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_1X = 1, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_2X = 2, + IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_4X = 3, + IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS = 0x0700, + IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD = 0x3000, + IEEE80211_RADIOTAP_HE_DATA5_TXBF = 0x4000, + IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG = 0x8000, + + IEEE80211_RADIOTAP_HE_DATA6_NSTS = 0x000f, + IEEE80211_RADIOTAP_HE_DATA6_DOPPLER = 0x0010, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN = 0x0020, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW = 0x00c0, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_20MHZ = 0, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_40MHZ = 1, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_80MHZ = 2, + IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_160MHZ = 3, + IEEE80211_RADIOTAP_HE_DATA6_TXOP = 0x7f00, + IEEE80211_RADIOTAP_HE_DATA6_MIDAMBLE_PDCTY = 0x8000, +}; + +struct ieee80211_radiotap_he_mu { + __le16 flags1, flags2; + u8 ru_ch1[4]; + u8 ru_ch2[4]; +}; + +enum ieee80211_radiotap_he_mu_bits { + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS = 0x000f, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS_KNOWN = 0x0010, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM = 0x0020, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM_KNOWN = 0x0040, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_CTR_26T_RU_KNOWN = 0x0080, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_RU_KNOWN = 0x0100, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_RU_KNOWN = 0x0200, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU_KNOWN = 0x1000, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU = 0x2000, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_COMP_KNOWN = 0x4000, + IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_SYMS_USERS_KNOWN = 0x8000, + + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW = 0x0003, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_20MHZ = 0x0000, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_40MHZ = 0x0001, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_80MHZ = 0x0002, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_160MHZ = 0x0003, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN = 0x0004, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_COMP = 0x0008, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS = 0x00f0, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW = 0x0300, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN= 0x0400, + IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU = 0x0800, +}; + +enum ieee80211_radiotap_lsig_data1 { + IEEE80211_RADIOTAP_LSIG_DATA1_RATE_KNOWN = 0x0001, + IEEE80211_RADIOTAP_LSIG_DATA1_LENGTH_KNOWN = 0x0002, +}; + +enum ieee80211_radiotap_lsig_data2 { + IEEE80211_RADIOTAP_LSIG_DATA2_RATE = 0x000f, + IEEE80211_RADIOTAP_LSIG_DATA2_LENGTH = 0xfff0, +}; + +struct ieee80211_radiotap_lsig { + __le16 data1, data2; +}; + +enum ieee80211_radiotap_zero_len_psdu_type { + IEEE80211_RADIOTAP_ZERO_LEN_PSDU_SOUNDING = 0, + IEEE80211_RADIOTAP_ZERO_LEN_PSDU_NOT_CAPTURED = 1, + IEEE80211_RADIOTAP_ZERO_LEN_PSDU_VENDOR = 0xff, +}; + +/** + * ieee80211_get_radiotap_len - get radiotap header length + */ +static inline u16 ieee80211_get_radiotap_len(const char *data) +{ + struct ieee80211_radiotap_header *hdr = (struct ieee80211_radiotap_header *)data; + + return get_unaligned_le16(&hdr->it_len); +} + +#endif /* __RADIOTAP_H */ diff --git a/libwifiuserspace/kernel/if_ether.h b/libwifiuserspace/kernel/if_ether.h new file mode 100644 index 0000000..a9cfd07 --- /dev/null +++ b/libwifiuserspace/kernel/if_ether.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Global definitions for the Ethernet IEEE 802.3 interface. + * + * Version: @(#)if_ether.h 1.0.1a 02/08/94 + * + * Author: Fred N. van Kempen, + * Donald Becker, + * Alan Cox, + * Steve Whitehouse, + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#ifndef __USERSPACE_IF_ETHER_H__ +#define __USERSPACE_IF_ETHER_H__ + +#define ETH_ALEN 6 + +#endif /* ifndef USERSPACE_IF_ETHER_H */ diff --git a/libwifiuserspace/kernel/kernel.h b/libwifiuserspace/kernel/kernel.h new file mode 100644 index 0000000..9d8f06b --- /dev/null +++ b/libwifiuserspace/kernel/kernel.h @@ -0,0 +1,265 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __USERSPACE_KERNEL_H__ +#define __USERSPACE_KERNEL_H__ + +/* + * Define some kernel nomenclature and functions that we just transpose into + * normal gcc-isms, along with modified BUG_ON, WARN_ON, etc. + */ + +#if !defined(_WIN32) +#define __packed __attribute__((packed)) +#define __aligned(nr) __attribute__((aligned (nr))) +#else +#define __packed +#define __aligned(nr) +#endif + +#define __rcu + +#ifndef __attribute_const__ +#define __attribute_const__ +#endif + +#if defined(_MSC_VER) +/* Hack all constant compares to be true for MSC */ +#define __builtin_constant_p(x) (1) + +/* Use ternary to simulate builtin choose expr */ +#define __builtin_choose_expr(e, t, f) ((e) ? (t) : (f)) +#endif + +/* + * Just test + */ +#define unlikely(x) (x) + +#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) +#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) + +/* Force a compilation error if a constant expression is not a power of 2 */ +#define __BUILD_BUG_ON_NOT_POWER_OF_2(n) \ + BUILD_BUG_ON(((n) & ((n) - 1)) != 0) +#define BUILD_BUG_ON_NOT_POWER_OF_2(n) \ + BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0)) + +#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0) +#define BUG() do { \ + fprintf(stderr, "BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ + exit(-1); \ +} while (0) + +#define WARN_ONCE(condition, fmt, ...) \ + do { if (condition) fprintf(stderr, "%s: WARNING - " fmt, __func__, ##__VA_ARGS__); } while (0) +#define WARN_ON_ONCE(condition) (condition) +#define WARN_ON(condition) do { if (unlikely(condition)) WARN(); } while (0) +#define WARN() do { \ + fprintf(stderr, "WARNING: warning at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ +} while (0) + +#define READ_ONCE(x) (x) +#define WRITE_ONCE(t, v) ((t) = (v)) + +/* + * We don't currently do kernel mutexes; this could be re-def'd to pthread + * mutexes if we need to + */ +#if 0 +#define mutex_lock(x) pthread_mutex_lock((x)) +#define mutex_unlock(x) pthread_mutex_unlock((x)) +#else +#define mutex_lock(x) +#define mutex_unlock(x) +#endif + + +/* + * Just treat sleeps and delays as usleeps + */ +#define msleep(x) usleep(x * 1000) +#define udelay(x) usleep(x) +#define usleep_range(x, y) usleep(y) + +/* + * Modified and simplified from the kernel macros + */ + +#define __cmp(x, y, op) ((x) op (y) ? (x) : (y)) + +/** + * min_t - return minimum of two values, using the specified type + * @type: data type to use + * @x: first value + * @y: second value + */ +#define min_t(type, x, y) __cmp((type)(x), (type)(y), <) + +/** + * max_t - return maximum of two values, using the specified type + * @type: data type to use + * @x: first value + * @y: second value + */ +#define max_t(type, x, y) __cmp((type)(x), (type)(y), >) + +/** + * max - return maximum of two values of the same or compatible types + * @x: first value + * @y: second value + */ +#define max(x, y) __cmp(x, y, >) + +/* + * This looks more complex than it should be. But we need to + * get the type for the ~ right in round_down (it needs to be + * as wide as the result!), and we want to evaluate the macro + * arguments just once each. + */ +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +/** + * round_up - round up to next specified power of 2 + * @x: the value to round + * @y: multiple to round up to (must be a power of 2) + * + * Rounds @x up to next multiple of @y (which must be a power of 2). + * To perform arbitrary rounding up, use roundup() below. + */ +#ifndef round_up +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) +#endif +/** + * round_down - round down to next specified power of 2 + * @x: the value to round + * @y: multiple to round down to (must be a power of 2) + * + * Rounds @x down to next multiple of @y (which must be a power of 2). + * To perform arbitrary rounding down, use rounddown() below. + */ +#ifndef round_down +#define round_down(x, y) ((x) & ~__round_mask(x, y)) +#endif + +/** + * FIELD_SIZEOF - get the size of a struct's field + * @t: the target struct + * @f: the target struct's field + * Return: the size of @f in the struct definition without having a + * declared instance of @t. + */ +#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) + +#define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP + +#define DIV_ROUND_DOWN_ULL(ll, d) \ + ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; }) + +#define DIV_ROUND_UP_ULL(ll, d) \ + DIV_ROUND_DOWN_ULL((unsigned long long)(ll) + (d) - 1, (d)) + +#if BITS_PER_LONG == 32 +# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d) +#else +# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d) +#endif + +/** + * roundup - round up to the next specified multiple + * @x: the value to up + * @y: multiple to round up to + * + * Rounds @x up to next multiple of @y. If @y will always be a power + * of 2, consider using the faster round_up(). + */ +#define roundup(x, y) ( \ +{ \ + typeof(y) __y = y; \ + (((x) + (__y - 1)) / __y) * __y; \ +} \ +) +/** + * rounddown - round down to next specified multiple + * @x: the value to round + * @y: multiple to round down to + * + * Rounds @x down to next multiple of @y. If @y will always be a power + * of 2, consider using the faster round_down(). + */ +#define rounddown(x, y) ( \ +{ \ + typeof(x) __x = (x); \ + __x - (__x % (y)); \ +} \ +) + +/* + * Divide positive or negative dividend by positive or negative divisor + * and round to closest integer. Result is undefined for negative + * divisors if the dividend variable type is unsigned and for negative + * dividends if the divisor variable type is unsigned. + */ +#define DIV_ROUND_CLOSEST(x, divisor)( \ +{ \ + typeof(x) __x = x; \ + typeof(divisor) __d = divisor; \ + (((typeof(x))-1) > 0 || \ + ((typeof(divisor))-1) > 0 || \ + (((__x) > 0) == ((__d) > 0))) ? \ + (((__x) + ((__d) / 2)) / (__d)) : \ + (((__x) - ((__d) / 2)) / (__d)); \ +} \ +) +/* + * Same as above but for u64 dividends. divisor must be a 32-bit + * number. + */ +#define DIV_ROUND_CLOSEST_ULL(x, divisor)( \ +{ \ + typeof(divisor) __d = divisor; \ + unsigned long long _tmp = (x) + (__d) / 2; \ + do_div(_tmp, __d); \ + _tmp; \ +} \ +) + +#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) + +/* Are two types/vars the same type (ignoring qualifiers)? */ +#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) + +/* &a[0] degrades to a pointer: a different type from an array */ +#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) + +/** + * ARRAY_SIZE - get the number of elements in array @arr + * @arr: array to be sized + */ +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +/* + * Kluge in ENOTSUPP which isn't in userspace + */ +#define ENOTSUPP 524 + +/* + * Kluge in symbol masking + */ +#define EXPORT_SYMBOL_GPL(x) +#define EXPORT_SYMBOL(x) + +#define GFP_KERNEL +/* + * Hack kalloc to malloc + */ +#define kcalloc(nelem, sz, type) malloc(nelem * sz) + + +#define kfree(n) free(n) + +#endif /* ifndef KERNEL_H */ + diff --git a/libwifiuserspace/kernel/le_byteshift.h b/libwifiuserspace/kernel/le_byteshift.h new file mode 100644 index 0000000..7b5be79 --- /dev/null +++ b/libwifiuserspace/kernel/le_byteshift.h @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Userspace port (c) 2019 Hak5 LLC + */ + +#ifndef _USERSPACE_LINUX_UNALIGNED_LE_BYTESHIFT_H +#define _USERSPACE_LINUX_UNALIGNED_LE_BYTESHIFT_H + +#include "kernel/types.h" + +static inline u16 __get_unaligned_le16(const u8 *p) +{ + return p[0] | p[1] << 8; +} + +static inline u32 __get_unaligned_le32(const u8 *p) +{ + return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; +} + +static inline u64 __get_unaligned_le64(const u8 *p) +{ + return (u64)__get_unaligned_le32(p + 4) << 32 | + __get_unaligned_le32(p); +} + +static inline void __put_unaligned_le16(u16 val, u8 *p) +{ + *p++ = val; + *p++ = val >> 8; +} + +static inline void __put_unaligned_le32(u32 val, u8 *p) +{ + __put_unaligned_le16(val >> 16, p + 2); + __put_unaligned_le16(val, p); +} + +static inline void __put_unaligned_le64(u64 val, u8 *p) +{ + __put_unaligned_le32(val >> 32, p + 4); + __put_unaligned_le32(val, p); +} + +static inline u16 get_unaligned_le16(const void *p) +{ + return __get_unaligned_le16((const u8 *)p); +} + +static inline u32 get_unaligned_le32(const void *p) +{ + return __get_unaligned_le32((const u8 *)p); +} + +static inline u64 get_unaligned_le64(const void *p) +{ + return __get_unaligned_le64((const u8 *)p); +} + +static inline void put_unaligned_le16(u16 val, void *p) +{ + __put_unaligned_le16(val, (u8 *) p); +} + +static inline void put_unaligned_le32(u32 val, void *p) +{ + __put_unaligned_le32(val, (u8 *) p); +} + +static inline void put_unaligned_le64(u64 val, void *p) +{ + __put_unaligned_le64(val, (u8 *) p); +} + +#endif /* _USERSPACE_LINUX_UNALIGNED_LE_BYTESHIFT_H */ diff --git a/libwifiuserspace/kernel/log2.h b/libwifiuserspace/kernel/log2.h new file mode 100644 index 0000000..a0c3a9d --- /dev/null +++ b/libwifiuserspace/kernel/log2.h @@ -0,0 +1,229 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Integer base 2 logarithm calculation + * + * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + */ + +/* Userspace port (c) 2019 Hak5 + */ + +#ifndef __USERSPACE_LOG2_H__ +#define __USERSPACE_LOG2_H__ + +#include "types.h" +#include "bitops.h" + + +/* + * non-constant log of base 2 calculators + * - the arch may override these in asm/bitops.h if they can be implemented + * more efficiently than using fls() and fls64() + * - the arch is not required to handle n==0 if implementing the fallback + */ +#ifndef CONFIG_ARCH_HAS_ILOG2_U32 +static inline const +int __ilog2_u32(u32 n) +{ + return __fls(n) - 1; +} +#endif + +#ifndef CONFIG_ARCH_HAS_ILOG2_U64 +static inline const +int __ilog2_u64(u64 n) +{ + return __fls64(n) - 1; +} +#endif + +/** + * is_power_of_2() - check if a value is a power of two + * @n: the value to check + * + * Determine whether some value is a power of two, where zero is + * *not* considered a power of two. + * Return: true if @n is a power of 2, otherwise false. + */ +static inline const +bool is_power_of_2(unsigned long n) +{ + return (n != 0 && ((n & (n - 1)) == 0)); +} + +/** + * __roundup_pow_of_two() - round up to nearest power of two + * @n: value to round up + */ +static inline const +unsigned long __roundup_pow_of_two(unsigned long n) +{ + return 1UL << __fls_long(n - 1); +} + +/** + * __rounddown_pow_of_two() - round down to nearest power of two + * @n: value to round down + */ +static inline const +unsigned long __rounddown_pow_of_two(unsigned long n) +{ + return 1UL << (__fls_long(n) - 1); +} + +/** + * const_ilog2 - log base 2 of 32-bit or a 64-bit constant unsigned value + * @n: parameter + * + * Use this where sparse expects a true constant expression, e.g. for array + * indices. + */ +#define const_ilog2(n) \ +( \ + __builtin_constant_p(n) ? ( \ + (n) < 2 ? 0 : \ + (n) & (1ULL << 63) ? 63 : \ + (n) & (1ULL << 62) ? 62 : \ + (n) & (1ULL << 61) ? 61 : \ + (n) & (1ULL << 60) ? 60 : \ + (n) & (1ULL << 59) ? 59 : \ + (n) & (1ULL << 58) ? 58 : \ + (n) & (1ULL << 57) ? 57 : \ + (n) & (1ULL << 56) ? 56 : \ + (n) & (1ULL << 55) ? 55 : \ + (n) & (1ULL << 54) ? 54 : \ + (n) & (1ULL << 53) ? 53 : \ + (n) & (1ULL << 52) ? 52 : \ + (n) & (1ULL << 51) ? 51 : \ + (n) & (1ULL << 50) ? 50 : \ + (n) & (1ULL << 49) ? 49 : \ + (n) & (1ULL << 48) ? 48 : \ + (n) & (1ULL << 47) ? 47 : \ + (n) & (1ULL << 46) ? 46 : \ + (n) & (1ULL << 45) ? 45 : \ + (n) & (1ULL << 44) ? 44 : \ + (n) & (1ULL << 43) ? 43 : \ + (n) & (1ULL << 42) ? 42 : \ + (n) & (1ULL << 41) ? 41 : \ + (n) & (1ULL << 40) ? 40 : \ + (n) & (1ULL << 39) ? 39 : \ + (n) & (1ULL << 38) ? 38 : \ + (n) & (1ULL << 37) ? 37 : \ + (n) & (1ULL << 36) ? 36 : \ + (n) & (1ULL << 35) ? 35 : \ + (n) & (1ULL << 34) ? 34 : \ + (n) & (1ULL << 33) ? 33 : \ + (n) & (1ULL << 32) ? 32 : \ + (n) & (1ULL << 31) ? 31 : \ + (n) & (1ULL << 30) ? 30 : \ + (n) & (1ULL << 29) ? 29 : \ + (n) & (1ULL << 28) ? 28 : \ + (n) & (1ULL << 27) ? 27 : \ + (n) & (1ULL << 26) ? 26 : \ + (n) & (1ULL << 25) ? 25 : \ + (n) & (1ULL << 24) ? 24 : \ + (n) & (1ULL << 23) ? 23 : \ + (n) & (1ULL << 22) ? 22 : \ + (n) & (1ULL << 21) ? 21 : \ + (n) & (1ULL << 20) ? 20 : \ + (n) & (1ULL << 19) ? 19 : \ + (n) & (1ULL << 18) ? 18 : \ + (n) & (1ULL << 17) ? 17 : \ + (n) & (1ULL << 16) ? 16 : \ + (n) & (1ULL << 15) ? 15 : \ + (n) & (1ULL << 14) ? 14 : \ + (n) & (1ULL << 13) ? 13 : \ + (n) & (1ULL << 12) ? 12 : \ + (n) & (1ULL << 11) ? 11 : \ + (n) & (1ULL << 10) ? 10 : \ + (n) & (1ULL << 9) ? 9 : \ + (n) & (1ULL << 8) ? 8 : \ + (n) & (1ULL << 7) ? 7 : \ + (n) & (1ULL << 6) ? 6 : \ + (n) & (1ULL << 5) ? 5 : \ + (n) & (1ULL << 4) ? 4 : \ + (n) & (1ULL << 3) ? 3 : \ + (n) & (1ULL << 2) ? 2 : \ + 1) : \ + -1) + +/** + * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value + * @n: parameter + * + * constant-capable log of base 2 calculation + * - this can be used to initialise global variables from constant data, hence + * the massive ternary operator construction + * + * selects the appropriately-sized optimised version depending on sizeof(n) + */ +#define ilog2(n) \ +( \ + __builtin_constant_p(n) ? \ + const_ilog2(n) : \ + (sizeof(n) <= 4) ? \ + __ilog2_u32(n) : \ + __ilog2_u64(n) \ + ) + +/** + * roundup_pow_of_two - round the given value up to nearest power of two + * @n: parameter + * + * round the given value up to the nearest power of two + * - the result is undefined when n == 0 + * - this can be used to initialise global variables from constant data + */ +#define roundup_pow_of_two(n) \ +( \ + __builtin_constant_p(n) ? ( \ + (n == 1) ? 1 : \ + (1UL << (ilog2((n) - 1) + 1)) \ + ) : \ + __roundup_pow_of_two(n) \ + ) + +/** + * rounddown_pow_of_two - round the given value down to nearest power of two + * @n: parameter + * + * round the given value down to the nearest power of two + * - the result is undefined when n == 0 + * - this can be used to initialise global variables from constant data + */ +#define rounddown_pow_of_two(n) \ +( \ + __builtin_constant_p(n) ? ( \ + (1UL << ilog2(n))) : \ + __rounddown_pow_of_two(n) \ + ) + +static inline __attribute_const__ +int __order_base_2(unsigned long n) +{ + return n > 1 ? ilog2(n - 1) + 1 : 0; +} + +/** + * order_base_2 - calculate the (rounded up) base 2 order of the argument + * @n: parameter + * + * The first few values calculated by this routine: + * ob2(0) = 0 + * ob2(1) = 0 + * ob2(2) = 1 + * ob2(3) = 2 + * ob2(4) = 2 + * ob2(5) = 3 + * ... and so on. + */ +#define order_base_2(n) \ +( \ + __builtin_constant_p(n) ? ( \ + ((n) == 0 || (n) == 1) ? 0 : \ + ilog2((n) - 1) + 1) : \ + __order_base_2(n) \ +) + +#endif /* ifndef USERSPACE_LOG2_H */ + diff --git a/libwifiuserspace/kernel/mac80211.h b/libwifiuserspace/kernel/mac80211.h new file mode 100644 index 0000000..ced24a0 --- /dev/null +++ b/libwifiuserspace/kernel/mac80211.h @@ -0,0 +1,1391 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +/* + * mac80211 <-> driver interface + * + * Copyright 2002-2005, Devicescape Software, Inc. + * Copyright 2006-2007 Jiri Benc + * Copyright 2007-2010 Johannes Berg + * Copyright 2013-2014 Intel Mobile Communications GmbH + * Copyright (C) 2015 - 2017 Intel Deutschland GmbH + * Copyright (C) 2018 - 2019 Intel Corporation + */ + +/* + * Userspace port (C) 2019 Hak5 Inc + */ + +#ifndef __USERSPACE_MAC80211_H__ +#define __USERSPACE_MAC80211_H__ + +#include + +#include "bitops.h" +#include "bits.h" +#include "cfg80211.h" +#include "ieee80211.h" +#include "if_ether.h" +#include "kernel.h" +#include "nl80211.h" +#include "types.h" + +/** + * enum ieee80211_filter_flags - hardware filter flags + * + * These flags determine what the filter in hardware should be + * programmed to let through and what should not be passed to the + * stack. It is always safe to pass more frames than requested, + * but this has negative impact on power consumption. + * + * @FIF_ALLMULTI: pass all multicast frames, this is used if requested + * by the user or if the hardware is not capable of filtering by + * multicast address. + * + * @FIF_FCSFAIL: pass frames with failed FCS (but you need to set the + * %RX_FLAG_FAILED_FCS_CRC for them) + * + * @FIF_PLCPFAIL: pass frames with failed PLCP CRC (but you need to set + * the %RX_FLAG_FAILED_PLCP_CRC for them + * + * @FIF_BCN_PRBRESP_PROMISC: This flag is set during scanning to indicate + * to the hardware that it should not filter beacons or probe responses + * by BSSID. Filtering them can greatly reduce the amount of processing + * mac80211 needs to do and the amount of CPU wakeups, so you should + * honour this flag if possible. + * + * @FIF_CONTROL: pass control frames (except for PS Poll) addressed to this + * station + * + * @FIF_OTHER_BSS: pass frames destined to other BSSes + * + * @FIF_PSPOLL: pass PS Poll frames + * + * @FIF_PROBE_REQ: pass probe request frames + */ +enum ieee80211_filter_flags { + FIF_ALLMULTI = 1<<1, + FIF_FCSFAIL = 1<<2, + FIF_PLCPFAIL = 1<<3, + FIF_BCN_PRBRESP_PROMISC = 1<<4, + FIF_CONTROL = 1<<5, + FIF_OTHER_BSS = 1<<6, + FIF_PSPOLL = 1<<7, + FIF_PROBE_REQ = 1<<8, +}; + +/** + * struct ieee80211_key_conf - key information + * + * This key information is given by mac80211 to the driver by + * the set_key() callback in &struct ieee80211_ops. + * + * @hw_key_idx: To be set by the driver, this is the key index the driver + * wants to be given when a frame is transmitted and needs to be + * encrypted in hardware. + * @cipher: The key's cipher suite selector. + * @tx_pn: PN used for TX keys, may be used by the driver as well if it + * needs to do software PN assignment by itself (e.g. due to TSO) + * @flags: key flags, see &enum ieee80211_key_flags. + * @keyidx: the key index (0-3) + * @keylen: key material length + * @key: key material. For ALG_TKIP the key is encoded as a 256-bit (32 byte) + * data block: + * - Temporal Encryption Key (128 bits) + * - Temporal Authenticator Tx MIC Key (64 bits) + * - Temporal Authenticator Rx MIC Key (64 bits) + * @icv_len: The ICV length for this key type + * @iv_len: The IV length for this key type + */ +struct ieee80211_key_conf { + atomic64_t tx_pn; + u32 cipher; + u8 icv_len; + u8 iv_len; + u8 hw_key_idx; + s8 keyidx; + u16 flags; + u8 keylen; + u8 key[0]; +}; + +/** + * enum set_key_cmd - key command + * + * Used with the set_key() callback in &struct ieee80211_ops, this + * indicates whether a key is being removed or added. + * + * @SET_KEY: a key is set + * @DISABLE_KEY: a key must be disabled + */ +enum set_key_cmd { + SET_KEY, DISABLE_KEY, +}; + +/** + * enum ieee80211_smps_mode - spatial multiplexing power save mode + * + * @IEEE80211_SMPS_AUTOMATIC: automatic + * @IEEE80211_SMPS_OFF: off + * @IEEE80211_SMPS_STATIC: static + * @IEEE80211_SMPS_DYNAMIC: dynamic + * @IEEE80211_SMPS_NUM_MODES: internal, don't use + */ +enum ieee80211_smps_mode { + IEEE80211_SMPS_AUTOMATIC, + IEEE80211_SMPS_OFF, + IEEE80211_SMPS_STATIC, + IEEE80211_SMPS_DYNAMIC, + + /* keep last */ + IEEE80211_SMPS_NUM_MODES, +}; + + +/** + * struct ieee80211_conf - configuration of the device + * + * This struct indicates how the driver shall configure the hardware. + * + * @flags: configuration flags defined above + * + * @listen_interval: listen interval in units of beacon interval + * @ps_dtim_period: The DTIM period of the AP we're connected to, for use + * in power saving. Power saving will not be enabled until a beacon + * has been received and the DTIM period is known. + * @dynamic_ps_timeout: The dynamic powersave timeout (in ms), see the + * powersave documentation below. This variable is valid only when + * the CONF_PS flag is set. + * + * @power_level: requested transmit power (in dBm), backward compatibility + * value only that is set to the minimum of all interfaces + * + * @chandef: the channel definition to tune to + * @radar_enabled: whether radar detection is enabled + * + * @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame + * (a frame not RTS protected), called "dot11LongRetryLimit" in 802.11, + * but actually means the number of transmissions not the number of retries + * @short_frame_max_tx_count: Maximum number of transmissions for a "short" + * frame, called "dot11ShortRetryLimit" in 802.11, but actually means the + * number of transmissions not the number of retries + * + * @smps_mode: spatial multiplexing powersave mode; note that + * %IEEE80211_SMPS_STATIC is used when the device is not + * configured for an HT channel. + * Note that this is only valid if channel contexts are not used, + * otherwise each channel context has the number of chains listed. + */ +struct ieee80211_conf { + u32 flags; + int power_level, dynamic_ps_timeout; + + u16 listen_interval; + u8 ps_dtim_period; + + u8 long_frame_max_tx_count, short_frame_max_tx_count; + + struct cfg80211_chan_def chandef; + bool radar_enabled; + enum ieee80211_smps_mode smps_mode; +}; + +/** + * enum ieee80211_hw_flags - hardware flags + * + * These flags are used to indicate hardware capabilities to + * the stack. Generally, flags here should have their meaning + * done in a way that the simplest hardware doesn't need setting + * any particular flags. There are some exceptions to this rule, + * however, so you are advised to review these flags carefully. + * + * @IEEE80211_HW_HAS_RATE_CONTROL: + * The hardware or firmware includes rate control, and cannot be + * controlled by the stack. As such, no rate control algorithm + * should be instantiated, and the TX rate reported to userspace + * will be taken from the TX status instead of the rate control + * algorithm. + * Note that this requires that the driver implement a number of + * callbacks so it has the correct information, it needs to have + * the @set_rts_threshold callback and must look at the BSS config + * @use_cts_prot for G/N protection, @use_short_slot for slot + * timing in 2.4 GHz and @use_short_preamble for preambles for + * CCK frames. + * + * @IEEE80211_HW_RX_INCLUDES_FCS: + * Indicates that received frames passed to the stack include + * the FCS at the end. + * + * @IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING: + * Some wireless LAN chipsets buffer broadcast/multicast frames + * for power saving stations in the hardware/firmware and others + * rely on the host system for such buffering. This option is used + * to configure the IEEE 802.11 upper layer to buffer broadcast and + * multicast frames when there are power saving stations so that + * the driver can fetch them with ieee80211_get_buffered_bc(). + * + * @IEEE80211_HW_SIGNAL_UNSPEC: + * Hardware can provide signal values but we don't know its units. We + * expect values between 0 and @max_signal. + * If possible please provide dB or dBm instead. + * + * @IEEE80211_HW_SIGNAL_DBM: + * Hardware gives signal values in dBm, decibel difference from + * one milliwatt. This is the preferred method since it is standardized + * between different devices. @max_signal does not need to be set. + * + * @IEEE80211_HW_SPECTRUM_MGMT: + * Hardware supports spectrum management defined in 802.11h + * Measurement, Channel Switch, Quieting, TPC + * + * @IEEE80211_HW_AMPDU_AGGREGATION: + * Hardware supports 11n A-MPDU aggregation. + * + * @IEEE80211_HW_SUPPORTS_PS: + * Hardware has power save support (i.e. can go to sleep). + * + * @IEEE80211_HW_PS_NULLFUNC_STACK: + * Hardware requires nullfunc frame handling in stack, implies + * stack support for dynamic PS. + * + * @IEEE80211_HW_SUPPORTS_DYNAMIC_PS: + * Hardware has support for dynamic PS. + * + * @IEEE80211_HW_MFP_CAPABLE: + * Hardware supports management frame protection (MFP, IEEE 802.11w). + * + * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: + * Hardware can provide ack status reports of Tx frames to + * the stack. + * + * @IEEE80211_HW_CONNECTION_MONITOR: + * The hardware performs its own connection monitoring, including + * periodic keep-alives to the AP and probing the AP on beacon loss. + * + * @IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC: + * This device needs to get data from beacon before association (i.e. + * dtim_period). + * + * @IEEE80211_HW_SUPPORTS_PER_STA_GTK: The device's crypto engine supports + * per-station GTKs as used by IBSS RSN or during fast transition. If + * the device doesn't support per-station GTKs, but can be asked not + * to decrypt group addressed frames, then IBSS RSN support is still + * possible but software crypto will be used. Advertise the wiphy flag + * only in that case. + * + * @IEEE80211_HW_AP_LINK_PS: When operating in AP mode the device + * autonomously manages the PS status of connected stations. When + * this flag is set mac80211 will not trigger PS mode for connected + * stations based on the PM bit of incoming frames. + * Use ieee80211_start_ps()/ieee8021_end_ps() to manually configure + * the PS mode of connected stations. + * + * @IEEE80211_HW_TX_AMPDU_SETUP_IN_HW: The device handles TX A-MPDU session + * setup strictly in HW. mac80211 should not attempt to do this in + * software. + * + * @IEEE80211_HW_WANT_MONITOR_VIF: The driver would like to be informed of + * a virtual monitor interface when monitor interfaces are the only + * active interfaces. + * + * @IEEE80211_HW_NO_AUTO_VIF: The driver would like for no wlanX to + * be created. It is expected user-space will create vifs as + * desired (and thus have them named as desired). + * + * @IEEE80211_HW_SW_CRYPTO_CONTROL: The driver wants to control which of the + * crypto algorithms can be done in software - so don't automatically + * try to fall back to it if hardware crypto fails, but do so only if + * the driver returns 1. This also forces the driver to advertise its + * supported cipher suites. + * + * @IEEE80211_HW_SUPPORT_FAST_XMIT: The driver/hardware supports fast-xmit, + * this currently requires only the ability to calculate the duration + * for frames. + * + * @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface + * queue mapping in order to use different queues (not just one per AC) + * for different virtual interfaces. See the doc section on HW queue + * control for more details. + * + * @IEEE80211_HW_SUPPORTS_RC_TABLE: The driver supports using a rate + * selection table provided by the rate control algorithm. + * + * @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any + * P2P Interface. This will be honoured even if more than one interface + * is supported. + * + * @IEEE80211_HW_TIMING_BEACON_ONLY: Use sync timing from beacon frames + * only, to allow getting TBTT of a DTIM beacon. + * + * @IEEE80211_HW_SUPPORTS_HT_CCK_RATES: Hardware supports mixing HT/CCK rates + * and can cope with CCK rates in an aggregation session (e.g. by not + * using aggregation for such frames.) + * + * @IEEE80211_HW_CHANCTX_STA_CSA: Support 802.11h based channel-switch (CSA) + * for a single active channel while using channel contexts. When support + * is not enabled the default action is to disconnect when getting the + * CSA frame. + * + * @IEEE80211_HW_SUPPORTS_CLONED_SKBS: The driver will never modify the payload + * or tailroom of TX skbs without copying them first. + * + * @IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS: The HW supports scanning on all bands + * in one command, mac80211 doesn't have to run separate scans per band. + * + * @IEEE80211_HW_TDLS_WIDER_BW: The device/driver supports wider bandwidth + * than then BSS bandwidth for a TDLS link on the base channel. + * + * @IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU: The driver supports receiving A-MSDUs + * within A-MPDU. + * + * @IEEE80211_HW_BEACON_TX_STATUS: The device/driver provides TX status + * for sent beacons. + * + * @IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR: Hardware (or driver) requires that each + * station has a unique address, i.e. each station entry can be identified + * by just its MAC address; this prevents, for example, the same station + * from connecting to two virtual AP interfaces at the same time. + * + * @IEEE80211_HW_SUPPORTS_REORDERING_BUFFER: Hardware (or driver) manages the + * reordering buffer internally, guaranteeing mac80211 receives frames in + * order and does not need to manage its own reorder buffer or BA session + * timeout. + * + * @IEEE80211_HW_USES_RSS: The device uses RSS and thus requires parallel RX, + * which implies using per-CPU station statistics. + * + * @IEEE80211_HW_TX_AMSDU: Hardware (or driver) supports software aggregated + * A-MSDU frames. Requires software tx queueing and fast-xmit support. + * When not using minstrel/minstrel_ht rate control, the driver must + * limit the maximum A-MSDU size based on the current tx rate by setting + * max_rc_amsdu_len in struct ieee80211_sta. + * + * @IEEE80211_HW_TX_FRAG_LIST: Hardware (or driver) supports sending frag_list + * skbs, needed for zero-copy software A-MSDU. + * + * @IEEE80211_HW_REPORTS_LOW_ACK: The driver (or firmware) reports low ack event + * by ieee80211_report_low_ack() based on its own algorithm. For such + * drivers, mac80211 packet loss mechanism will not be triggered and driver + * is completely depending on firmware event for station kickout. + * + * @IEEE80211_HW_SUPPORTS_TX_FRAG: Hardware does fragmentation by itself. + * The stack will not do fragmentation. + * The callback for @set_frag_threshold should be set as well. + * + * @IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA: Hardware supports buffer STA on + * TDLS links. + * + * @IEEE80211_HW_DEAUTH_NEED_MGD_TX_PREP: The driver requires the + * mgd_prepare_tx() callback to be called before transmission of a + * deauthentication frame in case the association was completed but no + * beacon was heard. This is required in multi-channel scenarios, where the + * virtual interface might not be given air time for the transmission of + * the frame, as it is not synced with the AP/P2P GO yet, and thus the + * deauthentication frame might not be transmitted. + * + * @IEEE80211_HW_DOESNT_SUPPORT_QOS_NDP: The driver (or firmware) doesn't + * support QoS NDP for AP probing - that's most likely a driver bug. + * + * @IEEE80211_HW_BUFF_MMPDU_TXQ: use the TXQ for bufferable MMPDUs, this of + * course requires the driver to use TXQs to start with. + * + * @IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW: (Hardware) rate control supports VHT + * extended NSS BW (dot11VHTExtendedNSSBWCapable). This flag will be set if + * the selected rate control algorithm sets %RATE_CTRL_CAPA_VHT_EXT_NSS_BW + * but if the rate control is built-in then it must be set by the driver. + * See also the documentation for that flag. + * + * @IEEE80211_HW_STA_MMPDU_TXQ: use the extra non-TID per-station TXQ for all + * MMPDUs on station interfaces. This of course requires the driver to use + * TXQs to start with. + * + * @IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN: Driver does not report accurate A-MPDU + * length in tx status information + * + * @IEEE80211_HW_SUPPORTS_MULTI_BSSID: Hardware supports multi BSSID + * + * @IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID: Hardware supports multi BSSID + * only for HE APs. Applies if @IEEE80211_HW_SUPPORTS_MULTI_BSSID is set. + * + * @IEEE80211_HW_EXT_KEY_ID_NATIVE: Driver and hardware are supporting Extended + * Key ID and can handle two unicast keys per station for Rx and Tx. + * + * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays + */ +enum ieee80211_hw_flags { + IEEE80211_HW_HAS_RATE_CONTROL, + IEEE80211_HW_RX_INCLUDES_FCS, + IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING, + IEEE80211_HW_SIGNAL_UNSPEC, + IEEE80211_HW_SIGNAL_DBM, + IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC, + IEEE80211_HW_SPECTRUM_MGMT, + IEEE80211_HW_AMPDU_AGGREGATION, + IEEE80211_HW_SUPPORTS_PS, + IEEE80211_HW_PS_NULLFUNC_STACK, + IEEE80211_HW_SUPPORTS_DYNAMIC_PS, + IEEE80211_HW_MFP_CAPABLE, + IEEE80211_HW_WANT_MONITOR_VIF, + IEEE80211_HW_NO_AUTO_VIF, + IEEE80211_HW_SW_CRYPTO_CONTROL, + IEEE80211_HW_SUPPORT_FAST_XMIT, + IEEE80211_HW_REPORTS_TX_ACK_STATUS, + IEEE80211_HW_CONNECTION_MONITOR, + IEEE80211_HW_QUEUE_CONTROL, + IEEE80211_HW_SUPPORTS_PER_STA_GTK, + IEEE80211_HW_AP_LINK_PS, + IEEE80211_HW_TX_AMPDU_SETUP_IN_HW, + IEEE80211_HW_SUPPORTS_RC_TABLE, + IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF, + IEEE80211_HW_TIMING_BEACON_ONLY, + IEEE80211_HW_SUPPORTS_HT_CCK_RATES, + IEEE80211_HW_CHANCTX_STA_CSA, + IEEE80211_HW_SUPPORTS_CLONED_SKBS, + IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS, + IEEE80211_HW_TDLS_WIDER_BW, + IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU, + IEEE80211_HW_BEACON_TX_STATUS, + IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR, + IEEE80211_HW_SUPPORTS_REORDERING_BUFFER, + IEEE80211_HW_USES_RSS, + IEEE80211_HW_TX_AMSDU, + IEEE80211_HW_TX_FRAG_LIST, + IEEE80211_HW_REPORTS_LOW_ACK, + IEEE80211_HW_SUPPORTS_TX_FRAG, + IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA, + IEEE80211_HW_DEAUTH_NEED_MGD_TX_PREP, + IEEE80211_HW_DOESNT_SUPPORT_QOS_NDP, + IEEE80211_HW_BUFF_MMPDU_TXQ, + IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW, + IEEE80211_HW_STA_MMPDU_TXQ, + IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN, + IEEE80211_HW_SUPPORTS_MULTI_BSSID, + IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID, + IEEE80211_HW_EXT_KEY_ID_NATIVE, + + /* keep last, obviously */ + NUM_IEEE80211_HW_FLAGS +}; + +/** + * struct ieee80211_hw - hardware information and state + * + * This structure contains the configuration and hardware + * information for an 802.11 PHY. + * + * @wiphy: This points to the &struct wiphy allocated for this + * 802.11 PHY. You must fill in the @perm_addr and @dev + * members of this structure using SET_IEEE80211_DEV() + * and SET_IEEE80211_PERM_ADDR(). Additionally, all supported + * bands (with channels, bitrates) are registered here. + * + * @conf: &struct ieee80211_conf, device configuration, don't use. + * + * @priv: pointer to private area that was allocated for driver use + * along with this structure. + * + * @flags: hardware flags, see &enum ieee80211_hw_flags. + * + * @extra_tx_headroom: headroom to reserve in each transmit skb + * for use by the driver (e.g. for transmit headers.) + * + * @extra_beacon_tailroom: tailroom to reserve in each beacon tx skb. + * Can be used by drivers to add extra IEs. + * + * @max_signal: Maximum value for signal (rssi) in RX information, used + * only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB + * + * @max_listen_interval: max listen interval in units of beacon interval + * that HW supports + * + * @queues: number of available hardware transmit queues for + * data packets. WMM/QoS requires at least four, these + * queues need to have configurable access parameters. + * + * @rate_control_algorithm: rate control algorithm for this hardware. + * If unset (NULL), the default algorithm will be used. Must be + * set before calling ieee80211_register_hw(). + * + * @vif_data_size: size (in bytes) of the drv_priv data area + * within &struct ieee80211_vif. + * @sta_data_size: size (in bytes) of the drv_priv data area + * within &struct ieee80211_sta. + * @chanctx_data_size: size (in bytes) of the drv_priv data area + * within &struct ieee80211_chanctx_conf. + * @txq_data_size: size (in bytes) of the drv_priv data area + * within @struct ieee80211_txq. + * + * @max_rates: maximum number of alternate rate retry stages the hw + * can handle. + * @max_report_rates: maximum number of alternate rate retry stages + * the hw can report back. + * @max_rate_tries: maximum number of tries for each stage + * + * @max_rx_aggregation_subframes: maximum buffer size (number of + * sub-frames) to be used for A-MPDU block ack receiver + * aggregation. + * This is only relevant if the device has restrictions on the + * number of subframes, if it relies on mac80211 to do reordering + * it shouldn't be set. + * + * @max_tx_aggregation_subframes: maximum number of subframes in an + * aggregate an HT/HE device will transmit. In HT AddBA we'll + * advertise a constant value of 64 as some older APs crash if + * the window size is smaller (an example is LinkSys WRT120N + * with FW v1.0.07 build 002 Jun 18 2012). + * For AddBA to HE capable peers this value will be used. + * + * @max_tx_fragments: maximum number of tx buffers per (A)-MSDU, sum + * of 1 + skb_shinfo(skb)->nr_frags for each skb in the frag_list. + * + * @offchannel_tx_hw_queue: HW queue ID to use for offchannel TX + * (if %IEEE80211_HW_QUEUE_CONTROL is set) + * + * @radiotap_mcs_details: lists which MCS information can the HW + * reports, by default it is set to _MCS, _GI and _BW but doesn't + * include _FMT. Use %IEEE80211_RADIOTAP_MCS_HAVE_\* values, only + * adding _BW is supported today. + * + * @radiotap_vht_details: lists which VHT MCS information the HW reports, + * the default is _GI | _BANDWIDTH. + * Use the %IEEE80211_RADIOTAP_VHT_KNOWN_\* values. + * + * @radiotap_he: HE radiotap validity flags + * + * @radiotap_timestamp: Information for the radiotap timestamp field; if the + * @units_pos member is set to a non-negative value then the timestamp + * field will be added and populated from the &struct ieee80211_rx_status + * device_timestamp. + * @radiotap_timestamp.units_pos: Must be set to a combination of a + * IEEE80211_RADIOTAP_TIMESTAMP_UNIT_* and a + * IEEE80211_RADIOTAP_TIMESTAMP_SPOS_* value. + * @radiotap_timestamp.accuracy: If non-negative, fills the accuracy in the + * radiotap field and the accuracy known flag will be set. + * + * @netdev_features: netdev features to be set in each netdev created + * from this HW. Note that not all features are usable with mac80211, + * other features will be rejected during HW registration. + * + * @uapsd_queues: This bitmap is included in (re)association frame to indicate + * for each access category if it is uAPSD trigger-enabled and delivery- + * enabled. Use IEEE80211_WMM_IE_STA_QOSINFO_AC_* to set this bitmap. + * Each bit corresponds to different AC. Value '1' in specific bit means + * that corresponding AC is both trigger- and delivery-enabled. '0' means + * neither enabled. + * + * @uapsd_max_sp_len: maximum number of total buffered frames the WMM AP may + * deliver to a WMM STA during any Service Period triggered by the WMM STA. + * Use IEEE80211_WMM_IE_STA_QOSINFO_SP_* for correct values. + * + * @n_cipher_schemes: a size of an array of cipher schemes definitions. + * @cipher_schemes: a pointer to an array of cipher scheme definitions + * supported by HW. + * @max_nan_de_entries: maximum number of NAN DE functions supported by the + * device. + * + * @tx_sk_pacing_shift: Pacing shift to set on TCP sockets when frames from + * them are encountered. The default should typically not be changed, + * unless the driver has good reasons for needing more buffers. + * + * @weight_multiplier: Driver specific airtime weight multiplier used while + * refilling deficit of each TXQ. + */ +struct ieee80211_hw { + struct ieee80211_conf conf; + struct wiphy *wiphy; + const char *rate_control_algorithm; + void *priv; + unsigned long flags[BITS_TO_LONGS(NUM_IEEE80211_HW_FLAGS)]; + unsigned int extra_tx_headroom; + unsigned int extra_beacon_tailroom; + int vif_data_size; + int sta_data_size; + int chanctx_data_size; + int txq_data_size; + u16 queues; + u16 max_listen_interval; + s8 max_signal; + u8 max_rates; + u8 max_report_rates; + u8 max_rate_tries; + u16 max_rx_aggregation_subframes; + u16 max_tx_aggregation_subframes; + u8 max_tx_fragments; + u8 offchannel_tx_hw_queue; + u8 radiotap_mcs_details; + u16 radiotap_vht_details; + struct { + int units_pos; + s16 accuracy; + } radiotap_timestamp; + netdev_features_t netdev_features; + u8 uapsd_queues; + u8 uapsd_max_sp_len; + u8 n_cipher_schemes; + const struct ieee80211_cipher_scheme *cipher_schemes; + u8 max_nan_de_entries; + u8 tx_sk_pacing_shift; + u8 weight_multiplier; +}; + +/** + * enum ieee80211_bss_change - BSS change notification flags + * + * These flags are used with the bss_info_changed() callback + * to indicate which BSS parameter changed. + * + * @BSS_CHANGED_ASSOC: association status changed (associated/disassociated), + * also implies a change in the AID. + * @BSS_CHANGED_ERP_CTS_PROT: CTS protection changed + * @BSS_CHANGED_ERP_PREAMBLE: preamble changed + * @BSS_CHANGED_ERP_SLOT: slot timing changed + * @BSS_CHANGED_HT: 802.11n parameters changed + * @BSS_CHANGED_BASIC_RATES: Basic rateset changed + * @BSS_CHANGED_BEACON_INT: Beacon interval changed + * @BSS_CHANGED_BSSID: BSSID changed, for whatever + * reason (IBSS and managed mode) + * @BSS_CHANGED_BEACON: Beacon data changed, retrieve + * new beacon (beaconing modes) + * @BSS_CHANGED_BEACON_ENABLED: Beaconing should be + * enabled/disabled (beaconing modes) + * @BSS_CHANGED_CQM: Connection quality monitor config changed + * @BSS_CHANGED_IBSS: IBSS join status changed + * @BSS_CHANGED_ARP_FILTER: Hardware ARP filter address list or state changed. + * @BSS_CHANGED_QOS: QoS for this association was enabled/disabled. Note + * that it is only ever disabled for station mode. + * @BSS_CHANGED_IDLE: Idle changed for this BSS/interface. + * @BSS_CHANGED_SSID: SSID changed for this BSS (AP and IBSS mode) + * @BSS_CHANGED_AP_PROBE_RESP: Probe Response changed for this BSS (AP mode) + * @BSS_CHANGED_PS: PS changed for this BSS (STA mode) + * @BSS_CHANGED_TXPOWER: TX power setting changed for this interface + * @BSS_CHANGED_P2P_PS: P2P powersave settings (CTWindow, opportunistic PS) + * changed + * @BSS_CHANGED_BEACON_INFO: Data from the AP's beacon became available: + * currently dtim_period only is under consideration. + * @BSS_CHANGED_BANDWIDTH: The bandwidth used by this interface changed, + * note that this is only called when it changes after the channel + * context had been assigned. + * @BSS_CHANGED_OCB: OCB join status changed + * @BSS_CHANGED_MU_GROUPS: VHT MU-MIMO group id or user position changed + * @BSS_CHANGED_KEEP_ALIVE: keep alive options (idle period or protected + * keep alive) changed. + * @BSS_CHANGED_MCAST_RATE: Multicast Rate setting changed for this interface + * @BSS_CHANGED_FTM_RESPONDER: fime timing reasurement request responder + * functionality changed for this BSS (AP mode). + * + */ +enum ieee80211_bss_change { + BSS_CHANGED_ASSOC = 1<<0, + BSS_CHANGED_ERP_CTS_PROT = 1<<1, + BSS_CHANGED_ERP_PREAMBLE = 1<<2, + BSS_CHANGED_ERP_SLOT = 1<<3, + BSS_CHANGED_HT = 1<<4, + BSS_CHANGED_BASIC_RATES = 1<<5, + BSS_CHANGED_BEACON_INT = 1<<6, + BSS_CHANGED_BSSID = 1<<7, + BSS_CHANGED_BEACON = 1<<8, + BSS_CHANGED_BEACON_ENABLED = 1<<9, + BSS_CHANGED_CQM = 1<<10, + BSS_CHANGED_IBSS = 1<<11, + BSS_CHANGED_ARP_FILTER = 1<<12, + BSS_CHANGED_QOS = 1<<13, + BSS_CHANGED_IDLE = 1<<14, + BSS_CHANGED_SSID = 1<<15, + BSS_CHANGED_AP_PROBE_RESP = 1<<16, + BSS_CHANGED_PS = 1<<17, + BSS_CHANGED_TXPOWER = 1<<18, + BSS_CHANGED_P2P_PS = 1<<19, + BSS_CHANGED_BEACON_INFO = 1<<20, + BSS_CHANGED_BANDWIDTH = 1<<21, + BSS_CHANGED_OCB = 1<<22, + BSS_CHANGED_MU_GROUPS = 1<<23, + BSS_CHANGED_KEEP_ALIVE = 1<<24, + BSS_CHANGED_MCAST_RATE = 1<<25, + BSS_CHANGED_FTM_RESPONDER = 1<<26, + + /* when adding here, make sure to change ieee80211_reconfig */ +}; + +/* + * The maximum number of IPv4 addresses listed for ARP filtering. If the number + * of addresses for an interface increase beyond this value, hardware ARP + * filtering will be disabled. + */ +#define IEEE80211_BSS_ARP_ADDR_LIST_LEN 4 + +/** + * struct ieee80211_mu_group_data - STA's VHT MU-MIMO group data + * + * This structure describes the group id data of VHT MU-MIMO + * + * @membership: 64 bits array - a bit is set if station is member of the group + * @position: 2 bits per group id indicating the position in the group + */ +struct ieee80211_mu_group_data { + u8 membership[WLAN_MEMBERSHIP_LEN]; + u8 position[WLAN_USER_POSITION_LEN]; +}; + +/** + * struct ieee80211_bss_conf - holds the BSS's changing parameters + * + * This structure keeps information about a BSS (and an association + * to that BSS) that can change during the lifetime of the BSS. + * + * @bss_color: 6-bit value to mark inter-BSS frame, if BSS supports HE + * @htc_trig_based_pkt_ext: default PE in 4us units, if BSS supports HE + * @multi_sta_back_32bit: supports BA bitmap of 32-bits in Multi-STA BACK + * @uora_exists: is the UORA element advertised by AP + * @ack_enabled: indicates support to receive a multi-TID that solicits either + * ACK, BACK or both + * @uora_ocw_range: UORA element's OCW Range field + * @frame_time_rts_th: HE duration RTS threshold, in units of 32us + * @he_support: does this BSS support HE + * @twt_requester: does this BSS support TWT requester (relevant for managed + * mode only, set if the AP advertises TWT responder role) + * @assoc: association status + * @ibss_joined: indicates whether this station is part of an IBSS + * or not + * @ibss_creator: indicates if a new IBSS network is being created + * @aid: association ID number, valid only when @assoc is true + * @use_cts_prot: use CTS protection + * @use_short_preamble: use 802.11b short preamble + * @use_short_slot: use short slot time (only relevant for ERP) + * @dtim_period: num of beacons before the next DTIM, for beaconing, + * valid in station mode only if after the driver was notified + * with the %BSS_CHANGED_BEACON_INFO flag, will be non-zero then. + * @sync_tsf: last beacon's/probe response's TSF timestamp (could be old + * as it may have been received during scanning long ago). If the + * HW flag %IEEE80211_HW_TIMING_BEACON_ONLY is set, then this can + * only come from a beacon, but might not become valid until after + * association when a beacon is received (which is notified with the + * %BSS_CHANGED_DTIM flag.). See also sync_dtim_count important notice. + * @sync_device_ts: the device timestamp corresponding to the sync_tsf, + * the driver/device can use this to calculate synchronisation + * (see @sync_tsf). See also sync_dtim_count important notice. + * @sync_dtim_count: Only valid when %IEEE80211_HW_TIMING_BEACON_ONLY + * is requested, see @sync_tsf/@sync_device_ts. + * IMPORTANT: These three sync_* parameters would possibly be out of sync + * by the time the driver will use them. The synchronized view is currently + * guaranteed only in certain callbacks. + * @beacon_int: beacon interval + * @assoc_capability: capabilities taken from assoc resp + * @basic_rates: bitmap of basic rates, each bit stands for an + * index into the rate table configured by the driver in + * the current band. + * @beacon_rate: associated AP's beacon TX rate + * @mcast_rate: per-band multicast rate index + 1 (0: disabled) + * @bssid: The BSSID for this BSS + * @enable_beacon: whether beaconing should be enabled or not + * @chandef: Channel definition for this BSS -- the hardware might be + * configured a higher bandwidth than this BSS uses, for example. + * @mu_group: VHT MU-MIMO group membership data + * @ht_operation_mode: HT operation mode like in &struct ieee80211_ht_operation. + * This field is only valid when the channel is a wide HT/VHT channel. + * Note that with TDLS this can be the case (channel is HT, protection must + * be used from this field) even when the BSS association isn't using HT. + * @cqm_rssi_thold: Connection quality monitor RSSI threshold, a zero value + * implies disabled. As with the cfg80211 callback, a change here should + * cause an event to be sent indicating where the current value is in + * relation to the newly configured threshold. + * @cqm_rssi_low: Connection quality monitor RSSI lower threshold, a zero value + * implies disabled. This is an alternative mechanism to the single + * threshold event and can't be enabled simultaneously with it. + * @cqm_rssi_high: Connection quality monitor RSSI upper threshold. + * @cqm_rssi_hyst: Connection quality monitor RSSI hysteresis + * @arp_addr_list: List of IPv4 addresses for hardware ARP filtering. The + * may filter ARP queries targeted for other addresses than listed here. + * The driver must allow ARP queries targeted for all address listed here + * to pass through. An empty list implies no ARP queries need to pass. + * @arp_addr_cnt: Number of addresses currently on the list. Note that this + * may be larger than %IEEE80211_BSS_ARP_ADDR_LIST_LEN (the arp_addr_list + * array size), it's up to the driver what to do in that case. + * @qos: This is a QoS-enabled BSS. + * @idle: This interface is idle. There's also a global idle flag in the + * hardware config which may be more appropriate depending on what + * your driver/device needs to do. + * @ps: power-save mode (STA only). This flag is NOT affected by + * offchannel/dynamic_ps operations. + * @ssid: The SSID of the current vif. Valid in AP and IBSS mode. + * @ssid_len: Length of SSID given in @ssid. + * @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode. + * @txpower: TX power in dBm + * @txpower_type: TX power adjustment used to control per packet Transmit + * Power Control (TPC) in lower driver for the current vif. In particular + * TPC is enabled if value passed in %txpower_type is + * NL80211_TX_POWER_LIMITED (allow using less than specified from + * userspace), whereas TPC is disabled if %txpower_type is set to + * NL80211_TX_POWER_FIXED (use value configured from userspace) + * @p2p_noa_attr: P2P NoA attribute for P2P powersave + * @allow_p2p_go_ps: indication for AP or P2P GO interface, whether it's allowed + * to use P2P PS mechanism or not. AP/P2P GO is not allowed to use P2P PS + * if it has associated clients without P2P PS support. + * @max_idle_period: the time period during which the station can refrain from + * transmitting frames to its associated AP without being disassociated. + * In units of 1000 TUs. Zero value indicates that the AP did not include + * a (valid) BSS Max Idle Period Element. + * @protected_keep_alive: if set, indicates that the station should send an RSN + * protected frame to the AP to reset the idle timer at the AP for the + * station. + * @ftm_responder: whether to enable or disable fine timing measurement FTM + * responder functionality. + * @ftmr_params: configurable lci/civic parameter when enabling FTM responder. + * @nontransmitted: this BSS is a nontransmitted BSS profile + * @transmitter_bssid: the address of transmitter AP + * @bssid_index: index inside the multiple BSSID set + * @bssid_indicator: 2^bssid_indicator is the maximum number of APs in set + * @ema_ap: AP supports enhancements of discovery and advertisement of + * nontransmitted BSSIDs + * @profile_periodicity: the least number of beacon frames need to be received + * in order to discover all the nontransmitted BSSIDs in the set. + */ +struct ieee80211_bss_conf { + const u8 *bssid; + u8 bss_color; + u8 htc_trig_based_pkt_ext; + bool multi_sta_back_32bit; + bool uora_exists; + bool ack_enabled; + u8 uora_ocw_range; + u16 frame_time_rts_th; + bool he_support; + bool twt_requester; + /* association related data */ + bool assoc, ibss_joined; + bool ibss_creator; + u16 aid; + /* erp related data */ + bool use_cts_prot; + bool use_short_preamble; + bool use_short_slot; + bool enable_beacon; + u8 dtim_period; + u16 beacon_int; + u16 assoc_capability; + u64 sync_tsf; + u32 sync_device_ts; + u8 sync_dtim_count; + u32 basic_rates; + struct ieee80211_rate *beacon_rate; + int mcast_rate[NUM_NL80211_BANDS]; + u16 ht_operation_mode; + s32 cqm_rssi_thold; + u32 cqm_rssi_hyst; + s32 cqm_rssi_low; + s32 cqm_rssi_high; + struct cfg80211_chan_def chandef; + struct ieee80211_mu_group_data mu_group; + __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; + int arp_addr_cnt; + bool qos; + bool idle; + bool ps; + u8 ssid[IEEE80211_MAX_SSID_LEN]; + size_t ssid_len; + bool hidden_ssid; + int txpower; + enum nl80211_tx_power_setting txpower_type; + struct ieee80211_p2p_noa_attr p2p_noa_attr; + bool allow_p2p_go_ps; + u16 max_idle_period; + bool protected_keep_alive; + bool ftm_responder; + struct ieee80211_ftm_responder_params *ftmr_params; + /* Multiple BSSID data */ + bool nontransmitted; + u8 transmitter_bssid[ETH_ALEN]; + u8 bssid_index; + u8 bssid_indicator; + bool ema_ap; + u8 profile_periodicity; +}; + +/** + * struct ieee80211_chanctx_conf - channel context that vifs may be tuned to + * + * This is the driver-visible part. The ieee80211_chanctx + * that contains it is visible in mac80211 only. + * + * @def: the channel definition + * @min_def: the minimum channel definition currently required. + * @rx_chains_static: The number of RX chains that must always be + * active on the channel to receive MIMO transmissions + * @rx_chains_dynamic: The number of RX chains that must be enabled + * after RTS/CTS handshake to receive SMPS MIMO transmissions; + * this will always be >= @rx_chains_static. + * @radar_enabled: whether radar detection is enabled on this channel. + * @drv_priv: data area for driver use, will always be aligned to + * sizeof(void *), size is determined in hw information. + */ +struct ieee80211_chanctx_conf { + struct cfg80211_chan_def def; + struct cfg80211_chan_def min_def; + + u8 rx_chains_static, rx_chains_dynamic; + + bool radar_enabled; + + u8 drv_priv[0] __aligned(sizeof(void *)); +}; + +/** + * enum ieee80211_vif_flags - virtual interface flags + * + * @IEEE80211_VIF_BEACON_FILTER: the device performs beacon filtering + * on this virtual interface to avoid unnecessary CPU wakeups + * @IEEE80211_VIF_SUPPORTS_CQM_RSSI: the device can do connection quality + * monitoring on this virtual interface -- i.e. it can monitor + * connection quality related parameters, such as the RSSI level and + * provide notifications if configured trigger levels are reached. + * @IEEE80211_VIF_SUPPORTS_UAPSD: The device can do U-APSD for this + * interface. This flag should be set during interface addition, + * but may be set/cleared as late as authentication to an AP. It is + * only valid for managed/station mode interfaces. + * @IEEE80211_VIF_GET_NOA_UPDATE: request to handle NOA attributes + * and send P2P_PS notification to the driver if NOA changed, even + * this is not pure P2P vif. + */ +enum ieee80211_vif_flags { + IEEE80211_VIF_BEACON_FILTER = BIT(0), + IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1), + IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2), + IEEE80211_VIF_GET_NOA_UPDATE = BIT(3), +}; + +/** + * struct ieee80211_vif - per-interface data + * + * Data in this structure is continually present for driver + * use during the life of a virtual interface. + * + * @type: type of this virtual interface + * @bss_conf: BSS configuration for this interface, either our own + * or the BSS we're associated to + * @addr: address of this interface + * @p2p: indicates whether this AP or STA interface is a p2p + * interface, i.e. a GO or p2p-sta respectively + * @csa_active: marks whether a channel switch is going on. Internally it is + * write-protected by sdata_lock and local->mtx so holding either is fine + * for read access. + * @mu_mimo_owner: indicates interface owns MU-MIMO capability + * @driver_flags: flags/capabilities the driver has for this interface, + * these need to be set (or cleared) when the interface is added + * or, if supported by the driver, the interface type is changed + * at runtime, mac80211 will never touch this field + * @hw_queue: hardware queue for each AC + * @cab_queue: content-after-beacon (DTIM beacon really) queue, AP mode only + * @chanctx_conf: The channel context this interface is assigned to, or %NULL + * when it is not assigned. This pointer is RCU-protected due to the TX + * path needing to access it; even though the netdev carrier will always + * be off when it is %NULL there can still be races and packets could be + * processed after it switches back to %NULL. + * @debugfs_dir: debugfs dentry, can be used by drivers to create own per + * interface debug files. Note that it will be NULL for the virtual + * monitor interface (if that is requested.) + * @probe_req_reg: probe requests should be reported to mac80211 for this + * interface. + * @drv_priv: data area for driver use, will always be aligned to + * sizeof(void \*). + * @txq: the multicast data TX queue (if driver uses the TXQ abstraction) + * @txqs_stopped: per AC flag to indicate that intermediate TXQs are stopped, + * protected by fq->lock. + */ +struct ieee80211_vif { + enum nl80211_iftype type; + struct ieee80211_bss_conf bss_conf; + u8 addr[ETH_ALEN] __aligned(2); + bool p2p; + bool csa_active; + bool mu_mimo_owner; + + u8 cab_queue; + u8 hw_queue[IEEE80211_NUM_ACS]; + + struct ieee80211_txq *txq; + + struct ieee80211_chanctx_conf __rcu *chanctx_conf; + + u32 driver_flags; + +#ifdef CONFIG_MAC80211_DEBUGFS + struct dentry *debugfs_dir; +#endif + + unsigned int probe_req_reg; + + bool txqs_stopped[IEEE80211_NUM_ACS]; + + /* must be last */ + u8 drv_priv[0] __aligned(sizeof(void *)); +}; + +/** + * enum ieee80211_sta_state - station state + * + * @IEEE80211_STA_NOTEXIST: station doesn't exist at all, + * this is a special state for add/remove transitions + * @IEEE80211_STA_NONE: station exists without special state + * @IEEE80211_STA_AUTH: station is authenticated + * @IEEE80211_STA_ASSOC: station is associated + * @IEEE80211_STA_AUTHORIZED: station is authorized (802.1X) + */ +enum ieee80211_sta_state { + /* NOTE: These need to be ordered correctly! */ + IEEE80211_STA_NOTEXIST, + IEEE80211_STA_NONE, + IEEE80211_STA_AUTH, + IEEE80211_STA_ASSOC, + IEEE80211_STA_AUTHORIZED, +}; + +/** + * enum ieee80211_sta_rx_bandwidth - station RX bandwidth + * @IEEE80211_STA_RX_BW_20: station can only receive 20 MHz + * @IEEE80211_STA_RX_BW_40: station can receive up to 40 MHz + * @IEEE80211_STA_RX_BW_80: station can receive up to 80 MHz + * @IEEE80211_STA_RX_BW_160: station can receive up to 160 MHz + * (including 80+80 MHz) + * + * Implementation note: 20 must be zero to be initialized + * correctly, the values must be sorted. + */ +enum ieee80211_sta_rx_bandwidth { + IEEE80211_STA_RX_BW_20 = 0, + IEEE80211_STA_RX_BW_40, + IEEE80211_STA_RX_BW_80, + IEEE80211_STA_RX_BW_160, +}; + +/* there are 40 bytes if you don't need the rateset to be kept */ +#define IEEE80211_TX_INFO_DRIVER_DATA_SIZE 40 + +/* if you do need the rateset, then you have less space */ +#define IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE 24 + +/* maximum number of rate stages */ +#define IEEE80211_TX_MAX_RATES 4 + +/* maximum number of rate table entries */ +#define IEEE80211_TX_RATE_TABLE_SIZE 4 + +/* + * We shouldn't need this in userspace + */ +struct rcu_head { + /* MSVC doesn't like empty structs, so give it some junk here */ + u8 junk; +}; + +/** + * struct ieee80211_sta_rates - station rate selection table + * + * @rcu_head: RCU head used for freeing the table on update + * @rate: transmit rates/flags to be used by default. + * Overriding entries per-packet is possible by using cb tx control. + */ +struct ieee80211_sta_rates { + struct rcu_head rcu_head; + struct { + s8 idx; + u8 count; + u8 count_cts; + u8 count_rts; + u16 flags; + } rate[IEEE80211_TX_RATE_TABLE_SIZE]; +}; + +/** + * struct ieee80211_sta_txpwr - station txpower configuration + * + * Used to configure txpower for station. + * + * @power: indicates the tx power, in dBm, to be used when sending data frames + * to the STA. + * @type: In particular if TPC %type is NL80211_TX_POWER_LIMITED then tx power + * will be less than or equal to specified from userspace, whereas if TPC + * %type is NL80211_TX_POWER_AUTOMATIC then it indicates default tx power. + * NL80211_TX_POWER_FIXED is not a valid configuration option for + * per peer TPC. + */ +struct ieee80211_sta_txpwr { + s16 power; + enum nl80211_tx_power_setting type; +}; + +/** + * struct ieee80211_sta - station table entry + * + * A station table entry represents a station we are possibly + * communicating with. Since stations are RCU-managed in + * mac80211, any ieee80211_sta pointer you get access to must + * either be protected by rcu_read_lock() explicitly or implicitly, + * or you must take good care to not use such a pointer after a + * call to your sta_remove callback that removed it. + * + * @addr: MAC address + * @aid: AID we assigned to the station if we're an AP + * @supp_rates: Bitmap of supported rates (per band) + * @ht_cap: HT capabilities of this STA; restricted to our own capabilities + * @vht_cap: VHT capabilities of this STA; restricted to our own capabilities + * @he_cap: HE capabilities of this STA + * @max_rx_aggregation_subframes: maximal amount of frames in a single AMPDU + * that this station is allowed to transmit to us. + * Can be modified by driver. + * @wme: indicates whether the STA supports QoS/WME (if local devices does, + * otherwise always false) + * @drv_priv: data area for driver use, will always be aligned to + * sizeof(void \*), size is determined in hw information. + * @uapsd_queues: bitmap of queues configured for uapsd. Only valid + * if wme is supported. The bits order is like in + * IEEE80211_WMM_IE_STA_QOSINFO_AC_*. + * @max_sp: max Service Period. Only valid if wme is supported. + * @bandwidth: current bandwidth the station can receive with + * @rx_nss: in HT/VHT, the maximum number of spatial streams the + * station can receive at the moment, changed by operating mode + * notifications and capabilities. The value is only valid after + * the station moves to associated state. + * @smps_mode: current SMPS mode (off, static or dynamic) + * @rates: rate control selection table + * @tdls: indicates whether the STA is a TDLS peer + * @tdls_initiator: indicates the STA is an initiator of the TDLS link. Only + * valid if the STA is a TDLS peer in the first place. + * @mfp: indicates whether the STA uses management frame protection or not. + * @max_amsdu_subframes: indicates the maximal number of MSDUs in a single + * A-MSDU. Taken from the Extended Capabilities element. 0 means + * unlimited. + * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not. + * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control. + * @max_tid_amsdu_len: Maximum A-MSDU size in bytes for this TID + * @txq: per-TID data TX queues (if driver uses the TXQ abstraction); note that + * the last entry (%IEEE80211_NUM_TIDS) is used for non-data frames + */ +struct ieee80211_sta { + u32 supp_rates[NUM_NL80211_BANDS]; + u8 addr[ETH_ALEN]; + u16 aid; + struct ieee80211_sta_ht_cap ht_cap; + struct ieee80211_sta_vht_cap vht_cap; + struct ieee80211_sta_he_cap he_cap; + u16 max_rx_aggregation_subframes; + bool wme; + u8 uapsd_queues; + u8 max_sp; + u8 rx_nss; + enum ieee80211_sta_rx_bandwidth bandwidth; + enum ieee80211_smps_mode smps_mode; + struct ieee80211_sta_rates __rcu *rates; + bool tdls; + bool tdls_initiator; + bool mfp; + u8 max_amsdu_subframes; + + /** + * @max_amsdu_len: + * indicates the maximal length of an A-MSDU in bytes. + * This field is always valid for packets with a VHT preamble. + * For packets with a HT preamble, additional limits apply: + * + * * If the skb is transmitted as part of a BA agreement, the + * A-MSDU maximal size is min(max_amsdu_len, 4065) bytes. + * * If the skb is not part of a BA aggreement, the A-MSDU maximal + * size is min(max_amsdu_len, 7935) bytes. + * + * Both additional HT limits must be enforced by the low level + * driver. This is defined by the spec (IEEE 802.11-2012 section + * 8.3.2.2 NOTE 2). + */ + u16 max_amsdu_len; + bool support_p2p_ps; + u16 max_rc_amsdu_len; + u16 max_tid_amsdu_len[IEEE80211_NUM_TIDS]; + struct ieee80211_sta_txpwr txpwr; + + struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; + + /* must be last */ + u8 drv_priv[0] __aligned(sizeof(void *)); +}; + +static inline bool +conf_is_ht20(struct ieee80211_conf *conf) +{ + return conf->chandef.width == NL80211_CHAN_WIDTH_20; +} + +static inline bool +conf_is_ht40_minus(struct ieee80211_conf *conf) +{ + return conf->chandef.width == NL80211_CHAN_WIDTH_40 && + conf->chandef.center_freq1 < conf->chandef.chan->center_freq; +} + +static inline bool +conf_is_ht40_plus(struct ieee80211_conf *conf) +{ + return conf->chandef.width == NL80211_CHAN_WIDTH_40 && + conf->chandef.center_freq1 > conf->chandef.chan->center_freq; +} + +static inline bool +conf_is_ht40(struct ieee80211_conf *conf) +{ + return conf->chandef.width == NL80211_CHAN_WIDTH_40; +} + +static inline bool +conf_is_ht(struct ieee80211_conf *conf) +{ + return (conf->chandef.width != NL80211_CHAN_WIDTH_5) && + (conf->chandef.width != NL80211_CHAN_WIDTH_10) && + (conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT); +} + +/** + * enum mac80211_rx_encoding_flags - MCS & bandwidth flags + * + * @RX_ENC_FLAG_SHORTPRE: Short preamble was used for this frame + * @RX_ENC_FLAG_SHORT_GI: Short guard interval was used + * @RX_ENC_FLAG_HT_GF: This frame was received in a HT-greenfield transmission, + * if the driver fills this value it should add + * %IEEE80211_RADIOTAP_MCS_HAVE_FMT + * to @hw.radiotap_mcs_details to advertise that fact. + * @RX_ENC_FLAG_LDPC: LDPC was used + * @RX_ENC_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 + * @RX_ENC_FLAG_BF: packet was beamformed + */ +enum mac80211_rx_encoding_flags { + RX_ENC_FLAG_SHORTPRE = BIT(0), + RX_ENC_FLAG_SHORT_GI = BIT(2), + RX_ENC_FLAG_HT_GF = BIT(3), + RX_ENC_FLAG_STBC_MASK = BIT(4) | BIT(5), + RX_ENC_FLAG_LDPC = BIT(6), + RX_ENC_FLAG_BF = BIT(7), +}; + +#define RX_ENC_FLAG_STBC_SHIFT 4 + +enum mac80211_rx_encoding { + RX_ENC_LEGACY = 0, + RX_ENC_HT, + RX_ENC_VHT, + RX_ENC_HE, +}; + +/** + * struct ieee80211_rx_status - receive status + * + * The low-level driver should provide this information (the subset + * supported by hardware) to the 802.11 code with each received + * frame, in the skb's control buffer (cb). + * + * @mactime: value in microseconds of the 64-bit Time Synchronization Function + * (TSF) timer when the first data symbol (MPDU) arrived at the hardware. + * @boottime_ns: CLOCK_BOOTTIME timestamp the frame was received at, this is + * needed only for beacons and probe responses that update the scan cache. + * @device_timestamp: arbitrary timestamp for the device, mac80211 doesn't use + * it but can store it and pass it back to the driver for synchronisation + * @band: the active band when this frame was received + * @freq: frequency the radio was tuned to when receiving this frame, in MHz + * This field must be set for management frames, but isn't strictly needed + * for data (other) frames - for those it only affects radiotap reporting. + * @signal: signal strength when receiving this frame, either in dBm, in dB or + * unspecified depending on the hardware capabilities flags + * @IEEE80211_HW_SIGNAL_* + * @chains: bitmask of receive chains for which separate signal strength + * values were filled. + * @chain_signal: per-chain signal strength, in dBm (unlike @signal, doesn't + * support dB or unspecified units) + * @antenna: antenna used + * @rate_idx: index of data rate into band's supported rates or MCS index if + * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT) + * @nss: number of streams (VHT and HE only) + * @flag: %RX_FLAG_\* + * @encoding: &enum mac80211_rx_encoding + * @bw: &enum rate_info_bw + * @enc_flags: uses bits from &enum mac80211_rx_encoding_flags + * @he_ru: HE RU, from &enum nl80211_he_ru_alloc + * @he_gi: HE GI, from &enum nl80211_he_gi + * @he_dcm: HE DCM value + * @rx_flags: internal RX flags for mac80211 + * @ampdu_reference: A-MPDU reference number, must be a different value for + * each A-MPDU but the same for each subframe within one A-MPDU + * @ampdu_delimiter_crc: A-MPDU delimiter CRC + * @zero_length_psdu_type: radiotap type of the 0-length PSDU + */ +struct ieee80211_rx_status { + u64 mactime; + u64 boottime_ns; + u32 device_timestamp; + u32 ampdu_reference; + u32 flag; + u16 freq; + u8 enc_flags; + u8 encoding:2, bw:3, he_ru:3; + u8 he_gi:2, he_dcm:1; + u8 rate_idx; + u8 nss; + u8 rx_flags; + u8 band; + u8 antenna; + s8 signal; + u8 chains; + s8 chain_signal[IEEE80211_MAX_CHAINS]; + u8 ampdu_delimiter_crc; + u8 zero_length_psdu_type; +}; + +/** + * enum ieee80211_conf_flags - configuration flags + * + * Flags to define PHY configuration options + * + * @IEEE80211_CONF_MONITOR: there's a monitor interface present -- use this + * to determine for example whether to calculate timestamps for packets + * or not, do not use instead of filter flags! + * @IEEE80211_CONF_PS: Enable 802.11 power save mode (managed mode only). + * This is the power save mode defined by IEEE 802.11-2007 section 11.2, + * meaning that the hardware still wakes up for beacons, is able to + * transmit frames and receive the possible acknowledgment frames. + * Not to be confused with hardware specific wakeup/sleep states, + * driver is responsible for that. See the section "Powersave support" + * for more. + * @IEEE80211_CONF_IDLE: The device is running, but idle; if the flag is set + * the driver should be prepared to handle configuration requests but + * may turn the device off as much as possible. Typically, this flag will + * be set when an interface is set UP but not associated or scanning, but + * it can also be unset in that case when monitor interfaces are active. + * @IEEE80211_CONF_OFFCHANNEL: The device is currently not on its main + * operating channel. + */ +enum ieee80211_conf_flags { + IEEE80211_CONF_MONITOR = (1<<0), + IEEE80211_CONF_PS = (1<<1), + IEEE80211_CONF_IDLE = (1<<2), + IEEE80211_CONF_OFFCHANNEL = (1<<3), +}; + +/** + * enum ieee80211_conf_changed - denotes which configuration changed + * + * @IEEE80211_CONF_CHANGE_LISTEN_INTERVAL: the listen interval changed + * @IEEE80211_CONF_CHANGE_MONITOR: the monitor flag changed + * @IEEE80211_CONF_CHANGE_PS: the PS flag or dynamic PS timeout changed + * @IEEE80211_CONF_CHANGE_POWER: the TX power changed + * @IEEE80211_CONF_CHANGE_CHANNEL: the channel/channel_type changed + * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed + * @IEEE80211_CONF_CHANGE_IDLE: Idle flag changed + * @IEEE80211_CONF_CHANGE_SMPS: Spatial multiplexing powersave mode changed + * Note that this is only valid if channel contexts are not used, + * otherwise each channel context has the number of chains listed. + */ +enum ieee80211_conf_changed { + IEEE80211_CONF_CHANGE_SMPS = BIT(1), + IEEE80211_CONF_CHANGE_LISTEN_INTERVAL = BIT(2), + IEEE80211_CONF_CHANGE_MONITOR = BIT(3), + IEEE80211_CONF_CHANGE_PS = BIT(4), + IEEE80211_CONF_CHANGE_POWER = BIT(5), + IEEE80211_CONF_CHANGE_CHANNEL = BIT(6), + IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7), + IEEE80211_CONF_CHANGE_IDLE = BIT(8), +}; + +#endif /* ifndef USERSPACE_MAC80211_H */ diff --git a/libwifiuserspace/kernel/nl80211.h b/libwifiuserspace/kernel/nl80211.h new file mode 100644 index 0000000..e313bb7 --- /dev/null +++ b/libwifiuserspace/kernel/nl80211.h @@ -0,0 +1,182 @@ +/* + * 802.11 netlink interface public header + * + * Copyright 2006-2010 Johannes Berg + * Copyright 2008 Michael Wu + * Copyright 2008 Luis Carlos Cobo + * Copyright 2008 Michael Buesch + * Copyright 2008, 2009 Luis R. Rodriguez + * Copyright 2008 Jouni Malinen + * Copyright 2008 Colin McCabe + * Copyright 2015-2017 Intel Deutschland GmbH + * Copyright (C) 2018-2019 Intel Corporation + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +#ifndef __USERSPACE_NL80211_H__ +#define __USERSPACE_NL80211_H__ + +#include "kernel.h" +#include "types.h" + +/** + * enum nl80211_chan_width - channel width definitions + * + * These values are used with the %NL80211_ATTR_CHANNEL_WIDTH + * attribute. + * + * @NL80211_CHAN_WIDTH_20_NOHT: 20 MHz, non-HT channel + * @NL80211_CHAN_WIDTH_20: 20 MHz HT channel + * @NL80211_CHAN_WIDTH_40: 40 MHz channel, the %NL80211_ATTR_CENTER_FREQ1 + * attribute must be provided as well + * @NL80211_CHAN_WIDTH_80: 80 MHz channel, the %NL80211_ATTR_CENTER_FREQ1 + * attribute must be provided as well + * @NL80211_CHAN_WIDTH_80P80: 80+80 MHz channel, the %NL80211_ATTR_CENTER_FREQ1 + * and %NL80211_ATTR_CENTER_FREQ2 attributes must be provided as well + * @NL80211_CHAN_WIDTH_160: 160 MHz channel, the %NL80211_ATTR_CENTER_FREQ1 + * attribute must be provided as well + * @NL80211_CHAN_WIDTH_5: 5 MHz OFDM channel + * @NL80211_CHAN_WIDTH_10: 10 MHz OFDM channel + */ +enum nl80211_chan_width { + NL80211_CHAN_WIDTH_20_NOHT, + NL80211_CHAN_WIDTH_20, + NL80211_CHAN_WIDTH_40, + NL80211_CHAN_WIDTH_80, + NL80211_CHAN_WIDTH_80P80, + NL80211_CHAN_WIDTH_160, + NL80211_CHAN_WIDTH_5, + NL80211_CHAN_WIDTH_10, +}; + +/** + * enum nl80211_band - Frequency band + * @NL80211_BAND_2GHZ: 2.4 GHz ISM band + * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz) + * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 69.12 GHz) + * @NUM_NL80211_BANDS: number of bands, avoid using this in userspace + * since newer kernel versions may support more bands + */ +enum nl80211_band { + NL80211_BAND_2GHZ, + NL80211_BAND_5GHZ, + NL80211_BAND_60GHZ, + + NUM_NL80211_BANDS, +}; + +/** + * enum nl80211_dfs_state - DFS states for channels + * + * Channel states used by the DFS code. + * + * @NL80211_DFS_USABLE: The channel can be used, but channel availability + * check (CAC) must be performed before using it for AP or IBSS. + * @NL80211_DFS_UNAVAILABLE: A radar has been detected on this channel, it + * is therefore marked as not available. + * @NL80211_DFS_AVAILABLE: The channel has been CAC checked and is available. + */ +enum nl80211_dfs_state { + NL80211_DFS_USABLE, + NL80211_DFS_UNAVAILABLE, + NL80211_DFS_AVAILABLE, +}; + +/** + * enum nl80211_tx_power_setting - TX power adjustment + * @NL80211_TX_POWER_AUTOMATIC: automatically determine transmit power + * @NL80211_TX_POWER_LIMITED: limit TX power by the mBm parameter + * @NL80211_TX_POWER_FIXED: fix TX power to the mBm parameter + */ +enum nl80211_tx_power_setting { + NL80211_TX_POWER_AUTOMATIC, + NL80211_TX_POWER_LIMITED, + NL80211_TX_POWER_FIXED, +}; + +/** + * enum nl80211_iftype - (virtual) interface types + * + * @NL80211_IFTYPE_UNSPECIFIED: unspecified type, driver decides + * @NL80211_IFTYPE_ADHOC: independent BSS member + * @NL80211_IFTYPE_STATION: managed BSS member + * @NL80211_IFTYPE_AP: access point + * @NL80211_IFTYPE_AP_VLAN: VLAN interface for access points; VLAN interfaces + * are a bit special in that they must always be tied to a pre-existing + * AP type interface. + * @NL80211_IFTYPE_WDS: wireless distribution interface + * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames + * @NL80211_IFTYPE_MESH_POINT: mesh point + * @NL80211_IFTYPE_P2P_CLIENT: P2P client + * @NL80211_IFTYPE_P2P_GO: P2P group owner + * @NL80211_IFTYPE_P2P_DEVICE: P2P device interface type, this is not a netdev + * and therefore can't be created in the normal ways, use the + * %NL80211_CMD_START_P2P_DEVICE and %NL80211_CMD_STOP_P2P_DEVICE + * commands to create and destroy one + * @NL80211_IF_TYPE_OCB: Outside Context of a BSS + * This mode corresponds to the MIB variable dot11OCBActivated=true + * @NL80211_IFTYPE_NAN: NAN device interface type (not a netdev) + * @NL80211_IFTYPE_MAX: highest interface type number currently defined + * @NUM_NL80211_IFTYPES: number of defined interface types + * + * These values are used with the %NL80211_ATTR_IFTYPE + * to set the type of an interface. + * + */ +enum nl80211_iftype { + NL80211_IFTYPE_UNSPECIFIED, + NL80211_IFTYPE_ADHOC, + NL80211_IFTYPE_STATION, + NL80211_IFTYPE_AP, + NL80211_IFTYPE_AP_VLAN, + NL80211_IFTYPE_WDS, + NL80211_IFTYPE_MONITOR, + NL80211_IFTYPE_MESH_POINT, + NL80211_IFTYPE_P2P_CLIENT, + NL80211_IFTYPE_P2P_GO, + NL80211_IFTYPE_P2P_DEVICE, + NL80211_IFTYPE_OCB, + NL80211_IFTYPE_NAN, + + /* keep last */ + NUM_NL80211_IFTYPES, + NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 +} +; +/* Notice of Absence attribute - described in P2P spec 4.1.14 */ +/* Typical max value used here */ +#define IEEE80211_P2P_NOA_DESC_MAX 4 + +struct ieee80211_p2p_noa_desc { + u8 count; + __le32 duration; + __le32 interval; + __le32 start_time; +} __packed; + +struct ieee80211_p2p_noa_attr { + u8 index; + u8 oppps_ctwindow; + struct ieee80211_p2p_noa_desc desc[IEEE80211_P2P_NOA_DESC_MAX]; +} __packed; + +#define IEEE80211_P2P_OPPPS_ENABLE_BIT BIT(7) +#define IEEE80211_P2P_OPPPS_CTWINDOW_MASK 0x7F + +#endif /* ifndef USERSPACE_NL80211_H */ diff --git a/libwifiuserspace/kernel/types.h b/libwifiuserspace/kernel/types.h new file mode 100644 index 0000000..2be8d18 --- /dev/null +++ b/libwifiuserspace/kernel/types.h @@ -0,0 +1,49 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __USERSPACE_TYPES_H__ +#define __USERSPACE_TYPES_H__ + +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +typedef uint8_t __u8; +typedef uint16_t __u16; +typedef uint32_t __u32; +typedef uint64_t __u64; + +/* + * We lose the atomic stuff + */ +typedef int64_t atomic64_t; +typedef int64_t atomic_t; + +/* + * We lose the automagic endian checking and have to make sure + * we do it ourselves properly. + */ +typedef uint16_t __le16; +typedef uint32_t __le32; + +typedef uint16_t __be16; +typedef uint32_t __be32; + +/* + * Not going to make a whole netdev defs file for one def + */ +typedef u64 netdev_features_t; + +#endif /* ifndef TYPES_H */ diff --git a/libwifiuserspace/kernel/usb.h b/libwifiuserspace/kernel/usb.h new file mode 100644 index 0000000..27ecfd7 --- /dev/null +++ b/libwifiuserspace/kernel/usb.h @@ -0,0 +1,157 @@ +/* + * Derived from Linux kernel usb.h + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __USB_H__ +#define __USB_H__ + +#include "kernel/types.h" + +#define USB_DEVICE_ID_MATCH_DEVICE \ + (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT) +#define USB_DEVICE_ID_MATCH_DEV_RANGE \ + (USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI) +#define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION \ + (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE) +#define USB_DEVICE_ID_MATCH_DEV_INFO \ + (USB_DEVICE_ID_MATCH_DEV_CLASS | \ + USB_DEVICE_ID_MATCH_DEV_SUBCLASS | \ + USB_DEVICE_ID_MATCH_DEV_PROTOCOL) +#define USB_DEVICE_ID_MATCH_INT_INFO \ + (USB_DEVICE_ID_MATCH_INT_CLASS | \ + USB_DEVICE_ID_MATCH_INT_SUBCLASS | \ + USB_DEVICE_ID_MATCH_INT_PROTOCOL) + +/** + * USB_DEVICE - macro used to describe a specific usb device + * @vend: the 16 bit USB Vendor ID + * @prod: the 16 bit USB Product ID + * + * This macro is used to create a struct usb_device_id that matches a + * specific device. + */ +#define USB_DEVICE(vend, prod) \ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE, \ + .idVendor = (vend), \ + .idProduct = (prod) + +/** + * struct usb_device_id - identifies USB devices for probing and hotplugging + * @match_flags: Bit mask controlling which of the other fields are used to + * match against new devices. Any field except for driver_info may be + * used, although some only make sense in conjunction with other fields. + * This is usually set by a USB_DEVICE_*() macro, which sets all + * other fields in this structure except for driver_info. + * @idVendor: USB vendor ID for a device; numbers are assigned + * by the USB forum to its members. + * @idProduct: Vendor-assigned product ID. + * @bcdDevice_lo: Low end of range of vendor-assigned product version numbers. + * This is also used to identify individual product versions, for + * a range consisting of a single device. + * @bcdDevice_hi: High end of version number range. The range of product + * versions is inclusive. + * @bDeviceClass: Class of device; numbers are assigned + * by the USB forum. Products may choose to implement classes, + * or be vendor-specific. Device classes specify behavior of all + * the interfaces on a device. + * @bDeviceSubClass: Subclass of device; associated with bDeviceClass. + * @bDeviceProtocol: Protocol of device; associated with bDeviceClass. + * @bInterfaceClass: Class of interface; numbers are assigned + * by the USB forum. Products may choose to implement classes, + * or be vendor-specific. Interface classes specify behavior only + * of a given interface; other interfaces may support other classes. + * @bInterfaceSubClass: Subclass of interface; associated with bInterfaceClass. + * @bInterfaceProtocol: Protocol of interface; associated with bInterfaceClass. + * @bInterfaceNumber: Number of interface; composite devices may use + * fixed interface numbers to differentiate between vendor-specific + * interfaces. + * @driver_info: Holds information used by the driver. Usually it holds + * a pointer to a descriptor understood by the driver, or perhaps + * device flags. + * + * In most cases, drivers will create a table of device IDs by using + * USB_DEVICE(), or similar macros designed for that purpose. + * They will then export it to userspace using MODULE_DEVICE_TABLE(), + * and provide it to the USB core through their usb_driver structure. + * + * See the usb_match_id() function for information about how matches are + * performed. Briefly, you will normally use one of several macros to help + * construct these entries. Each entry you provide will either identify + * one or more specific products, or will identify a class of products + * which have agreed to behave the same. You should put the more specific + * matches towards the beginning of your table, so that driver_info can + * record quirks of specific products. + */ +struct usb_device_id { + /* which fields to match against? */ + __u16 match_flags; + + /* Used for product specific matches; range is inclusive */ + __u16 idVendor; + __u16 idProduct; + __u16 bcdDevice_lo; + __u16 bcdDevice_hi; + + /* Used for device class matches */ + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + + /* Used for interface class matches */ + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + + /* Used for vendor-specific interface matches */ + __u8 bInterfaceNumber; +}; + +/* Some useful macros to use to create struct usb_device_id */ +#define USB_DEVICE_ID_MATCH_VENDOR 0x0001 +#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002 +#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004 +#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008 +#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010 +#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020 +#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040 +#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080 +#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100 +#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200 +#define USB_DEVICE_ID_MATCH_INT_NUMBER 0x0400 + +/* + * USB directions + * + * This bit flag is used in endpoint descriptors' bEndpointAddress field. + * It's also one of three fields in control requests bRequestType. + */ +#define USB_DIR_OUT 0 /* to device */ +#define USB_DIR_IN 0x80 /* to host */ + +/* + * USB types, the second of three bRequestType fields + */ +#define USB_TYPE_MASK (0x03 << 5) +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +/* + * USB recipients, the third of three bRequestType fields + */ +#define USB_RECIP_MASK 0x1f +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 +/* From Wireless USB 1.0 */ +#define USB_RECIP_PORT 0x04 +#define USB_RECIP_RPIPE 0x05 + +#endif /* ifndef USB_H */ diff --git a/libwifiuserspace/rt2800usb/rt2800.h b/libwifiuserspace/rt2800usb/rt2800.h new file mode 100644 index 0000000..1b7ce08 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2800.h @@ -0,0 +1,3218 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __RT2800_H__ +#define __RT2800_H__ + +#include + +#include "userspace/userspace.h" + +/* + * RF chip defines. + * + * RF2820 2.4G 2T3R + * RF2850 2.4G/5G 2T3R + * RF2720 2.4G 1T2R + * RF2750 2.4G/5G 1T2R + * RF3020 2.4G 1T1R + * RF2020 2.4G B/G + * RF3021 2.4G 1T2R + * RF3022 2.4G 2T2R + * RF3052 2.4G/5G 2T2R + * RF2853 2.4G/5G 3T3R + * RF3320 2.4G 1T1R(RT3350/RT3370/RT3390) + * RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392) + * RF3053 2.4G/5G 3T3R(RT3563/RT3573/RT3593) + * RF3853 2.4G/5G 3T3R(RT3883/RT3662) + * RF5592 2.4G/5G 2T2R + * RF3070 2.4G 1T1R + * RF5360 2.4G 1T1R + * RF5362 2.4G 1T1R + * RF5370 2.4G 1T1R + * RF5390 2.4G 1T1R + */ +#define RF2820 0x0001 +#define RF2850 0x0002 +#define RF2720 0x0003 +#define RF2750 0x0004 +#define RF3020 0x0005 +#define RF2020 0x0006 +#define RF3021 0x0007 +#define RF3022 0x0008 +#define RF3052 0x0009 +#define RF2853 0x000a +#define RF3320 0x000b +#define RF3322 0x000c +#define RF3053 0x000d +#define RF5592 0x000f +#define RF3070 0x3070 +#define RF3290 0x3290 +#define RF3853 0x3853 +#define RF5350 0x5350 +#define RF5360 0x5360 +#define RF5362 0x5362 +#define RF5370 0x5370 +#define RF5372 0x5372 +#define RF5390 0x5390 +#define RF5392 0x5392 +#define RF7620 0x7620 + +/* + * Chipset revisions. + */ +#define REV_RT2860C 0x0100 +#define REV_RT2860D 0x0101 +#define REV_RT2872E 0x0200 +#define REV_RT3070E 0x0200 +#define REV_RT3070F 0x0201 +#define REV_RT3071E 0x0211 +#define REV_RT3090E 0x0211 +#define REV_RT3390E 0x0211 +#define REV_RT3593E 0x0211 +#define REV_RT5390F 0x0502 +#define REV_RT5370G 0x0503 +#define REV_RT5390R 0x1502 +#define REV_RT5592C 0x0221 + +#define DEFAULT_RSSI_OFFSET 120 + +/* + * Register layout information. + */ +#define CSR_REG_BASE 0x1000 +#define CSR_REG_SIZE 0x0800 +#define EEPROM_BASE 0x0000 +#define EEPROM_SIZE 0x0200 +#define BBP_BASE 0x0000 +#define BBP_SIZE 0x00ff +#define RF_BASE 0x0004 +#define RF_SIZE 0x0010 +#define RFCSR_BASE 0x0000 +#define RFCSR_SIZE 0x0040 + +/* + * Number of TX queues. + */ +#define NUM_TX_QUEUES 4 + +/* + * Registers. + */ + + +/* + * MAC_CSR0_3290: MAC_CSR0 for RT3290 to identity MAC version number. + */ +#define MAC_CSR0_3290 0x0000 + +/* + * E2PROM_CSR: PCI EEPROM control register. + * RELOAD: Write 1 to reload eeprom content. + * TYPE: 0: 93c46, 1:93c66. + * LOAD_STATUS: 1:loading, 0:done. + */ +#define E2PROM_CSR 0x0004 +#define E2PROM_CSR_DATA_CLOCK FIELD32(0x00000001) +#define E2PROM_CSR_CHIP_SELECT FIELD32(0x00000002) +#define E2PROM_CSR_DATA_IN FIELD32(0x00000004) +#define E2PROM_CSR_DATA_OUT FIELD32(0x00000008) +#define E2PROM_CSR_TYPE FIELD32(0x00000030) +#define E2PROM_CSR_LOAD_STATUS FIELD32(0x00000040) +#define E2PROM_CSR_RELOAD FIELD32(0x00000080) + +/* + * CMB_CTRL_CFG + */ +#define CMB_CTRL 0x0020 +#define AUX_OPT_BIT0 FIELD32(0x00000001) +#define AUX_OPT_BIT1 FIELD32(0x00000002) +#define AUX_OPT_BIT2 FIELD32(0x00000004) +#define AUX_OPT_BIT3 FIELD32(0x00000008) +#define AUX_OPT_BIT4 FIELD32(0x00000010) +#define AUX_OPT_BIT5 FIELD32(0x00000020) +#define AUX_OPT_BIT6 FIELD32(0x00000040) +#define AUX_OPT_BIT7 FIELD32(0x00000080) +#define AUX_OPT_BIT8 FIELD32(0x00000100) +#define AUX_OPT_BIT9 FIELD32(0x00000200) +#define AUX_OPT_BIT10 FIELD32(0x00000400) +#define AUX_OPT_BIT11 FIELD32(0x00000800) +#define AUX_OPT_BIT12 FIELD32(0x00001000) +#define AUX_OPT_BIT13 FIELD32(0x00002000) +#define AUX_OPT_BIT14 FIELD32(0x00004000) +#define AUX_OPT_BIT15 FIELD32(0x00008000) +#define LDO25_LEVEL FIELD32(0x00030000) +#define LDO25_LARGEA FIELD32(0x00040000) +#define LDO25_FRC_ON FIELD32(0x00080000) +#define CMB_RSV FIELD32(0x00300000) +#define XTAL_RDY FIELD32(0x00400000) +#define PLL_LD FIELD32(0x00800000) +#define LDO_CORE_LEVEL FIELD32(0x0F000000) +#define LDO_BGSEL FIELD32(0x30000000) +#define LDO3_EN FIELD32(0x40000000) +#define LDO0_EN FIELD32(0x80000000) + +/* + * EFUSE_CSR_3290: RT3290 EEPROM + */ +#define EFUSE_CTRL_3290 0x0024 + +/* + * EFUSE_DATA3 of 3290 + */ +#define EFUSE_DATA3_3290 0x0028 + +/* + * EFUSE_DATA2 of 3290 + */ +#define EFUSE_DATA2_3290 0x002c + +/* + * EFUSE_DATA1 of 3290 + */ +#define EFUSE_DATA1_3290 0x0030 + +/* + * EFUSE_DATA0 of 3290 + */ +#define EFUSE_DATA0_3290 0x0034 + +/* + * OSC_CTRL_CFG + * Ring oscillator configuration + */ +#define OSC_CTRL 0x0038 +#define OSC_REF_CYCLE FIELD32(0x00001fff) +#define OSC_RSV FIELD32(0x0000e000) +#define OSC_CAL_CNT FIELD32(0x0fff0000) +#define OSC_CAL_ACK FIELD32(0x10000000) +#define OSC_CLK_32K_VLD FIELD32(0x20000000) +#define OSC_CAL_REQ FIELD32(0x40000000) +#define OSC_ROSC_EN FIELD32(0x80000000) + +/* + * COEX_CFG_0 + */ +#define COEX_CFG0 0x0040 +#define COEX_CFG_ANT FIELD32(0xff000000) +/* + * COEX_CFG_1 + */ +#define COEX_CFG1 0x0044 + +/* + * COEX_CFG_2 + */ +#define COEX_CFG2 0x0048 +#define BT_COEX_CFG1 FIELD32(0xff000000) +#define BT_COEX_CFG0 FIELD32(0x00ff0000) +#define WL_COEX_CFG1 FIELD32(0x0000ff00) +#define WL_COEX_CFG0 FIELD32(0x000000ff) +/* + * PLL_CTRL_CFG + * PLL configuration register + */ +#define PLL_CTRL 0x0050 +#define PLL_RESERVED_INPUT1 FIELD32(0x000000ff) +#define PLL_RESERVED_INPUT2 FIELD32(0x0000ff00) +#define PLL_CONTROL FIELD32(0x00070000) +#define PLL_LPF_R1 FIELD32(0x00080000) +#define PLL_LPF_C1_CTRL FIELD32(0x00300000) +#define PLL_LPF_C2_CTRL FIELD32(0x00c00000) +#define PLL_CP_CURRENT_CTRL FIELD32(0x03000000) +#define PLL_PFD_DELAY_CTRL FIELD32(0x0c000000) +#define PLL_LOCK_CTRL FIELD32(0x70000000) +#define PLL_VBGBK_EN FIELD32(0x80000000) + + +/* + * WLAN_CTRL_CFG + * RT3290 wlan configuration + */ +#define WLAN_FUN_CTRL 0x0080 +#define WLAN_EN FIELD32(0x00000001) +#define WLAN_CLK_EN FIELD32(0x00000002) +#define WLAN_RSV1 FIELD32(0x00000004) +#define WLAN_RESET FIELD32(0x00000008) +#define PCIE_APP0_CLK_REQ FIELD32(0x00000010) +#define FRC_WL_ANT_SET FIELD32(0x00000020) +#define INV_TR_SW0 FIELD32(0x00000040) +#define WLAN_GPIO_IN_BIT0 FIELD32(0x00000100) +#define WLAN_GPIO_IN_BIT1 FIELD32(0x00000200) +#define WLAN_GPIO_IN_BIT2 FIELD32(0x00000400) +#define WLAN_GPIO_IN_BIT3 FIELD32(0x00000800) +#define WLAN_GPIO_IN_BIT4 FIELD32(0x00001000) +#define WLAN_GPIO_IN_BIT5 FIELD32(0x00002000) +#define WLAN_GPIO_IN_BIT6 FIELD32(0x00004000) +#define WLAN_GPIO_IN_BIT7 FIELD32(0x00008000) +#define WLAN_GPIO_IN_BIT_ALL FIELD32(0x0000ff00) +#define WLAN_GPIO_OUT_BIT0 FIELD32(0x00010000) +#define WLAN_GPIO_OUT_BIT1 FIELD32(0x00020000) +#define WLAN_GPIO_OUT_BIT2 FIELD32(0x00040000) +#define WLAN_GPIO_OUT_BIT3 FIELD32(0x00050000) +#define WLAN_GPIO_OUT_BIT4 FIELD32(0x00100000) +#define WLAN_GPIO_OUT_BIT5 FIELD32(0x00200000) +#define WLAN_GPIO_OUT_BIT6 FIELD32(0x00400000) +#define WLAN_GPIO_OUT_BIT7 FIELD32(0x00800000) +#define WLAN_GPIO_OUT_BIT_ALL FIELD32(0x00ff0000) +#define WLAN_GPIO_OUT_OE_BIT0 FIELD32(0x01000000) +#define WLAN_GPIO_OUT_OE_BIT1 FIELD32(0x02000000) +#define WLAN_GPIO_OUT_OE_BIT2 FIELD32(0x04000000) +#define WLAN_GPIO_OUT_OE_BIT3 FIELD32(0x08000000) +#define WLAN_GPIO_OUT_OE_BIT4 FIELD32(0x10000000) +#define WLAN_GPIO_OUT_OE_BIT5 FIELD32(0x20000000) +#define WLAN_GPIO_OUT_OE_BIT6 FIELD32(0x40000000) +#define WLAN_GPIO_OUT_OE_BIT7 FIELD32(0x80000000) +#define WLAN_GPIO_OUT_OE_BIT_ALL FIELD32(0xff000000) + +/* + * AUX_CTRL: Aux/PCI-E related configuration + */ +#define AUX_CTRL 0x10c +#define AUX_CTRL_WAKE_PCIE_EN FIELD32(0x00000002) +#define AUX_CTRL_FORCE_PCIE_CLK FIELD32(0x00000400) + +/* + * OPT_14: Unknown register used by rt3xxx devices. + */ +#define OPT_14_CSR 0x0114 +#define OPT_14_CSR_BIT0 FIELD32(0x00000001) + +/* + * INT_SOURCE_CSR: Interrupt source register. + * Write one to clear corresponding bit. + * TX_FIFO_STATUS: FIFO Statistics is full, sw should read TX_STA_FIFO + */ +#define INT_SOURCE_CSR 0x0200 +#define INT_SOURCE_CSR_RXDELAYINT FIELD32(0x00000001) +#define INT_SOURCE_CSR_TXDELAYINT FIELD32(0x00000002) +#define INT_SOURCE_CSR_RX_DONE FIELD32(0x00000004) +#define INT_SOURCE_CSR_AC0_DMA_DONE FIELD32(0x00000008) +#define INT_SOURCE_CSR_AC1_DMA_DONE FIELD32(0x00000010) +#define INT_SOURCE_CSR_AC2_DMA_DONE FIELD32(0x00000020) +#define INT_SOURCE_CSR_AC3_DMA_DONE FIELD32(0x00000040) +#define INT_SOURCE_CSR_HCCA_DMA_DONE FIELD32(0x00000080) +#define INT_SOURCE_CSR_MGMT_DMA_DONE FIELD32(0x00000100) +#define INT_SOURCE_CSR_MCU_COMMAND FIELD32(0x00000200) +#define INT_SOURCE_CSR_RXTX_COHERENT FIELD32(0x00000400) +#define INT_SOURCE_CSR_TBTT FIELD32(0x00000800) +#define INT_SOURCE_CSR_PRE_TBTT FIELD32(0x00001000) +#define INT_SOURCE_CSR_TX_FIFO_STATUS FIELD32(0x00002000) +#define INT_SOURCE_CSR_AUTO_WAKEUP FIELD32(0x00004000) +#define INT_SOURCE_CSR_GPTIMER FIELD32(0x00008000) +#define INT_SOURCE_CSR_RX_COHERENT FIELD32(0x00010000) +#define INT_SOURCE_CSR_TX_COHERENT FIELD32(0x00020000) + +/* + * INT_MASK_CSR: Interrupt MASK register. 1: the interrupt is mask OFF. + */ +#define INT_MASK_CSR 0x0204 +#define INT_MASK_CSR_RXDELAYINT FIELD32(0x00000001) +#define INT_MASK_CSR_TXDELAYINT FIELD32(0x00000002) +#define INT_MASK_CSR_RX_DONE FIELD32(0x00000004) +#define INT_MASK_CSR_AC0_DMA_DONE FIELD32(0x00000008) +#define INT_MASK_CSR_AC1_DMA_DONE FIELD32(0x00000010) +#define INT_MASK_CSR_AC2_DMA_DONE FIELD32(0x00000020) +#define INT_MASK_CSR_AC3_DMA_DONE FIELD32(0x00000040) +#define INT_MASK_CSR_HCCA_DMA_DONE FIELD32(0x00000080) +#define INT_MASK_CSR_MGMT_DMA_DONE FIELD32(0x00000100) +#define INT_MASK_CSR_MCU_COMMAND FIELD32(0x00000200) +#define INT_MASK_CSR_RXTX_COHERENT FIELD32(0x00000400) +#define INT_MASK_CSR_TBTT FIELD32(0x00000800) +#define INT_MASK_CSR_PRE_TBTT FIELD32(0x00001000) +#define INT_MASK_CSR_TX_FIFO_STATUS FIELD32(0x00002000) +#define INT_MASK_CSR_AUTO_WAKEUP FIELD32(0x00004000) +#define INT_MASK_CSR_GPTIMER FIELD32(0x00008000) +#define INT_MASK_CSR_RX_COHERENT FIELD32(0x00010000) +#define INT_MASK_CSR_TX_COHERENT FIELD32(0x00020000) + +/* + * WPDMA_GLO_CFG + */ +#define WPDMA_GLO_CFG 0x0208 +#define WPDMA_GLO_CFG_ENABLE_TX_DMA FIELD32(0x00000001) +#define WPDMA_GLO_CFG_TX_DMA_BUSY FIELD32(0x00000002) +#define WPDMA_GLO_CFG_ENABLE_RX_DMA FIELD32(0x00000004) +#define WPDMA_GLO_CFG_RX_DMA_BUSY FIELD32(0x00000008) +#define WPDMA_GLO_CFG_WP_DMA_BURST_SIZE FIELD32(0x00000030) +#define WPDMA_GLO_CFG_TX_WRITEBACK_DONE FIELD32(0x00000040) +#define WPDMA_GLO_CFG_BIG_ENDIAN FIELD32(0x00000080) +#define WPDMA_GLO_CFG_RX_HDR_SCATTER FIELD32(0x0000ff00) +#define WPDMA_GLO_CFG_HDR_SEG_LEN FIELD32(0xffff0000) + +/* + * WPDMA_RST_IDX + */ +#define WPDMA_RST_IDX 0x020c +#define WPDMA_RST_IDX_DTX_IDX0 FIELD32(0x00000001) +#define WPDMA_RST_IDX_DTX_IDX1 FIELD32(0x00000002) +#define WPDMA_RST_IDX_DTX_IDX2 FIELD32(0x00000004) +#define WPDMA_RST_IDX_DTX_IDX3 FIELD32(0x00000008) +#define WPDMA_RST_IDX_DTX_IDX4 FIELD32(0x00000010) +#define WPDMA_RST_IDX_DTX_IDX5 FIELD32(0x00000020) +#define WPDMA_RST_IDX_DRX_IDX0 FIELD32(0x00010000) + +/* + * DELAY_INT_CFG + */ +#define DELAY_INT_CFG 0x0210 +#define DELAY_INT_CFG_RXMAX_PTIME FIELD32(0x000000ff) +#define DELAY_INT_CFG_RXMAX_PINT FIELD32(0x00007f00) +#define DELAY_INT_CFG_RXDLY_INT_EN FIELD32(0x00008000) +#define DELAY_INT_CFG_TXMAX_PTIME FIELD32(0x00ff0000) +#define DELAY_INT_CFG_TXMAX_PINT FIELD32(0x7f000000) +#define DELAY_INT_CFG_TXDLY_INT_EN FIELD32(0x80000000) + +/* + * WMM_AIFSN_CFG: Aifsn for each EDCA AC + * AIFSN0: AC_VO + * AIFSN1: AC_VI + * AIFSN2: AC_BE + * AIFSN3: AC_BK + */ +#define WMM_AIFSN_CFG 0x0214 +#define WMM_AIFSN_CFG_AIFSN0 FIELD32(0x0000000f) +#define WMM_AIFSN_CFG_AIFSN1 FIELD32(0x000000f0) +#define WMM_AIFSN_CFG_AIFSN2 FIELD32(0x00000f00) +#define WMM_AIFSN_CFG_AIFSN3 FIELD32(0x0000f000) + +/* + * WMM_CWMIN_CSR: CWmin for each EDCA AC + * CWMIN0: AC_VO + * CWMIN1: AC_VI + * CWMIN2: AC_BE + * CWMIN3: AC_BK + */ +#define WMM_CWMIN_CFG 0x0218 +#define WMM_CWMIN_CFG_CWMIN0 FIELD32(0x0000000f) +#define WMM_CWMIN_CFG_CWMIN1 FIELD32(0x000000f0) +#define WMM_CWMIN_CFG_CWMIN2 FIELD32(0x00000f00) +#define WMM_CWMIN_CFG_CWMIN3 FIELD32(0x0000f000) + +/* + * WMM_CWMAX_CSR: CWmax for each EDCA AC + * CWMAX0: AC_VO + * CWMAX1: AC_VI + * CWMAX2: AC_BE + * CWMAX3: AC_BK + */ +#define WMM_CWMAX_CFG 0x021c +#define WMM_CWMAX_CFG_CWMAX0 FIELD32(0x0000000f) +#define WMM_CWMAX_CFG_CWMAX1 FIELD32(0x000000f0) +#define WMM_CWMAX_CFG_CWMAX2 FIELD32(0x00000f00) +#define WMM_CWMAX_CFG_CWMAX3 FIELD32(0x0000f000) + +/* + * AC_TXOP0: AC_VO/AC_VI TXOP register + * AC0TXOP: AC_VO in unit of 32us + * AC1TXOP: AC_VI in unit of 32us + */ +#define WMM_TXOP0_CFG 0x0220 +#define WMM_TXOP0_CFG_AC0TXOP FIELD32(0x0000ffff) +#define WMM_TXOP0_CFG_AC1TXOP FIELD32(0xffff0000) + +/* + * AC_TXOP1: AC_BE/AC_BK TXOP register + * AC2TXOP: AC_BE in unit of 32us + * AC3TXOP: AC_BK in unit of 32us + */ +#define WMM_TXOP1_CFG 0x0224 +#define WMM_TXOP1_CFG_AC2TXOP FIELD32(0x0000ffff) +#define WMM_TXOP1_CFG_AC3TXOP FIELD32(0xffff0000) + +/* + * GPIO_CTRL: + * GPIO_CTRL_VALx: GPIO value + * GPIO_CTRL_DIRx: GPIO direction: 0 = output; 1 = input + */ +#define GPIO_CTRL 0x0228 +#define GPIO_CTRL_VAL0 FIELD32(0x00000001) +#define GPIO_CTRL_VAL1 FIELD32(0x00000002) +#define GPIO_CTRL_VAL2 FIELD32(0x00000004) +#define GPIO_CTRL_VAL3 FIELD32(0x00000008) +#define GPIO_CTRL_VAL4 FIELD32(0x00000010) +#define GPIO_CTRL_VAL5 FIELD32(0x00000020) +#define GPIO_CTRL_VAL6 FIELD32(0x00000040) +#define GPIO_CTRL_VAL7 FIELD32(0x00000080) +#define GPIO_CTRL_DIR0 FIELD32(0x00000100) +#define GPIO_CTRL_DIR1 FIELD32(0x00000200) +#define GPIO_CTRL_DIR2 FIELD32(0x00000400) +#define GPIO_CTRL_DIR3 FIELD32(0x00000800) +#define GPIO_CTRL_DIR4 FIELD32(0x00001000) +#define GPIO_CTRL_DIR5 FIELD32(0x00002000) +#define GPIO_CTRL_DIR6 FIELD32(0x00004000) +#define GPIO_CTRL_DIR7 FIELD32(0x00008000) +#define GPIO_CTRL_VAL8 FIELD32(0x00010000) +#define GPIO_CTRL_VAL9 FIELD32(0x00020000) +#define GPIO_CTRL_VAL10 FIELD32(0x00040000) +#define GPIO_CTRL_DIR8 FIELD32(0x01000000) +#define GPIO_CTRL_DIR9 FIELD32(0x02000000) +#define GPIO_CTRL_DIR10 FIELD32(0x04000000) + +/* + * MCU_CMD_CFG + */ +#define MCU_CMD_CFG 0x022c + +/* + * AC_VO register offsets + */ +#define TX_BASE_PTR0 0x0230 +#define TX_MAX_CNT0 0x0234 +#define TX_CTX_IDX0 0x0238 +#define TX_DTX_IDX0 0x023c + +/* + * AC_VI register offsets + */ +#define TX_BASE_PTR1 0x0240 +#define TX_MAX_CNT1 0x0244 +#define TX_CTX_IDX1 0x0248 +#define TX_DTX_IDX1 0x024c + +/* + * AC_BE register offsets + */ +#define TX_BASE_PTR2 0x0250 +#define TX_MAX_CNT2 0x0254 +#define TX_CTX_IDX2 0x0258 +#define TX_DTX_IDX2 0x025c + +/* + * AC_BK register offsets + */ +#define TX_BASE_PTR3 0x0260 +#define TX_MAX_CNT3 0x0264 +#define TX_CTX_IDX3 0x0268 +#define TX_DTX_IDX3 0x026c + +/* + * HCCA register offsets + */ +#define TX_BASE_PTR4 0x0270 +#define TX_MAX_CNT4 0x0274 +#define TX_CTX_IDX4 0x0278 +#define TX_DTX_IDX4 0x027c + +/* + * MGMT register offsets + */ +#define TX_BASE_PTR5 0x0280 +#define TX_MAX_CNT5 0x0284 +#define TX_CTX_IDX5 0x0288 +#define TX_DTX_IDX5 0x028c + +/* + * RX register offsets + */ +#define RX_BASE_PTR 0x0290 +#define RX_MAX_CNT 0x0294 +#define RX_CRX_IDX 0x0298 +#define RX_DRX_IDX 0x029c + +/* + * USB_DMA_CFG + * RX_BULK_AGG_TIMEOUT: Rx Bulk Aggregation TimeOut in unit of 33ns. + * RX_BULK_AGG_LIMIT: Rx Bulk Aggregation Limit in unit of 256 bytes. + * PHY_CLEAR: phy watch dog enable. + * TX_CLEAR: Clear USB DMA TX path. + * TXOP_HALT: Halt TXOP count down when TX buffer is full. + * RX_BULK_AGG_EN: Enable Rx Bulk Aggregation. + * RX_BULK_EN: Enable USB DMA Rx. + * TX_BULK_EN: Enable USB DMA Tx. + * EP_OUT_VALID: OUT endpoint data valid. + * RX_BUSY: USB DMA RX FSM busy. + * TX_BUSY: USB DMA TX FSM busy. + */ +#define USB_DMA_CFG 0x02a0 +#define USB_DMA_CFG_RX_BULK_AGG_TIMEOUT FIELD32(0x000000ff) +#define USB_DMA_CFG_RX_BULK_AGG_LIMIT FIELD32(0x0000ff00) +#define USB_DMA_CFG_PHY_CLEAR FIELD32(0x00010000) +#define USB_DMA_CFG_TX_CLEAR FIELD32(0x00080000) +#define USB_DMA_CFG_TXOP_HALT FIELD32(0x00100000) +#define USB_DMA_CFG_RX_BULK_AGG_EN FIELD32(0x00200000) +#define USB_DMA_CFG_RX_BULK_EN FIELD32(0x00400000) +#define USB_DMA_CFG_TX_BULK_EN FIELD32(0x00800000) +#define USB_DMA_CFG_EP_OUT_VALID FIELD32(0x3f000000) +#define USB_DMA_CFG_RX_BUSY FIELD32(0x40000000) +#define USB_DMA_CFG_TX_BUSY FIELD32(0x80000000) + +/* + * US_CYC_CNT + * BT_MODE_EN: Bluetooth mode enable + * CLOCK CYCLE: Clock cycle count in 1us. + * PCI:0x21, PCIE:0x7d, USB:0x1e + */ +#define US_CYC_CNT 0x02a4 +#define US_CYC_CNT_BT_MODE_EN FIELD32(0x00000100) +#define US_CYC_CNT_CLOCK_CYCLE FIELD32(0x000000ff) + +/* + * PBF_SYS_CTRL + * HOST_RAM_WRITE: enable Host program ram write selection + */ +#define PBF_SYS_CTRL 0x0400 +#define PBF_SYS_CTRL_READY FIELD32(0x00000080) +#define PBF_SYS_CTRL_HOST_RAM_WRITE FIELD32(0x00010000) + +/* + * HOST-MCU shared memory + */ +#define HOST_CMD_CSR 0x0404 +#define HOST_CMD_CSR_HOST_COMMAND FIELD32(0x000000ff) + +/* + * PBF registers + * Most are for debug. Driver doesn't touch PBF register. + */ +#define PBF_CFG 0x0408 +#define PBF_MAX_PCNT 0x040c +#define PBF_CTRL 0x0410 +#define PBF_INT_STA 0x0414 +#define PBF_INT_ENA 0x0418 + +/* + * BCN_OFFSET0: + */ +#define BCN_OFFSET0 0x042c +#define BCN_OFFSET0_BCN0 FIELD32(0x000000ff) +#define BCN_OFFSET0_BCN1 FIELD32(0x0000ff00) +#define BCN_OFFSET0_BCN2 FIELD32(0x00ff0000) +#define BCN_OFFSET0_BCN3 FIELD32(0xff000000) + +/* + * BCN_OFFSET1: + */ +#define BCN_OFFSET1 0x0430 +#define BCN_OFFSET1_BCN4 FIELD32(0x000000ff) +#define BCN_OFFSET1_BCN5 FIELD32(0x0000ff00) +#define BCN_OFFSET1_BCN6 FIELD32(0x00ff0000) +#define BCN_OFFSET1_BCN7 FIELD32(0xff000000) + +/* + * TXRXQ_PCNT: PBF register + * PCNT_TX0Q: Page count for TX hardware queue 0 + * PCNT_TX1Q: Page count for TX hardware queue 1 + * PCNT_TX2Q: Page count for TX hardware queue 2 + * PCNT_RX0Q: Page count for RX hardware queue + */ +#define TXRXQ_PCNT 0x0438 +#define TXRXQ_PCNT_TX0Q FIELD32(0x000000ff) +#define TXRXQ_PCNT_TX1Q FIELD32(0x0000ff00) +#define TXRXQ_PCNT_TX2Q FIELD32(0x00ff0000) +#define TXRXQ_PCNT_RX0Q FIELD32(0xff000000) + +/* + * PBF register + * Debug. Driver doesn't touch PBF register. + */ +#define PBF_DBG 0x043c + +/* + * RF registers + */ +#define RF_CSR_CFG 0x0500 +#define RF_CSR_CFG_DATA FIELD32(0x000000ff) +#define RF_CSR_CFG_REGNUM FIELD32(0x00003f00) +#define RF_CSR_CFG_WRITE FIELD32(0x00010000) +#define RF_CSR_CFG_BUSY FIELD32(0x00020000) + +/* + * MT7620 RF registers (reversed order) + */ +#define RF_CSR_CFG_DATA_MT7620 FIELD32(0x0000ff00) +#define RF_CSR_CFG_REGNUM_MT7620 FIELD32(0x03ff0000) +#define RF_CSR_CFG_WRITE_MT7620 FIELD32(0x00000010) +#define RF_CSR_CFG_BUSY_MT7620 FIELD32(0x00000001) + +/* undocumented registers for calibration of new MAC */ +#define RF_CONTROL0 0x0518 +#define RF_BYPASS0 0x051c +#define RF_CONTROL1 0x0520 +#define RF_BYPASS1 0x0524 +#define RF_CONTROL2 0x0528 +#define RF_BYPASS2 0x052c +#define RF_CONTROL3 0x0530 +#define RF_BYPASS3 0x0534 + +/* + * EFUSE_CSR: RT30x0 EEPROM + */ +#define EFUSE_CTRL 0x0580 +#define EFUSE_CTRL_ADDRESS_IN FIELD32(0x03fe0000) +#define EFUSE_CTRL_MODE FIELD32(0x000000c0) +#define EFUSE_CTRL_KICK FIELD32(0x40000000) +#define EFUSE_CTRL_PRESENT FIELD32(0x80000000) + +/* + * EFUSE_DATA0 + */ +#define EFUSE_DATA0 0x0590 + +/* + * EFUSE_DATA1 + */ +#define EFUSE_DATA1 0x0594 + +/* + * EFUSE_DATA2 + */ +#define EFUSE_DATA2 0x0598 + +/* + * EFUSE_DATA3 + */ +#define EFUSE_DATA3 0x059c + +/* + * LDO_CFG0 + */ +#define LDO_CFG0 0x05d4 +#define LDO_CFG0_DELAY3 FIELD32(0x000000ff) +#define LDO_CFG0_DELAY2 FIELD32(0x0000ff00) +#define LDO_CFG0_DELAY1 FIELD32(0x00ff0000) +#define LDO_CFG0_BGSEL FIELD32(0x03000000) +#define LDO_CFG0_LDO_CORE_VLEVEL FIELD32(0x1c000000) +#define LD0_CFG0_LDO25_LEVEL FIELD32(0x60000000) +#define LDO_CFG0_LDO25_LARGEA FIELD32(0x80000000) + +/* + * GPIO_SWITCH + */ +#define GPIO_SWITCH 0x05dc +#define GPIO_SWITCH_0 FIELD32(0x00000001) +#define GPIO_SWITCH_1 FIELD32(0x00000002) +#define GPIO_SWITCH_2 FIELD32(0x00000004) +#define GPIO_SWITCH_3 FIELD32(0x00000008) +#define GPIO_SWITCH_4 FIELD32(0x00000010) +#define GPIO_SWITCH_5 FIELD32(0x00000020) +#define GPIO_SWITCH_6 FIELD32(0x00000040) +#define GPIO_SWITCH_7 FIELD32(0x00000080) + +/* + * FIXME: where the DEBUG_INDEX name come from? + */ +#define MAC_DEBUG_INDEX 0x05e8 +#define MAC_DEBUG_INDEX_XTAL FIELD32(0x80000000) + +/* + * MAC Control/Status Registers(CSR). + * Some values are set in TU, whereas 1 TU == 1024 us. + */ + +/* + * MAC_CSR0: ASIC revision number. + * ASIC_REV: 0 + * ASIC_VER: 2860 or 2870 + */ +#define MAC_CSR0 0x1000 +#define MAC_CSR0_REVISION FIELD32(0x0000ffff) +#define MAC_CSR0_CHIPSET FIELD32(0xffff0000) + +/* + * MAC_SYS_CTRL: + */ +#define MAC_SYS_CTRL 0x1004 +#define MAC_SYS_CTRL_RESET_CSR FIELD32(0x00000001) +#define MAC_SYS_CTRL_RESET_BBP FIELD32(0x00000002) +#define MAC_SYS_CTRL_ENABLE_TX FIELD32(0x00000004) +#define MAC_SYS_CTRL_ENABLE_RX FIELD32(0x00000008) +#define MAC_SYS_CTRL_CONTINUOUS_TX FIELD32(0x00000010) +#define MAC_SYS_CTRL_LOOPBACK FIELD32(0x00000020) +#define MAC_SYS_CTRL_WLAN_HALT FIELD32(0x00000040) +#define MAC_SYS_CTRL_RX_TIMESTAMP FIELD32(0x00000080) + +/* + * MAC_ADDR_DW0: STA MAC register 0 + */ +#define MAC_ADDR_DW0 0x1008 +#define MAC_ADDR_DW0_BYTE0 FIELD32(0x000000ff) +#define MAC_ADDR_DW0_BYTE1 FIELD32(0x0000ff00) +#define MAC_ADDR_DW0_BYTE2 FIELD32(0x00ff0000) +#define MAC_ADDR_DW0_BYTE3 FIELD32(0xff000000) + +/* + * MAC_ADDR_DW1: STA MAC register 1 + * UNICAST_TO_ME_MASK: + * Used to mask off bits from byte 5 of the MAC address + * to determine the UNICAST_TO_ME bit for RX frames. + * The full mask is complemented by BSS_ID_MASK: + * MASK = BSS_ID_MASK & UNICAST_TO_ME_MASK + */ +#define MAC_ADDR_DW1 0x100c +#define MAC_ADDR_DW1_BYTE4 FIELD32(0x000000ff) +#define MAC_ADDR_DW1_BYTE5 FIELD32(0x0000ff00) +#define MAC_ADDR_DW1_UNICAST_TO_ME_MASK FIELD32(0x00ff0000) + +/* + * MAC_BSSID_DW0: BSSID register 0 + */ +#define MAC_BSSID_DW0 0x1010 +#define MAC_BSSID_DW0_BYTE0 FIELD32(0x000000ff) +#define MAC_BSSID_DW0_BYTE1 FIELD32(0x0000ff00) +#define MAC_BSSID_DW0_BYTE2 FIELD32(0x00ff0000) +#define MAC_BSSID_DW0_BYTE3 FIELD32(0xff000000) + +/* + * MAC_BSSID_DW1: BSSID register 1 + * BSS_ID_MASK: + * 0: 1-BSSID mode (BSS index = 0) + * 1: 2-BSSID mode (BSS index: Byte5, bit 0) + * 2: 4-BSSID mode (BSS index: byte5, bit 0 - 1) + * 3: 8-BSSID mode (BSS index: byte5, bit 0 - 2) + * This mask is used to mask off bits 0, 1 and 2 of byte 5 of the + * BSSID. This will make sure that those bits will be ignored + * when determining the MY_BSS of RX frames. + */ +#define MAC_BSSID_DW1 0x1014 +#define MAC_BSSID_DW1_BYTE4 FIELD32(0x000000ff) +#define MAC_BSSID_DW1_BYTE5 FIELD32(0x0000ff00) +#define MAC_BSSID_DW1_BSS_ID_MASK FIELD32(0x00030000) +#define MAC_BSSID_DW1_BSS_BCN_NUM FIELD32(0x001c0000) + +/* + * MAX_LEN_CFG: Maximum frame length register. + * MAX_MPDU: rt2860b max 16k bytes + * MAX_PSDU: Maximum PSDU length + * (power factor) 0:2^13, 1:2^14, 2:2^15, 3:2^16 + */ +#define MAX_LEN_CFG 0x1018 +#define MAX_LEN_CFG_MAX_MPDU FIELD32(0x00000fff) +#define MAX_LEN_CFG_MAX_PSDU FIELD32(0x00003000) +#define MAX_LEN_CFG_MIN_PSDU FIELD32(0x0000c000) +#define MAX_LEN_CFG_MIN_MPDU FIELD32(0x000f0000) + +/* + * BBP_CSR_CFG: BBP serial control register + * VALUE: Register value to program into BBP + * REG_NUM: Selected BBP register + * READ_CONTROL: 0 write BBP, 1 read BBP + * BUSY: ASIC is busy executing BBP commands + * BBP_PAR_DUR: 0 4 MAC clocks, 1 8 MAC clocks + * BBP_RW_MODE: 0 serial, 1 parallel + */ +#define BBP_CSR_CFG 0x101c +#define BBP_CSR_CFG_VALUE FIELD32(0x000000ff) +#define BBP_CSR_CFG_REGNUM FIELD32(0x0000ff00) +#define BBP_CSR_CFG_READ_CONTROL FIELD32(0x00010000) +#define BBP_CSR_CFG_BUSY FIELD32(0x00020000) +#define BBP_CSR_CFG_BBP_PAR_DUR FIELD32(0x00040000) +#define BBP_CSR_CFG_BBP_RW_MODE FIELD32(0x00080000) + +/* + * RF_CSR_CFG0: RF control register + * REGID_AND_VALUE: Register value to program into RF + * BITWIDTH: Selected RF register + * STANDBYMODE: 0 high when standby, 1 low when standby + * SEL: 0 RF_LE0 activate, 1 RF_LE1 activate + * BUSY: ASIC is busy executing RF commands + */ +#define RF_CSR_CFG0 0x1020 +#define RF_CSR_CFG0_REGID_AND_VALUE FIELD32(0x00ffffff) +#define RF_CSR_CFG0_BITWIDTH FIELD32(0x1f000000) +#define RF_CSR_CFG0_REG_VALUE_BW FIELD32(0x1fffffff) +#define RF_CSR_CFG0_STANDBYMODE FIELD32(0x20000000) +#define RF_CSR_CFG0_SEL FIELD32(0x40000000) +#define RF_CSR_CFG0_BUSY FIELD32(0x80000000) + +/* + * RF_CSR_CFG1: RF control register + * REGID_AND_VALUE: Register value to program into RF + * RFGAP: Gap between BB_CONTROL_RF and RF_LE + * 0: 3 system clock cycle (37.5usec) + * 1: 5 system clock cycle (62.5usec) + */ +#define RF_CSR_CFG1 0x1024 +#define RF_CSR_CFG1_REGID_AND_VALUE FIELD32(0x00ffffff) +#define RF_CSR_CFG1_RFGAP FIELD32(0x1f000000) + +/* + * RF_CSR_CFG2: RF control register + * VALUE: Register value to program into RF + */ +#define RF_CSR_CFG2 0x1028 +#define RF_CSR_CFG2_VALUE FIELD32(0x00ffffff) + +/* + * LED_CFG: LED control + * ON_PERIOD: LED active time (ms) during TX (only used for LED mode 1) + * OFF_PERIOD: LED inactive time (ms) during TX (only used for LED mode 1) + * SLOW_BLINK_PERIOD: LED blink interval in seconds (only used for LED mode 2) + * color LED's: + * 0: off + * 1: blinking upon TX2 + * 2: periodic slow blinking + * 3: always on + * LED polarity: + * 0: active low + * 1: active high + */ +#define LED_CFG 0x102c +#define LED_CFG_ON_PERIOD FIELD32(0x000000ff) +#define LED_CFG_OFF_PERIOD FIELD32(0x0000ff00) +#define LED_CFG_SLOW_BLINK_PERIOD FIELD32(0x003f0000) +#define LED_CFG_R_LED_MODE FIELD32(0x03000000) +#define LED_CFG_G_LED_MODE FIELD32(0x0c000000) +#define LED_CFG_Y_LED_MODE FIELD32(0x30000000) +#define LED_CFG_LED_POLAR FIELD32(0x40000000) + +/* + * AMPDU_BA_WINSIZE: Force BlockAck window size + * FORCE_WINSIZE_ENABLE: + * 0: Disable forcing of BlockAck window size + * 1: Enable forcing of BlockAck window size, overwrites values BlockAck + * window size values in the TXWI + * FORCE_WINSIZE: BlockAck window size + */ +#define AMPDU_BA_WINSIZE 0x1040 +#define AMPDU_BA_WINSIZE_FORCE_WINSIZE_ENABLE FIELD32(0x00000020) +#define AMPDU_BA_WINSIZE_FORCE_WINSIZE FIELD32(0x0000001f) + +/* + * XIFS_TIME_CFG: MAC timing + * CCKM_SIFS_TIME: unit 1us. Applied after CCK RX/TX + * OFDM_SIFS_TIME: unit 1us. Applied after OFDM RX/TX + * OFDM_XIFS_TIME: unit 1us. Applied after OFDM RX + * when MAC doesn't reference BBP signal BBRXEND + * EIFS: unit 1us + * BB_RXEND_ENABLE: reference RXEND signal to begin XIFS defer + * + */ +#define XIFS_TIME_CFG 0x1100 +#define XIFS_TIME_CFG_CCKM_SIFS_TIME FIELD32(0x000000ff) +#define XIFS_TIME_CFG_OFDM_SIFS_TIME FIELD32(0x0000ff00) +#define XIFS_TIME_CFG_OFDM_XIFS_TIME FIELD32(0x000f0000) +#define XIFS_TIME_CFG_EIFS FIELD32(0x1ff00000) +#define XIFS_TIME_CFG_BB_RXEND_ENABLE FIELD32(0x20000000) + +/* + * BKOFF_SLOT_CFG: + */ +#define BKOFF_SLOT_CFG 0x1104 +#define BKOFF_SLOT_CFG_SLOT_TIME FIELD32(0x000000ff) +#define BKOFF_SLOT_CFG_CC_DELAY_TIME FIELD32(0x0000ff00) + +/* + * NAV_TIME_CFG: + */ +#define NAV_TIME_CFG 0x1108 +#define NAV_TIME_CFG_SIFS FIELD32(0x000000ff) +#define NAV_TIME_CFG_SLOT_TIME FIELD32(0x0000ff00) +#define NAV_TIME_CFG_EIFS FIELD32(0x01ff0000) +#define NAV_TIME_ZERO_SIFS FIELD32(0x02000000) + +/* + * CH_TIME_CFG: count as channel busy + * EIFS_BUSY: Count EIFS as channel busy + * NAV_BUSY: Count NAS as channel busy + * RX_BUSY: Count RX as channel busy + * TX_BUSY: Count TX as channel busy + * TMR_EN: Enable channel statistics timer + */ +#define CH_TIME_CFG 0x110c +#define CH_TIME_CFG_EIFS_BUSY FIELD32(0x00000010) +#define CH_TIME_CFG_NAV_BUSY FIELD32(0x00000008) +#define CH_TIME_CFG_RX_BUSY FIELD32(0x00000004) +#define CH_TIME_CFG_TX_BUSY FIELD32(0x00000002) +#define CH_TIME_CFG_TMR_EN FIELD32(0x00000001) + +/* + * PBF_LIFE_TIMER: TX/RX MPDU timestamp timer (free run) Unit: 1us + */ +#define PBF_LIFE_TIMER 0x1110 + +/* + * BCN_TIME_CFG: + * BEACON_INTERVAL: in unit of 1/16 TU + * TSF_TICKING: Enable TSF auto counting + * TSF_SYNC: Enable TSF sync, 00: disable, 01: infra mode, 10: ad-hoc mode + * BEACON_GEN: Enable beacon generator + */ +#define BCN_TIME_CFG 0x1114 +#define BCN_TIME_CFG_BEACON_INTERVAL FIELD32(0x0000ffff) +#define BCN_TIME_CFG_TSF_TICKING FIELD32(0x00010000) +#define BCN_TIME_CFG_TSF_SYNC FIELD32(0x00060000) +#define BCN_TIME_CFG_TBTT_ENABLE FIELD32(0x00080000) +#define BCN_TIME_CFG_BEACON_GEN FIELD32(0x00100000) +#define BCN_TIME_CFG_TX_TIME_COMPENSATE FIELD32(0xf0000000) + +/* + * TBTT_SYNC_CFG: + * BCN_AIFSN: Beacon AIFSN after TBTT interrupt in slots + * BCN_CWMIN: Beacon CWMin after TBTT interrupt in slots + */ +#define TBTT_SYNC_CFG 0x1118 +#define TBTT_SYNC_CFG_TBTT_ADJUST FIELD32(0x000000ff) +#define TBTT_SYNC_CFG_BCN_EXP_WIN FIELD32(0x0000ff00) +#define TBTT_SYNC_CFG_BCN_AIFSN FIELD32(0x000f0000) +#define TBTT_SYNC_CFG_BCN_CWMIN FIELD32(0x00f00000) + +/* + * TSF_TIMER_DW0: Local lsb TSF timer, read-only + */ +#define TSF_TIMER_DW0 0x111c +#define TSF_TIMER_DW0_LOW_WORD FIELD32(0xffffffff) + +/* + * TSF_TIMER_DW1: Local msb TSF timer, read-only + */ +#define TSF_TIMER_DW1 0x1120 +#define TSF_TIMER_DW1_HIGH_WORD FIELD32(0xffffffff) + +/* + * TBTT_TIMER: TImer remains till next TBTT, read-only + */ +#define TBTT_TIMER 0x1124 + +/* + * INT_TIMER_CFG: timer configuration + * PRE_TBTT_TIMER: leadtime to tbtt for pretbtt interrupt in units of 1/16 TU + * GP_TIMER: period of general purpose timer in units of 1/16 TU + */ +#define INT_TIMER_CFG 0x1128 +#define INT_TIMER_CFG_PRE_TBTT_TIMER FIELD32(0x0000ffff) +#define INT_TIMER_CFG_GP_TIMER FIELD32(0xffff0000) + +/* + * INT_TIMER_EN: GP-timer and pre-tbtt Int enable + */ +#define INT_TIMER_EN 0x112c +#define INT_TIMER_EN_PRE_TBTT_TIMER FIELD32(0x00000001) +#define INT_TIMER_EN_GP_TIMER FIELD32(0x00000002) + +/* + * CH_IDLE_STA: channel idle time (in us) + */ +#define CH_IDLE_STA 0x1130 + +/* + * CH_BUSY_STA: channel busy time on primary channel (in us) + */ +#define CH_BUSY_STA 0x1134 + +/* + * CH_BUSY_STA_SEC: channel busy time on secondary channel in HT40 mode (in us) + */ +#define CH_BUSY_STA_SEC 0x1138 + +/* + * MAC_STATUS_CFG: + * BBP_RF_BUSY: When set to 0, BBP and RF are stable. + * if 1 or higher one of the 2 registers is busy. + */ +#define MAC_STATUS_CFG 0x1200 +#define MAC_STATUS_CFG_BBP_RF_BUSY FIELD32(0x00000003) + +/* + * PWR_PIN_CFG: + */ +#define PWR_PIN_CFG 0x1204 + +/* + * AUTOWAKEUP_CFG: Manual power control / status register + * TBCN_BEFORE_WAKE: ForceWake has high privilege than PutToSleep when both set + * AUTOWAKE: 0:sleep, 1:awake + */ +#define AUTOWAKEUP_CFG 0x1208 +#define AUTOWAKEUP_CFG_AUTO_LEAD_TIME FIELD32(0x000000ff) +#define AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE FIELD32(0x00007f00) +#define AUTOWAKEUP_CFG_AUTOWAKE FIELD32(0x00008000) + +/* + * MIMO_PS_CFG: MIMO Power-save Configuration + */ +#define MIMO_PS_CFG 0x1210 +#define MIMO_PS_CFG_MMPS_BB_EN FIELD32(0x00000001) +#define MIMO_PS_CFG_MMPS_RX_ANT_NUM FIELD32(0x00000006) +#define MIMO_PS_CFG_MMPS_RF_EN FIELD32(0x00000008) +#define MIMO_PS_CFG_RX_STBY_POL FIELD32(0x00000010) +#define MIMO_PS_CFG_RX_RX_STBY0 FIELD32(0x00000020) + +/* + * EDCA_AC0_CFG: + */ +#define EDCA_AC0_CFG 0x1300 +#define EDCA_AC0_CFG_TX_OP FIELD32(0x000000ff) +#define EDCA_AC0_CFG_AIFSN FIELD32(0x00000f00) +#define EDCA_AC0_CFG_CWMIN FIELD32(0x0000f000) +#define EDCA_AC0_CFG_CWMAX FIELD32(0x000f0000) + +/* + * EDCA_AC1_CFG: + */ +#define EDCA_AC1_CFG 0x1304 +#define EDCA_AC1_CFG_TX_OP FIELD32(0x000000ff) +#define EDCA_AC1_CFG_AIFSN FIELD32(0x00000f00) +#define EDCA_AC1_CFG_CWMIN FIELD32(0x0000f000) +#define EDCA_AC1_CFG_CWMAX FIELD32(0x000f0000) + +/* + * EDCA_AC2_CFG: + */ +#define EDCA_AC2_CFG 0x1308 +#define EDCA_AC2_CFG_TX_OP FIELD32(0x000000ff) +#define EDCA_AC2_CFG_AIFSN FIELD32(0x00000f00) +#define EDCA_AC2_CFG_CWMIN FIELD32(0x0000f000) +#define EDCA_AC2_CFG_CWMAX FIELD32(0x000f0000) + +/* + * EDCA_AC3_CFG: + */ +#define EDCA_AC3_CFG 0x130c +#define EDCA_AC3_CFG_TX_OP FIELD32(0x000000ff) +#define EDCA_AC3_CFG_AIFSN FIELD32(0x00000f00) +#define EDCA_AC3_CFG_CWMIN FIELD32(0x0000f000) +#define EDCA_AC3_CFG_CWMAX FIELD32(0x000f0000) + +/* + * EDCA_TID_AC_MAP: + */ +#define EDCA_TID_AC_MAP 0x1310 + +/* + * TX_PWR_CFG: + */ +#define TX_PWR_CFG_RATE0 FIELD32(0x0000000f) +#define TX_PWR_CFG_RATE1 FIELD32(0x000000f0) +#define TX_PWR_CFG_RATE2 FIELD32(0x00000f00) +#define TX_PWR_CFG_RATE3 FIELD32(0x0000f000) +#define TX_PWR_CFG_RATE4 FIELD32(0x000f0000) +#define TX_PWR_CFG_RATE5 FIELD32(0x00f00000) +#define TX_PWR_CFG_RATE6 FIELD32(0x0f000000) +#define TX_PWR_CFG_RATE7 FIELD32(0xf0000000) + +/* + * TX_PWR_CFG_0: + */ +#define TX_PWR_CFG_0 0x1314 +#define TX_PWR_CFG_0_1MBS FIELD32(0x0000000f) +#define TX_PWR_CFG_0_2MBS FIELD32(0x000000f0) +#define TX_PWR_CFG_0_55MBS FIELD32(0x00000f00) +#define TX_PWR_CFG_0_11MBS FIELD32(0x0000f000) +#define TX_PWR_CFG_0_6MBS FIELD32(0x000f0000) +#define TX_PWR_CFG_0_9MBS FIELD32(0x00f00000) +#define TX_PWR_CFG_0_12MBS FIELD32(0x0f000000) +#define TX_PWR_CFG_0_18MBS FIELD32(0xf0000000) +/* bits for 3T devices */ +#define TX_PWR_CFG_0_CCK1_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_0_CCK1_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_0_CCK5_CH0 FIELD32(0x00000f00) +#define TX_PWR_CFG_0_CCK5_CH1 FIELD32(0x0000f000) +#define TX_PWR_CFG_0_OFDM6_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_0_OFDM6_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_0_OFDM12_CH0 FIELD32(0x0f000000) +#define TX_PWR_CFG_0_OFDM12_CH1 FIELD32(0xf0000000) +/* bits for new 2T devices */ +#define TX_PWR_CFG_0B_1MBS_2MBS FIELD32(0x000000ff) +#define TX_PWR_CFG_0B_5MBS_11MBS FIELD32(0x0000ff00) +#define TX_PWR_CFG_0B_6MBS_9MBS FIELD32(0x00ff0000) +#define TX_PWR_CFG_0B_12MBS_18MBS FIELD32(0xff000000) + + +/* + * TX_PWR_CFG_1: + */ +#define TX_PWR_CFG_1 0x1318 +#define TX_PWR_CFG_1_24MBS FIELD32(0x0000000f) +#define TX_PWR_CFG_1_36MBS FIELD32(0x000000f0) +#define TX_PWR_CFG_1_48MBS FIELD32(0x00000f00) +#define TX_PWR_CFG_1_54MBS FIELD32(0x0000f000) +#define TX_PWR_CFG_1_MCS0 FIELD32(0x000f0000) +#define TX_PWR_CFG_1_MCS1 FIELD32(0x00f00000) +#define TX_PWR_CFG_1_MCS2 FIELD32(0x0f000000) +#define TX_PWR_CFG_1_MCS3 FIELD32(0xf0000000) +/* bits for 3T devices */ +#define TX_PWR_CFG_1_OFDM24_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_1_OFDM24_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_1_OFDM48_CH0 FIELD32(0x00000f00) +#define TX_PWR_CFG_1_OFDM48_CH1 FIELD32(0x0000f000) +#define TX_PWR_CFG_1_MCS0_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_1_MCS0_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_1_MCS2_CH0 FIELD32(0x0f000000) +#define TX_PWR_CFG_1_MCS2_CH1 FIELD32(0xf0000000) +/* bits for new 2T devices */ +#define TX_PWR_CFG_1B_24MBS_36MBS FIELD32(0x000000ff) +#define TX_PWR_CFG_1B_48MBS FIELD32(0x0000ff00) +#define TX_PWR_CFG_1B_MCS0_MCS1 FIELD32(0x00ff0000) +#define TX_PWR_CFG_1B_MCS2_MCS3 FIELD32(0xff000000) + +/* + * TX_PWR_CFG_2: + */ +#define TX_PWR_CFG_2 0x131c +#define TX_PWR_CFG_2_MCS4 FIELD32(0x0000000f) +#define TX_PWR_CFG_2_MCS5 FIELD32(0x000000f0) +#define TX_PWR_CFG_2_MCS6 FIELD32(0x00000f00) +#define TX_PWR_CFG_2_MCS7 FIELD32(0x0000f000) +#define TX_PWR_CFG_2_MCS8 FIELD32(0x000f0000) +#define TX_PWR_CFG_2_MCS9 FIELD32(0x00f00000) +#define TX_PWR_CFG_2_MCS10 FIELD32(0x0f000000) +#define TX_PWR_CFG_2_MCS11 FIELD32(0xf0000000) +/* bits for 3T devices */ +#define TX_PWR_CFG_2_MCS4_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_2_MCS4_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_2_MCS6_CH0 FIELD32(0x00000f00) +#define TX_PWR_CFG_2_MCS6_CH1 FIELD32(0x0000f000) +#define TX_PWR_CFG_2_MCS8_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_2_MCS8_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_2_MCS10_CH0 FIELD32(0x0f000000) +#define TX_PWR_CFG_2_MCS10_CH1 FIELD32(0xf0000000) +/* bits for new 2T devices */ +#define TX_PWR_CFG_2B_MCS4_MCS5 FIELD32(0x000000ff) +#define TX_PWR_CFG_2B_MCS6_MCS7 FIELD32(0x0000ff00) +#define TX_PWR_CFG_2B_MCS8_MCS9 FIELD32(0x00ff0000) +#define TX_PWR_CFG_2B_MCS10_MCS11 FIELD32(0xff000000) + +/* + * TX_PWR_CFG_3: + */ +#define TX_PWR_CFG_3 0x1320 +#define TX_PWR_CFG_3_MCS12 FIELD32(0x0000000f) +#define TX_PWR_CFG_3_MCS13 FIELD32(0x000000f0) +#define TX_PWR_CFG_3_MCS14 FIELD32(0x00000f00) +#define TX_PWR_CFG_3_MCS15 FIELD32(0x0000f000) +#define TX_PWR_CFG_3_UNKNOWN1 FIELD32(0x000f0000) +#define TX_PWR_CFG_3_UNKNOWN2 FIELD32(0x00f00000) +#define TX_PWR_CFG_3_UNKNOWN3 FIELD32(0x0f000000) +#define TX_PWR_CFG_3_UNKNOWN4 FIELD32(0xf0000000) +/* bits for 3T devices */ +#define TX_PWR_CFG_3_MCS12_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_3_MCS12_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_3_MCS14_CH0 FIELD32(0x00000f00) +#define TX_PWR_CFG_3_MCS14_CH1 FIELD32(0x0000f000) +#define TX_PWR_CFG_3_STBC0_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_3_STBC0_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_3_STBC2_CH0 FIELD32(0x0f000000) +#define TX_PWR_CFG_3_STBC2_CH1 FIELD32(0xf0000000) +/* bits for new 2T devices */ +#define TX_PWR_CFG_3B_MCS12_MCS13 FIELD32(0x000000ff) +#define TX_PWR_CFG_3B_MCS14 FIELD32(0x0000ff00) +#define TX_PWR_CFG_3B_STBC_MCS0_MCS1 FIELD32(0x00ff0000) +#define TX_PWR_CFG_3B_STBC_MCS2_MSC3 FIELD32(0xff000000) + +/* + * TX_PWR_CFG_4: + */ +#define TX_PWR_CFG_4 0x1324 +#define TX_PWR_CFG_4_UNKNOWN5 FIELD32(0x0000000f) +#define TX_PWR_CFG_4_UNKNOWN6 FIELD32(0x000000f0) +#define TX_PWR_CFG_4_UNKNOWN7 FIELD32(0x00000f00) +#define TX_PWR_CFG_4_UNKNOWN8 FIELD32(0x0000f000) +/* bits for 3T devices */ +#define TX_PWR_CFG_4_STBC4_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x00000f00) +#define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0x0000f000) +/* bits for new 2T devices */ +#define TX_PWR_CFG_4B_STBC_MCS4_MCS5 FIELD32(0x000000ff) +#define TX_PWR_CFG_4B_STBC_MCS6 FIELD32(0x0000ff00) + +/* + * TX_PIN_CFG: + */ +#define TX_PIN_CFG 0x1328 +#define TX_PIN_CFG_PA_PE_DISABLE 0xfcfffff0 +#define TX_PIN_CFG_PA_PE_A0_EN FIELD32(0x00000001) +#define TX_PIN_CFG_PA_PE_G0_EN FIELD32(0x00000002) +#define TX_PIN_CFG_PA_PE_A1_EN FIELD32(0x00000004) +#define TX_PIN_CFG_PA_PE_G1_EN FIELD32(0x00000008) +#define TX_PIN_CFG_PA_PE_A0_POL FIELD32(0x00000010) +#define TX_PIN_CFG_PA_PE_G0_POL FIELD32(0x00000020) +#define TX_PIN_CFG_PA_PE_A1_POL FIELD32(0x00000040) +#define TX_PIN_CFG_PA_PE_G1_POL FIELD32(0x00000080) +#define TX_PIN_CFG_LNA_PE_A0_EN FIELD32(0x00000100) +#define TX_PIN_CFG_LNA_PE_G0_EN FIELD32(0x00000200) +#define TX_PIN_CFG_LNA_PE_A1_EN FIELD32(0x00000400) +#define TX_PIN_CFG_LNA_PE_G1_EN FIELD32(0x00000800) +#define TX_PIN_CFG_LNA_PE_A0_POL FIELD32(0x00001000) +#define TX_PIN_CFG_LNA_PE_G0_POL FIELD32(0x00002000) +#define TX_PIN_CFG_LNA_PE_A1_POL FIELD32(0x00004000) +#define TX_PIN_CFG_LNA_PE_G1_POL FIELD32(0x00008000) +#define TX_PIN_CFG_RFTR_EN FIELD32(0x00010000) +#define TX_PIN_CFG_RFTR_POL FIELD32(0x00020000) +#define TX_PIN_CFG_TRSW_EN FIELD32(0x00040000) +#define TX_PIN_CFG_TRSW_POL FIELD32(0x00080000) +#define TX_PIN_CFG_RFRX_EN FIELD32(0x00100000) +#define TX_PIN_CFG_RFRX_POL FIELD32(0x00200000) +#define TX_PIN_CFG_PA_PE_A2_EN FIELD32(0x01000000) +#define TX_PIN_CFG_PA_PE_G2_EN FIELD32(0x02000000) +#define TX_PIN_CFG_PA_PE_A2_POL FIELD32(0x04000000) +#define TX_PIN_CFG_PA_PE_G2_POL FIELD32(0x08000000) +#define TX_PIN_CFG_LNA_PE_A2_EN FIELD32(0x10000000) +#define TX_PIN_CFG_LNA_PE_G2_EN FIELD32(0x20000000) +#define TX_PIN_CFG_LNA_PE_A2_POL FIELD32(0x40000000) +#define TX_PIN_CFG_LNA_PE_G2_POL FIELD32(0x80000000) + +/* + * TX_BAND_CFG: 0x1 use upper 20MHz, 0x0 use lower 20MHz + */ +#define TX_BAND_CFG 0x132c +#define TX_BAND_CFG_HT40_MINUS FIELD32(0x00000001) +#define TX_BAND_CFG_A FIELD32(0x00000002) +#define TX_BAND_CFG_BG FIELD32(0x00000004) + +/* + * TX_SW_CFG0: + */ +#define TX_SW_CFG0 0x1330 + +/* + * TX_SW_CFG1: + */ +#define TX_SW_CFG1 0x1334 + +/* + * TX_SW_CFG2: + */ +#define TX_SW_CFG2 0x1338 + +/* + * TXOP_THRES_CFG: + */ +#define TXOP_THRES_CFG 0x133c + +/* + * TXOP_CTRL_CFG: + * TIMEOUT_TRUN_EN: Enable/Disable TXOP timeout truncation + * AC_TRUN_EN: Enable/Disable truncation for AC change + * TXRATEGRP_TRUN_EN: Enable/Disable truncation for TX rate group change + * USER_MODE_TRUN_EN: Enable/Disable truncation for user TXOP mode + * MIMO_PS_TRUN_EN: Enable/Disable truncation for MIMO PS RTS/CTS + * RESERVED_TRUN_EN: Reserved + * LSIG_TXOP_EN: Enable/Disable L-SIG TXOP protection + * EXT_CCA_EN: Enable/Disable extension channel CCA reference (Defer 40Mhz + * transmissions if extension CCA is clear). + * EXT_CCA_DLY: Extension CCA signal delay time (unit: us) + * EXT_CWMIN: CwMin for extension channel backoff + * 0: Disabled + * + */ +#define TXOP_CTRL_CFG 0x1340 +#define TXOP_CTRL_CFG_TIMEOUT_TRUN_EN FIELD32(0x00000001) +#define TXOP_CTRL_CFG_AC_TRUN_EN FIELD32(0x00000002) +#define TXOP_CTRL_CFG_TXRATEGRP_TRUN_EN FIELD32(0x00000004) +#define TXOP_CTRL_CFG_USER_MODE_TRUN_EN FIELD32(0x00000008) +#define TXOP_CTRL_CFG_MIMO_PS_TRUN_EN FIELD32(0x00000010) +#define TXOP_CTRL_CFG_RESERVED_TRUN_EN FIELD32(0x00000020) +#define TXOP_CTRL_CFG_LSIG_TXOP_EN FIELD32(0x00000040) +#define TXOP_CTRL_CFG_EXT_CCA_EN FIELD32(0x00000080) +#define TXOP_CTRL_CFG_EXT_CCA_DLY FIELD32(0x0000ff00) +#define TXOP_CTRL_CFG_EXT_CWMIN FIELD32(0x000f0000) + +/* + * TX_RTS_CFG: + * RTS_THRES: unit:byte + * RTS_FBK_EN: enable rts rate fallback + */ +#define TX_RTS_CFG 0x1344 +#define TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT FIELD32(0x000000ff) +#define TX_RTS_CFG_RTS_THRES FIELD32(0x00ffff00) +#define TX_RTS_CFG_RTS_FBK_EN FIELD32(0x01000000) + +/* + * TX_TIMEOUT_CFG: + * MPDU_LIFETIME: expiration time = 2^(9+MPDU LIFE TIME) us + * RX_ACK_TIMEOUT: unit:slot. Used for TX procedure + * TX_OP_TIMEOUT: TXOP timeout value for TXOP truncation. + * it is recommended that: + * (SLOT_TIME) > (TX_OP_TIMEOUT) > (RX_ACK_TIMEOUT) + */ +#define TX_TIMEOUT_CFG 0x1348 +#define TX_TIMEOUT_CFG_MPDU_LIFETIME FIELD32(0x000000f0) +#define TX_TIMEOUT_CFG_RX_ACK_TIMEOUT FIELD32(0x0000ff00) +#define TX_TIMEOUT_CFG_TX_OP_TIMEOUT FIELD32(0x00ff0000) + +/* + * TX_RTY_CFG: + * SHORT_RTY_LIMIT: short retry limit + * LONG_RTY_LIMIT: long retry limit + * LONG_RTY_THRE: Long retry threshoold + * NON_AGG_RTY_MODE: Non-Aggregate MPDU retry mode + * 0:expired by retry limit, 1: expired by mpdu life timer + * AGG_RTY_MODE: Aggregate MPDU retry mode + * 0:expired by retry limit, 1: expired by mpdu life timer + * TX_AUTO_FB_ENABLE: Tx retry PHY rate auto fallback enable + */ +#define TX_RTY_CFG 0x134c +#define TX_RTY_CFG_SHORT_RTY_LIMIT FIELD32(0x000000ff) +#define TX_RTY_CFG_LONG_RTY_LIMIT FIELD32(0x0000ff00) +#define TX_RTY_CFG_LONG_RTY_THRE FIELD32(0x0fff0000) +#define TX_RTY_CFG_NON_AGG_RTY_MODE FIELD32(0x10000000) +#define TX_RTY_CFG_AGG_RTY_MODE FIELD32(0x20000000) +#define TX_RTY_CFG_TX_AUTO_FB_ENABLE FIELD32(0x40000000) + +/* + * TX_LINK_CFG: + * REMOTE_MFB_LIFETIME: remote MFB life time. unit: 32us + * MFB_ENABLE: TX apply remote MFB 1:enable + * REMOTE_UMFS_ENABLE: remote unsolicit MFB enable + * 0: not apply remote remote unsolicit (MFS=7) + * TX_MRQ_EN: MCS request TX enable + * TX_RDG_EN: RDG TX enable + * TX_CF_ACK_EN: Piggyback CF-ACK enable + * REMOTE_MFB: remote MCS feedback + * REMOTE_MFS: remote MCS feedback sequence number + */ +#define TX_LINK_CFG 0x1350 +#define TX_LINK_CFG_REMOTE_MFB_LIFETIME FIELD32(0x000000ff) +#define TX_LINK_CFG_MFB_ENABLE FIELD32(0x00000100) +#define TX_LINK_CFG_REMOTE_UMFS_ENABLE FIELD32(0x00000200) +#define TX_LINK_CFG_TX_MRQ_EN FIELD32(0x00000400) +#define TX_LINK_CFG_TX_RDG_EN FIELD32(0x00000800) +#define TX_LINK_CFG_TX_CF_ACK_EN FIELD32(0x00001000) +#define TX_LINK_CFG_REMOTE_MFB FIELD32(0x00ff0000) +#define TX_LINK_CFG_REMOTE_MFS FIELD32(0xff000000) + +/* + * HT_FBK_CFG0: + */ +#define HT_FBK_CFG0 0x1354 +#define HT_FBK_CFG0_HTMCS0FBK FIELD32(0x0000000f) +#define HT_FBK_CFG0_HTMCS1FBK FIELD32(0x000000f0) +#define HT_FBK_CFG0_HTMCS2FBK FIELD32(0x00000f00) +#define HT_FBK_CFG0_HTMCS3FBK FIELD32(0x0000f000) +#define HT_FBK_CFG0_HTMCS4FBK FIELD32(0x000f0000) +#define HT_FBK_CFG0_HTMCS5FBK FIELD32(0x00f00000) +#define HT_FBK_CFG0_HTMCS6FBK FIELD32(0x0f000000) +#define HT_FBK_CFG0_HTMCS7FBK FIELD32(0xf0000000) + +/* + * HT_FBK_CFG1: + */ +#define HT_FBK_CFG1 0x1358 +#define HT_FBK_CFG1_HTMCS8FBK FIELD32(0x0000000f) +#define HT_FBK_CFG1_HTMCS9FBK FIELD32(0x000000f0) +#define HT_FBK_CFG1_HTMCS10FBK FIELD32(0x00000f00) +#define HT_FBK_CFG1_HTMCS11FBK FIELD32(0x0000f000) +#define HT_FBK_CFG1_HTMCS12FBK FIELD32(0x000f0000) +#define HT_FBK_CFG1_HTMCS13FBK FIELD32(0x00f00000) +#define HT_FBK_CFG1_HTMCS14FBK FIELD32(0x0f000000) +#define HT_FBK_CFG1_HTMCS15FBK FIELD32(0xf0000000) + +/* + * LG_FBK_CFG0: + */ +#define LG_FBK_CFG0 0x135c +#define LG_FBK_CFG0_OFDMMCS0FBK FIELD32(0x0000000f) +#define LG_FBK_CFG0_OFDMMCS1FBK FIELD32(0x000000f0) +#define LG_FBK_CFG0_OFDMMCS2FBK FIELD32(0x00000f00) +#define LG_FBK_CFG0_OFDMMCS3FBK FIELD32(0x0000f000) +#define LG_FBK_CFG0_OFDMMCS4FBK FIELD32(0x000f0000) +#define LG_FBK_CFG0_OFDMMCS5FBK FIELD32(0x00f00000) +#define LG_FBK_CFG0_OFDMMCS6FBK FIELD32(0x0f000000) +#define LG_FBK_CFG0_OFDMMCS7FBK FIELD32(0xf0000000) + +/* + * LG_FBK_CFG1: + */ +#define LG_FBK_CFG1 0x1360 +#define LG_FBK_CFG0_CCKMCS0FBK FIELD32(0x0000000f) +#define LG_FBK_CFG0_CCKMCS1FBK FIELD32(0x000000f0) +#define LG_FBK_CFG0_CCKMCS2FBK FIELD32(0x00000f00) +#define LG_FBK_CFG0_CCKMCS3FBK FIELD32(0x0000f000) + +/* + * CCK_PROT_CFG: CCK Protection + * PROTECT_RATE: Protection control frame rate for CCK TX(RTS/CTS/CFEnd) + * PROTECT_CTRL: Protection control frame type for CCK TX + * 0:none, 1:RTS/CTS, 2:CTS-to-self + * PROTECT_NAV_SHORT: TXOP protection type for CCK TX with short NAV + * PROTECT_NAV_LONG: TXOP protection type for CCK TX with long NAV + * TX_OP_ALLOW_CCK: CCK TXOP allowance, 0:disallow + * TX_OP_ALLOW_OFDM: CCK TXOP allowance, 0:disallow + * TX_OP_ALLOW_MM20: CCK TXOP allowance, 0:disallow + * TX_OP_ALLOW_MM40: CCK TXOP allowance, 0:disallow + * TX_OP_ALLOW_GF20: CCK TXOP allowance, 0:disallow + * TX_OP_ALLOW_GF40: CCK TXOP allowance, 0:disallow + * RTS_TH_EN: RTS threshold enable on CCK TX + */ +#define CCK_PROT_CFG 0x1364 +#define CCK_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff) +#define CCK_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000) +#define CCK_PROT_CFG_PROTECT_NAV_SHORT FIELD32(0x00040000) +#define CCK_PROT_CFG_PROTECT_NAV_LONG FIELD32(0x00080000) +#define CCK_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000) +#define CCK_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000) +#define CCK_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000) +#define CCK_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000) +#define CCK_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000) +#define CCK_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000) +#define CCK_PROT_CFG_RTS_TH_EN FIELD32(0x04000000) + +/* + * OFDM_PROT_CFG: OFDM Protection + */ +#define OFDM_PROT_CFG 0x1368 +#define OFDM_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff) +#define OFDM_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000) +#define OFDM_PROT_CFG_PROTECT_NAV_SHORT FIELD32(0x00040000) +#define OFDM_PROT_CFG_PROTECT_NAV_LONG FIELD32(0x00080000) +#define OFDM_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000) +#define OFDM_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000) +#define OFDM_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000) +#define OFDM_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000) +#define OFDM_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000) +#define OFDM_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000) +#define OFDM_PROT_CFG_RTS_TH_EN FIELD32(0x04000000) + +/* + * MM20_PROT_CFG: MM20 Protection + */ +#define MM20_PROT_CFG 0x136c +#define MM20_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff) +#define MM20_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000) +#define MM20_PROT_CFG_PROTECT_NAV_SHORT FIELD32(0x00040000) +#define MM20_PROT_CFG_PROTECT_NAV_LONG FIELD32(0x00080000) +#define MM20_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000) +#define MM20_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000) +#define MM20_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000) +#define MM20_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000) +#define MM20_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000) +#define MM20_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000) +#define MM20_PROT_CFG_RTS_TH_EN FIELD32(0x04000000) + +/* + * MM40_PROT_CFG: MM40 Protection + */ +#define MM40_PROT_CFG 0x1370 +#define MM40_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff) +#define MM40_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000) +#define MM40_PROT_CFG_PROTECT_NAV_SHORT FIELD32(0x00040000) +#define MM40_PROT_CFG_PROTECT_NAV_LONG FIELD32(0x00080000) +#define MM40_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000) +#define MM40_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000) +#define MM40_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000) +#define MM40_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000) +#define MM40_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000) +#define MM40_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000) +#define MM40_PROT_CFG_RTS_TH_EN FIELD32(0x04000000) + +/* + * GF20_PROT_CFG: GF20 Protection + */ +#define GF20_PROT_CFG 0x1374 +#define GF20_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff) +#define GF20_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000) +#define GF20_PROT_CFG_PROTECT_NAV_SHORT FIELD32(0x00040000) +#define GF20_PROT_CFG_PROTECT_NAV_LONG FIELD32(0x00080000) +#define GF20_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000) +#define GF20_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000) +#define GF20_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000) +#define GF20_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000) +#define GF20_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000) +#define GF20_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000) +#define GF20_PROT_CFG_RTS_TH_EN FIELD32(0x04000000) + +/* + * GF40_PROT_CFG: GF40 Protection + */ +#define GF40_PROT_CFG 0x1378 +#define GF40_PROT_CFG_PROTECT_RATE FIELD32(0x0000ffff) +#define GF40_PROT_CFG_PROTECT_CTRL FIELD32(0x00030000) +#define GF40_PROT_CFG_PROTECT_NAV_SHORT FIELD32(0x00040000) +#define GF40_PROT_CFG_PROTECT_NAV_LONG FIELD32(0x00080000) +#define GF40_PROT_CFG_TX_OP_ALLOW_CCK FIELD32(0x00100000) +#define GF40_PROT_CFG_TX_OP_ALLOW_OFDM FIELD32(0x00200000) +#define GF40_PROT_CFG_TX_OP_ALLOW_MM20 FIELD32(0x00400000) +#define GF40_PROT_CFG_TX_OP_ALLOW_MM40 FIELD32(0x00800000) +#define GF40_PROT_CFG_TX_OP_ALLOW_GF20 FIELD32(0x01000000) +#define GF40_PROT_CFG_TX_OP_ALLOW_GF40 FIELD32(0x02000000) +#define GF40_PROT_CFG_RTS_TH_EN FIELD32(0x04000000) + +/* + * EXP_CTS_TIME: + */ +#define EXP_CTS_TIME 0x137c + +/* + * EXP_ACK_TIME: + */ +#define EXP_ACK_TIME 0x1380 + +/* TX_PWR_CFG_5 */ +#define TX_PWR_CFG_5 0x1384 +#define TX_PWR_CFG_5_MCS16_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_5_MCS16_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_5_MCS16_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_5_MCS18_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_5_MCS18_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_5_MCS18_CH2 FIELD32(0x0f000000) + +/* TX_PWR_CFG_6 */ +#define TX_PWR_CFG_6 0x1388 +#define TX_PWR_CFG_6_MCS20_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_6_MCS20_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_6_MCS20_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_6_MCS22_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_6_MCS22_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_6_MCS22_CH2 FIELD32(0x0f000000) + +/* TX_PWR_CFG_0_EXT */ +#define TX_PWR_CFG_0_EXT 0x1390 +#define TX_PWR_CFG_0_EXT_CCK1_CH2 FIELD32(0x0000000f) +#define TX_PWR_CFG_0_EXT_CCK5_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_0_EXT_OFDM6_CH2 FIELD32(0x000f0000) +#define TX_PWR_CFG_0_EXT_OFDM12_CH2 FIELD32(0x0f000000) + +/* TX_PWR_CFG_1_EXT */ +#define TX_PWR_CFG_1_EXT 0x1394 +#define TX_PWR_CFG_1_EXT_OFDM24_CH2 FIELD32(0x0000000f) +#define TX_PWR_CFG_1_EXT_OFDM48_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_1_EXT_MCS0_CH2 FIELD32(0x000f0000) +#define TX_PWR_CFG_1_EXT_MCS2_CH2 FIELD32(0x0f000000) + +/* TX_PWR_CFG_2_EXT */ +#define TX_PWR_CFG_2_EXT 0x1398 +#define TX_PWR_CFG_2_EXT_MCS4_CH2 FIELD32(0x0000000f) +#define TX_PWR_CFG_2_EXT_MCS6_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_2_EXT_MCS8_CH2 FIELD32(0x000f0000) +#define TX_PWR_CFG_2_EXT_MCS10_CH2 FIELD32(0x0f000000) + +/* TX_PWR_CFG_3_EXT */ +#define TX_PWR_CFG_3_EXT 0x139c +#define TX_PWR_CFG_3_EXT_MCS12_CH2 FIELD32(0x0000000f) +#define TX_PWR_CFG_3_EXT_MCS14_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_3_EXT_STBC0_CH2 FIELD32(0x000f0000) +#define TX_PWR_CFG_3_EXT_STBC2_CH2 FIELD32(0x0f000000) + +/* TX_PWR_CFG_4_EXT */ +#define TX_PWR_CFG_4_EXT 0x13a0 +#define TX_PWR_CFG_4_EXT_STBC4_CH2 FIELD32(0x0000000f) +#define TX_PWR_CFG_4_EXT_STBC6_CH2 FIELD32(0x00000f00) + +/* TXn_RF_GAIN_CORRECT: RF Gain Correction for each RF_ALC[3:2] + * Unit: 0.1 dB, Range: -3.2 dB to 3.1 dB + */ +#define TX0_RF_GAIN_CORRECT 0x13a0 +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f) +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00) +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000) +#define TX0_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000) + +#define TX1_RF_GAIN_CORRECT 0x13a4 +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f) +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00) +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000) +#define TX1_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000) + +/* TXn_RF_GAIN_ATTEN: TXn RF Gain Attenuation Level + * Format: 7-bit, signed value + * Unit: 0.5 dB, Range: -20 dB to -5 dB + */ +#define TX0_RF_GAIN_ATTEN 0x13a8 +#define TX0_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f) +#define TX0_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00) +#define TX0_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000) +#define TX0_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000) +#define TX1_RF_GAIN_ATTEN 0x13ac +#define TX1_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f) +#define TX1_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00) +#define TX1_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000) +#define TX1_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000) + +/* TX_ALC_CFG_0: TX Automatic Level Control Configuration 0 + * TX_ALC_LIMIT_n: TXn upper limit + * TX_ALC_CH_INIT_n: TXn channel initial transmission gain + * Unit: 0.5 dB, Range: 0 to 23.5 dB + */ +#define TX_ALC_CFG_0 0x13b0 +#define TX_ALC_CFG_0_CH_INIT_0 FIELD32(0x0000003f) +#define TX_ALC_CFG_0_CH_INIT_1 FIELD32(0x00003f00) +#define TX_ALC_CFG_0_LIMIT_0 FIELD32(0x003f0000) +#define TX_ALC_CFG_0_LIMIT_1 FIELD32(0x3f000000) + +/* TX_ALC_CFG_1: TX Automatic Level Control Configuration 1 + * TX_TEMP_COMP: TX Power Temperature Compensation + * Unit: 0.5 dB, Range: -10 dB to 10 dB + * TXn_GAIN_FINE: TXn Gain Fine Adjustment + * Unit: 0.1 dB, Range: -0.8 dB to 0.7 dB + * RF_TOS_DLY: Sets the RF_TOS_EN assertion delay after + * deassertion of PA_PE. + * Unit: 0.25 usec + * TXn_RF_GAIN_ATTEN: TXn RF gain attentuation selector + * RF_TOS_TIMEOUT: time-out value for RF_TOS_ENABLE + * deassertion if RF_TOS_DONE is missing. + * Unit: 0.25 usec + * RF_TOS_ENABLE: TX offset calibration enable + * ROS_BUSY_EN: RX offset calibration busy enable + */ +#define TX_ALC_CFG_1 0x13b4 +#define TX_ALC_CFG_1_TX_TEMP_COMP FIELD32(0x0000003f) +#define TX_ALC_CFG_1_TX0_GAIN_FINE FIELD32(0x00000f00) +#define TX_ALC_CFG_1_TX1_GAIN_FINE FIELD32(0x0000f000) +#define TX_ALC_CFG_1_RF_TOS_DLY FIELD32(0x00070000) +#define TX_ALC_CFG_1_TX0_RF_GAIN_ATTEN FIELD32(0x00300000) +#define TX_ALC_CFG_1_TX1_RF_GAIN_ATTEN FIELD32(0x00c00000) +#define TX_ALC_CFG_1_RF_TOS_TIMEOUT FIELD32(0x3f000000) +#define TX_ALC_CFG_1_RF_TOS_ENABLE FIELD32(0x40000000) +#define TX_ALC_CFG_1_ROS_BUSY_EN FIELD32(0x80000000) + +/* TXn_BB_GAIN_ATTEN: TXn RF Gain Attenuation Level + * Format: 5-bit signed values + * Unit: 0.5 dB, Range: -8 dB to 7 dB + */ +#define TX0_BB_GAIN_ATTEN 0x13c0 +#define TX0_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f) +#define TX0_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00) +#define TX0_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000) +#define TX0_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000) +#define TX1_BB_GAIN_ATTEN 0x13c4 +#define TX1_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f) +#define TX1_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00) +#define TX1_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000) +#define TX1_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000) + +/* TX_ALC_VGA3: TX Automatic Level Correction Variable Gain Amplifier 3 */ +#define TX_ALC_VGA3 0x13c8 +#define TX_ALC_VGA3_TX0_ALC_VGA3 FIELD32(0x0000001f) +#define TX_ALC_VGA3_TX1_ALC_VGA3 FIELD32(0x00001f00) +#define TX_ALC_VGA3_TX0_ALC_VGA2 FIELD32(0x001f0000) +#define TX_ALC_VGA3_TX1_ALC_VGA2 FIELD32(0x1f000000) + +/* TX_PWR_CFG_7 */ +#define TX_PWR_CFG_7 0x13d4 +#define TX_PWR_CFG_7_OFDM54_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_7_OFDM54_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_7_OFDM54_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_7_MCS7_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_7_MCS7_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_7_MCS7_CH2 FIELD32(0x0f000000) +/* bits for new 2T devices */ +#define TX_PWR_CFG_7B_54MBS FIELD32(0x000000ff) +#define TX_PWR_CFG_7B_MCS7 FIELD32(0x00ff0000) + + +/* TX_PWR_CFG_8 */ +#define TX_PWR_CFG_8 0x13d8 +#define TX_PWR_CFG_8_MCS15_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_8_MCS15_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_8_MCS15_CH2 FIELD32(0x00000f00) +#define TX_PWR_CFG_8_MCS23_CH0 FIELD32(0x000f0000) +#define TX_PWR_CFG_8_MCS23_CH1 FIELD32(0x00f00000) +#define TX_PWR_CFG_8_MCS23_CH2 FIELD32(0x0f000000) +/* bits for new 2T devices */ +#define TX_PWR_CFG_8B_MCS15 FIELD32(0x000000ff) + + +/* TX_PWR_CFG_9 */ +#define TX_PWR_CFG_9 0x13dc +#define TX_PWR_CFG_9_STBC7_CH0 FIELD32(0x0000000f) +#define TX_PWR_CFG_9_STBC7_CH1 FIELD32(0x000000f0) +#define TX_PWR_CFG_9_STBC7_CH2 FIELD32(0x00000f00) +/* bits for new 2T devices */ +#define TX_PWR_CFG_9B_STBC_MCS7 FIELD32(0x000000ff) + +/* + * TX_TXBF_CFG: + */ +#define TX_TXBF_CFG_0 0x138c +#define TX_TXBF_CFG_1 0x13a4 +#define TX_TXBF_CFG_2 0x13a8 +#define TX_TXBF_CFG_3 0x13ac + +/* + * TX_FBK_CFG_3S: + */ +#define TX_FBK_CFG_3S_0 0x13c4 +#define TX_FBK_CFG_3S_1 0x13c8 + +/* + * RX_FILTER_CFG: RX configuration register. + */ +#define RX_FILTER_CFG 0x1400 +#define RX_FILTER_CFG_DROP_CRC_ERROR FIELD32(0x00000001) +#define RX_FILTER_CFG_DROP_PHY_ERROR FIELD32(0x00000002) +#define RX_FILTER_CFG_DROP_NOT_TO_ME FIELD32(0x00000004) +#define RX_FILTER_CFG_DROP_NOT_MY_BSSD FIELD32(0x00000008) +#define RX_FILTER_CFG_DROP_VER_ERROR FIELD32(0x00000010) +#define RX_FILTER_CFG_DROP_MULTICAST FIELD32(0x00000020) +#define RX_FILTER_CFG_DROP_BROADCAST FIELD32(0x00000040) +#define RX_FILTER_CFG_DROP_DUPLICATE FIELD32(0x00000080) +#define RX_FILTER_CFG_DROP_CF_END_ACK FIELD32(0x00000100) +#define RX_FILTER_CFG_DROP_CF_END FIELD32(0x00000200) +#define RX_FILTER_CFG_DROP_ACK FIELD32(0x00000400) +#define RX_FILTER_CFG_DROP_CTS FIELD32(0x00000800) +#define RX_FILTER_CFG_DROP_RTS FIELD32(0x00001000) +#define RX_FILTER_CFG_DROP_PSPOLL FIELD32(0x00002000) +#define RX_FILTER_CFG_DROP_BA FIELD32(0x00004000) +#define RX_FILTER_CFG_DROP_BAR FIELD32(0x00008000) +#define RX_FILTER_CFG_DROP_CNTL FIELD32(0x00010000) + +/* + * AUTO_RSP_CFG: + * AUTORESPONDER: 0: disable, 1: enable + * BAC_ACK_POLICY: 0:long, 1:short preamble + * CTS_40_MMODE: Response CTS 40MHz duplicate mode + * CTS_40_MREF: Response CTS 40MHz duplicate mode + * AR_PREAMBLE: Auto responder preamble 0:long, 1:short preamble + * DUAL_CTS_EN: Power bit value in control frame + * ACK_CTS_PSM_BIT:Power bit value in control frame + */ +#define AUTO_RSP_CFG 0x1404 +#define AUTO_RSP_CFG_AUTORESPONDER FIELD32(0x00000001) +#define AUTO_RSP_CFG_BAC_ACK_POLICY FIELD32(0x00000002) +#define AUTO_RSP_CFG_CTS_40_MMODE FIELD32(0x00000004) +#define AUTO_RSP_CFG_CTS_40_MREF FIELD32(0x00000008) +#define AUTO_RSP_CFG_AR_PREAMBLE FIELD32(0x00000010) +#define AUTO_RSP_CFG_DUAL_CTS_EN FIELD32(0x00000040) +#define AUTO_RSP_CFG_ACK_CTS_PSM_BIT FIELD32(0x00000080) + +/* + * LEGACY_BASIC_RATE: + */ +#define LEGACY_BASIC_RATE 0x1408 + +/* + * HT_BASIC_RATE: + */ +#define HT_BASIC_RATE 0x140c + +/* + * HT_CTRL_CFG: + */ +#define HT_CTRL_CFG 0x1410 + +/* + * SIFS_COST_CFG: + */ +#define SIFS_COST_CFG 0x1414 + +/* + * RX_PARSER_CFG: + * Set NAV for all received frames + */ +#define RX_PARSER_CFG 0x1418 + +/* + * TX_SEC_CNT0: + */ +#define TX_SEC_CNT0 0x1500 + +/* + * RX_SEC_CNT0: + */ +#define RX_SEC_CNT0 0x1504 + +/* + * CCMP_FC_MUTE: + */ +#define CCMP_FC_MUTE 0x1508 + +/* + * TXOP_HLDR_ADDR0: + */ +#define TXOP_HLDR_ADDR0 0x1600 + +/* + * TXOP_HLDR_ADDR1: + */ +#define TXOP_HLDR_ADDR1 0x1604 + +/* + * TXOP_HLDR_ET: + */ +#define TXOP_HLDR_ET 0x1608 + +/* + * QOS_CFPOLL_RA_DW0: + */ +#define QOS_CFPOLL_RA_DW0 0x160c + +/* + * QOS_CFPOLL_RA_DW1: + */ +#define QOS_CFPOLL_RA_DW1 0x1610 + +/* + * QOS_CFPOLL_QC: + */ +#define QOS_CFPOLL_QC 0x1614 + +/* + * RX_STA_CNT0: RX PLCP error count & RX CRC error count + */ +#define RX_STA_CNT0 0x1700 +#define RX_STA_CNT0_CRC_ERR FIELD32(0x0000ffff) +#define RX_STA_CNT0_PHY_ERR FIELD32(0xffff0000) + +/* + * RX_STA_CNT1: RX False CCA count & RX LONG frame count + */ +#define RX_STA_CNT1 0x1704 +#define RX_STA_CNT1_FALSE_CCA FIELD32(0x0000ffff) +#define RX_STA_CNT1_PLCP_ERR FIELD32(0xffff0000) + +/* + * RX_STA_CNT2: + */ +#define RX_STA_CNT2 0x1708 +#define RX_STA_CNT2_RX_DUPLI_COUNT FIELD32(0x0000ffff) +#define RX_STA_CNT2_RX_FIFO_OVERFLOW FIELD32(0xffff0000) + +/* + * TX_STA_CNT0: TX Beacon count + */ +#define TX_STA_CNT0 0x170c +#define TX_STA_CNT0_TX_FAIL_COUNT FIELD32(0x0000ffff) +#define TX_STA_CNT0_TX_BEACON_COUNT FIELD32(0xffff0000) + +/* + * TX_STA_CNT1: TX tx count + */ +#define TX_STA_CNT1 0x1710 +#define TX_STA_CNT1_TX_SUCCESS FIELD32(0x0000ffff) +#define TX_STA_CNT1_TX_RETRANSMIT FIELD32(0xffff0000) + +/* + * TX_STA_CNT2: TX tx count + */ +#define TX_STA_CNT2 0x1714 +#define TX_STA_CNT2_TX_ZERO_LEN_COUNT FIELD32(0x0000ffff) +#define TX_STA_CNT2_TX_UNDER_FLOW_COUNT FIELD32(0xffff0000) + +/* + * TX_STA_FIFO: TX Result for specific PID status fifo register. + * + * This register is implemented as FIFO with 16 entries in the HW. Each + * register read fetches the next tx result. If the FIFO is full because + * it wasn't read fast enough after the according interrupt (TX_FIFO_STATUS) + * triggered, the hw seems to simply drop further tx results. + * + * VALID: 1: this tx result is valid + * 0: no valid tx result -> driver should stop reading + * PID_TYPE: The PID latched from the PID field in the TXWI, can be used + * to match a frame with its tx result (even though the PID is + * only 4 bits wide). + * PID_QUEUE: Part of PID_TYPE, this is the queue index number (0-3) + * PID_ENTRY: Part of PID_TYPE, this is the queue entry index number (1-3) + * This identification number is calculated by ((idx % 3) + 1). + * TX_SUCCESS: Indicates tx success (1) or failure (0) + * TX_AGGRE: Indicates if the frame was part of an aggregate (1) or not (0) + * TX_ACK_REQUIRED: Indicates if the frame needed to get ack'ed (1) or not (0) + * WCID: The wireless client ID. + * MCS: The tx rate used during the last transmission of this frame, be it + * successful or not. + * PHYMODE: The phymode used for the transmission. + */ +#define TX_STA_FIFO 0x1718 +#define TX_STA_FIFO_VALID FIELD32(0x00000001) +#define TX_STA_FIFO_PID_TYPE FIELD32(0x0000001e) +#define TX_STA_FIFO_PID_QUEUE FIELD32(0x00000006) +#define TX_STA_FIFO_PID_ENTRY FIELD32(0x00000018) +#define TX_STA_FIFO_TX_SUCCESS FIELD32(0x00000020) +#define TX_STA_FIFO_TX_AGGRE FIELD32(0x00000040) +#define TX_STA_FIFO_TX_ACK_REQUIRED FIELD32(0x00000080) +#define TX_STA_FIFO_WCID FIELD32(0x0000ff00) +#define TX_STA_FIFO_SUCCESS_RATE FIELD32(0xffff0000) +#define TX_STA_FIFO_MCS FIELD32(0x007f0000) +#define TX_STA_FIFO_BW FIELD32(0x00800000) +#define TX_STA_FIFO_SGI FIELD32(0x01000000) +#define TX_STA_FIFO_PHYMODE FIELD32(0xc0000000) + +/* + * TX_AGG_CNT: Debug counter + */ +#define TX_AGG_CNT 0x171c +#define TX_AGG_CNT_NON_AGG_TX_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT_AGG_TX_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT0: + */ +#define TX_AGG_CNT0 0x1720 +#define TX_AGG_CNT0_AGG_SIZE_1_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT0_AGG_SIZE_2_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT1: + */ +#define TX_AGG_CNT1 0x1724 +#define TX_AGG_CNT1_AGG_SIZE_3_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT1_AGG_SIZE_4_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT2: + */ +#define TX_AGG_CNT2 0x1728 +#define TX_AGG_CNT2_AGG_SIZE_5_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT2_AGG_SIZE_6_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT3: + */ +#define TX_AGG_CNT3 0x172c +#define TX_AGG_CNT3_AGG_SIZE_7_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT3_AGG_SIZE_8_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT4: + */ +#define TX_AGG_CNT4 0x1730 +#define TX_AGG_CNT4_AGG_SIZE_9_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT4_AGG_SIZE_10_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT5: + */ +#define TX_AGG_CNT5 0x1734 +#define TX_AGG_CNT5_AGG_SIZE_11_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT5_AGG_SIZE_12_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT6: + */ +#define TX_AGG_CNT6 0x1738 +#define TX_AGG_CNT6_AGG_SIZE_13_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT6_AGG_SIZE_14_COUNT FIELD32(0xffff0000) + +/* + * TX_AGG_CNT7: + */ +#define TX_AGG_CNT7 0x173c +#define TX_AGG_CNT7_AGG_SIZE_15_COUNT FIELD32(0x0000ffff) +#define TX_AGG_CNT7_AGG_SIZE_16_COUNT FIELD32(0xffff0000) + +/* + * MPDU_DENSITY_CNT: + * TX_ZERO_DEL: TX zero length delimiter count + * RX_ZERO_DEL: RX zero length delimiter count + */ +#define MPDU_DENSITY_CNT 0x1740 +#define MPDU_DENSITY_CNT_TX_ZERO_DEL FIELD32(0x0000ffff) +#define MPDU_DENSITY_CNT_RX_ZERO_DEL FIELD32(0xffff0000) + +/* + * Security key table memory. + * + * The pairwise key table shares some memory with the beacon frame + * buffers 6 and 7. That basically means that when beacon 6 & 7 + * are used we should only use the reduced pairwise key table which + * has a maximum of 222 entries. + * + * --------------------------------------------- + * |0x4000 | Pairwise Key | Reduced Pairwise | + * | | Table | Key Table | + * | | Size: 256 * 32 | Size: 222 * 32 | + * |0x5BC0 | |------------------- + * | | | Beacon 6 | + * |0x5DC0 | |------------------- + * | | | Beacon 7 | + * |0x5FC0 | |------------------- + * |0x5FFF | | + * -------------------------- + * + * MAC_WCID_BASE: 8-bytes (use only 6 bytes) * 256 entry + * PAIRWISE_KEY_TABLE_BASE: 32-byte * 256 entry + * MAC_IVEIV_TABLE_BASE: 8-byte * 256-entry + * MAC_WCID_ATTRIBUTE_BASE: 4-byte * 256-entry + * SHARED_KEY_TABLE_BASE: 32-byte * 16-entry + * SHARED_KEY_MODE_BASE: 4-byte * 16-entry + */ +#define MAC_WCID_BASE 0x1800 +#define PAIRWISE_KEY_TABLE_BASE 0x4000 +#define MAC_IVEIV_TABLE_BASE 0x6000 +#define MAC_WCID_ATTRIBUTE_BASE 0x6800 +#define SHARED_KEY_TABLE_BASE 0x6c00 +#define SHARED_KEY_MODE_BASE 0x7000 + +#define MAC_WCID_ENTRY(__idx) \ + (MAC_WCID_BASE + ((__idx) * sizeof(struct mac_wcid_entry))) +#define PAIRWISE_KEY_ENTRY(__idx) \ + (PAIRWISE_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry))) +#define MAC_IVEIV_ENTRY(__idx) \ + (MAC_IVEIV_TABLE_BASE + ((__idx) * sizeof(struct mac_iveiv_entry))) +#define MAC_WCID_ATTR_ENTRY(__idx) \ + (MAC_WCID_ATTRIBUTE_BASE + ((__idx) * sizeof(u32))) +#define SHARED_KEY_ENTRY(__idx) \ + (SHARED_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry))) +#define SHARED_KEY_MODE_ENTRY(__idx) \ + (SHARED_KEY_MODE_BASE + ((__idx) * sizeof(u32))) + +struct mac_wcid_entry { + u8 mac[6]; + u8 reserved[2]; +} __packed; + +struct hw_key_entry { + u8 key[16]; + u8 tx_mic[8]; + u8 rx_mic[8]; +} __packed; + +struct mac_iveiv_entry { + u8 iv[8]; +} __packed; + +/* + * MAC_WCID_ATTRIBUTE: + */ +#define MAC_WCID_ATTRIBUTE_KEYTAB FIELD32(0x00000001) +#define MAC_WCID_ATTRIBUTE_CIPHER FIELD32(0x0000000e) +#define MAC_WCID_ATTRIBUTE_BSS_IDX FIELD32(0x00000070) +#define MAC_WCID_ATTRIBUTE_RX_WIUDF FIELD32(0x00000380) +#define MAC_WCID_ATTRIBUTE_CIPHER_EXT FIELD32(0x00000400) +#define MAC_WCID_ATTRIBUTE_BSS_IDX_EXT FIELD32(0x00000800) +#define MAC_WCID_ATTRIBUTE_WAPI_MCBC FIELD32(0x00008000) +#define MAC_WCID_ATTRIBUTE_WAPI_KEY_IDX FIELD32(0xff000000) + +/* + * SHARED_KEY_MODE: + */ +#define SHARED_KEY_MODE_BSS0_KEY0 FIELD32(0x00000007) +#define SHARED_KEY_MODE_BSS0_KEY1 FIELD32(0x00000070) +#define SHARED_KEY_MODE_BSS0_KEY2 FIELD32(0x00000700) +#define SHARED_KEY_MODE_BSS0_KEY3 FIELD32(0x00007000) +#define SHARED_KEY_MODE_BSS1_KEY0 FIELD32(0x00070000) +#define SHARED_KEY_MODE_BSS1_KEY1 FIELD32(0x00700000) +#define SHARED_KEY_MODE_BSS1_KEY2 FIELD32(0x07000000) +#define SHARED_KEY_MODE_BSS1_KEY3 FIELD32(0x70000000) + +/* + * HOST-MCU communication + */ + +/* + * H2M_MAILBOX_CSR: Host-to-MCU Mailbox. + * CMD_TOKEN: Command id, 0xff disable status reporting. + */ +#define H2M_MAILBOX_CSR 0x7010 +#define H2M_MAILBOX_CSR_ARG0 FIELD32(0x000000ff) +#define H2M_MAILBOX_CSR_ARG1 FIELD32(0x0000ff00) +#define H2M_MAILBOX_CSR_CMD_TOKEN FIELD32(0x00ff0000) +#define H2M_MAILBOX_CSR_OWNER FIELD32(0xff000000) + +/* + * H2M_MAILBOX_CID: + * Free slots contain 0xff. MCU will store command's token to lowest free slot. + * If all slots are occupied status will be dropped. + */ +#define H2M_MAILBOX_CID 0x7014 +#define H2M_MAILBOX_CID_CMD0 FIELD32(0x000000ff) +#define H2M_MAILBOX_CID_CMD1 FIELD32(0x0000ff00) +#define H2M_MAILBOX_CID_CMD2 FIELD32(0x00ff0000) +#define H2M_MAILBOX_CID_CMD3 FIELD32(0xff000000) + +/* + * H2M_MAILBOX_STATUS: + * Command status will be saved to same slot as command id. + */ +#define H2M_MAILBOX_STATUS 0x701c + +/* + * H2M_INT_SRC: + */ +#define H2M_INT_SRC 0x7024 + +/* + * H2M_BBP_AGENT: + */ +#define H2M_BBP_AGENT 0x7028 + +/* + * MCU_LEDCS: LED control for MCU Mailbox. + */ +#define MCU_LEDCS_LED_MODE FIELD8(0x1f) +#define MCU_LEDCS_POLARITY FIELD8(0x01) + +/* + * HW_CS_CTS_BASE: + * Carrier-sense CTS frame base address. + * It's where mac stores carrier-sense frame for carrier-sense function. + */ +#define HW_CS_CTS_BASE 0x7700 + +/* + * HW_DFS_CTS_BASE: + * DFS CTS frame base address. It's where mac stores CTS frame for DFS. + */ +#define HW_DFS_CTS_BASE 0x7780 + +/* + * TXRX control registers - base address 0x3000 + */ + +/* + * TXRX_CSR1: + * rt2860b UNKNOWN reg use R/O Reg Addr 0x77d0 first.. + */ +#define TXRX_CSR1 0x77d0 + +/* + * HW_DEBUG_SETTING_BASE: + * since NULL frame won't be that long (256 byte) + * We steal 16 tail bytes to save debugging settings + */ +#define HW_DEBUG_SETTING_BASE 0x77f0 +#define HW_DEBUG_SETTING_BASE2 0x7770 + +/* + * HW_BEACON_BASE + * In order to support maximum 8 MBSS and its maximum length + * is 512 bytes for each beacon + * Three section discontinue memory segments will be used. + * 1. The original region for BCN 0~3 + * 2. Extract memory from FCE table for BCN 4~5 + * 3. Extract memory from Pair-wise key table for BCN 6~7 + * It occupied those memory of wcid 238~253 for BCN 6 + * and wcid 222~237 for BCN 7 (see Security key table memory + * for more info). + * + * IMPORTANT NOTE: Not sure why legacy driver does this, + * but HW_BEACON_BASE7 is 0x0200 bytes below HW_BEACON_BASE6. + */ +#define HW_BEACON_BASE0 0x7800 +#define HW_BEACON_BASE1 0x7a00 +#define HW_BEACON_BASE2 0x7c00 +#define HW_BEACON_BASE3 0x7e00 +#define HW_BEACON_BASE4 0x7200 +#define HW_BEACON_BASE5 0x7400 +#define HW_BEACON_BASE6 0x5dc0 +#define HW_BEACON_BASE7 0x5bc0 + +#define HW_BEACON_BASE(__index) \ + (((__index) < 4) ? (HW_BEACON_BASE0 + (__index * 0x0200)) : \ + (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \ + (HW_BEACON_BASE6 - ((__index - 6) * 0x0200)))) + +#define BEACON_BASE_TO_OFFSET(_base) (((_base) - 0x4000) / 64) + +/* + * BBP registers. + * The wordsize of the BBP is 8 bits. + */ + +/* + * BBP 1: TX Antenna & Power Control + * POWER_CTRL: + * 0 - normal, + * 1 - drop tx power by 6dBm, + * 2 - drop tx power by 12dBm, + * 3 - increase tx power by 6dBm + */ +#define BBP1_TX_POWER_CTRL FIELD8(0x03) +#define BBP1_TX_ANTENNA FIELD8(0x18) + +/* + * BBP 3: RX Antenna + */ +#define BBP3_RX_ADC FIELD8(0x03) +#define BBP3_RX_ANTENNA FIELD8(0x18) +#define BBP3_HT40_MINUS FIELD8(0x20) +#define BBP3_ADC_MODE_SWITCH FIELD8(0x40) +#define BBP3_ADC_INIT_MODE FIELD8(0x80) + +/* + * BBP 4: Bandwidth + */ +#define BBP4_TX_BF FIELD8(0x01) +#define BBP4_BANDWIDTH FIELD8(0x18) +#define BBP4_MAC_IF_CTRL FIELD8(0x40) + +/* BBP27 */ +#define BBP27_RX_CHAIN_SEL FIELD8(0x60) + +/* + * BBP 47: Bandwidth + */ +#define BBP47_TSSI_REPORT_SEL FIELD8(0x03) +#define BBP47_TSSI_UPDATE_REQ FIELD8(0x04) +#define BBP47_TSSI_TSSI_MODE FIELD8(0x18) +#define BBP47_TSSI_ADC6 FIELD8(0x80) + +/* + * BBP 49 + */ +#define BBP49_UPDATE_FLAG FIELD8(0x01) + +/* + * BBP 105: + * - bit0: detect SIG on primary channel only (on 40MHz bandwidth) + * - bit1: FEQ (Feed Forward Compensation) for independend streams + * - bit2: MLD (Maximum Likehood Detection) for 2 streams (reserved on single + * stream) + * - bit4: channel estimation updates based on remodulation of + * L-SIG and HT-SIG symbols + */ +#define BBP105_DETECT_SIG_ON_PRIMARY FIELD8(0x01) +#define BBP105_FEQ FIELD8(0x02) +#define BBP105_MLD FIELD8(0x04) +#define BBP105_SIG_REMODULATION FIELD8(0x08) + +/* + * BBP 109 + */ +#define BBP109_TX0_POWER FIELD8(0x0f) +#define BBP109_TX1_POWER FIELD8(0xf0) + +/* BBP 110 */ +#define BBP110_TX2_POWER FIELD8(0x0f) + + +/* + * BBP 138: Unknown + */ +#define BBP138_RX_ADC1 FIELD8(0x02) +#define BBP138_RX_ADC2 FIELD8(0x04) +#define BBP138_TX_DAC1 FIELD8(0x20) +#define BBP138_TX_DAC2 FIELD8(0x40) + +/* + * BBP 152: Rx Ant + */ +#define BBP152_RX_DEFAULT_ANT FIELD8(0x80) + +/* + * BBP 254: unknown + */ +#define BBP254_BIT7 FIELD8(0x80) + +/* + * RFCSR registers + * The wordsize of the RFCSR is 8 bits. + */ + +/* + * RFCSR 1: + */ +#define RFCSR1_RF_BLOCK_EN FIELD8(0x01) +#define RFCSR1_PLL_PD FIELD8(0x02) +#define RFCSR1_RX0_PD FIELD8(0x04) +#define RFCSR1_TX0_PD FIELD8(0x08) +#define RFCSR1_RX1_PD FIELD8(0x10) +#define RFCSR1_TX1_PD FIELD8(0x20) +#define RFCSR1_RX2_PD FIELD8(0x40) +#define RFCSR1_TX2_PD FIELD8(0x80) +#define RFCSR1_TX2_EN_MT7620 FIELD8(0x02) + +/* + * RFCSR 2: + */ +#define RFCSR2_RESCAL_BP FIELD8(0x40) +#define RFCSR2_RESCAL_EN FIELD8(0x80) +#define RFCSR2_RX2_EN_MT7620 FIELD8(0x02) +#define RFCSR2_TX2_EN_MT7620 FIELD8(0x20) + +/* + * RFCSR 3: + */ +#define RFCSR3_K FIELD8(0x0f) +/* Bits [7-4] for RF3320 (RT3370/RT3390), on other chipsets reserved */ +#define RFCSR3_PA1_BIAS_CCK FIELD8(0x70) +#define RFCSR3_PA2_CASCODE_BIAS_CCKK FIELD8(0x80) +/* Bits for RF3290/RF5360/RF5362/RF5370/RF5372/RF5390/RF5392 */ +#define RFCSR3_VCOCAL_EN FIELD8(0x80) +/* Bits for RF3050 */ +#define RFCSR3_BIT1 FIELD8(0x02) +#define RFCSR3_BIT2 FIELD8(0x04) +#define RFCSR3_BIT3 FIELD8(0x08) +#define RFCSR3_BIT4 FIELD8(0x10) +#define RFCSR3_BIT5 FIELD8(0x20) + +/* + * RFCSR 4: + * VCOCAL_EN used by MT7620 + */ +#define RFCSR4_VCOCAL_EN FIELD8(0x80) + +/* + * FRCSR 5: + */ +#define RFCSR5_R1 FIELD8(0x0c) + +/* + * RFCSR 6: + */ +#define RFCSR6_R1 FIELD8(0x03) +#define RFCSR6_R2 FIELD8(0x40) +#define RFCSR6_TXDIV FIELD8(0x0c) +/* bits for RF3053 */ +#define RFCSR6_VCO_IC FIELD8(0xc0) + +/* + * RFCSR 7: + */ +#define RFCSR7_RF_TUNING FIELD8(0x01) +#define RFCSR7_BIT1 FIELD8(0x02) +#define RFCSR7_BIT2 FIELD8(0x04) +#define RFCSR7_BIT3 FIELD8(0x08) +#define RFCSR7_BIT4 FIELD8(0x10) +#define RFCSR7_BIT5 FIELD8(0x20) +#define RFCSR7_BITS67 FIELD8(0xc0) + +/* + * RFCSR 9: + */ +#define RFCSR9_K FIELD8(0x0f) +#define RFCSR9_N FIELD8(0x10) +#define RFCSR9_UNKNOWN FIELD8(0x60) +#define RFCSR9_MOD FIELD8(0x80) + +/* + * RFCSR 11: + */ +#define RFCSR11_R FIELD8(0x03) +#define RFCSR11_PLL_MOD FIELD8(0x0c) +#define RFCSR11_MOD FIELD8(0xc0) +/* bits for RF3053 */ +/* TODO: verify RFCSR11_MOD usage on other chips */ +#define RFCSR11_PLL_IDOH FIELD8(0x40) + + +/* + * RFCSR 12: + */ +#define RFCSR12_TX_POWER FIELD8(0x1f) +#define RFCSR12_DR0 FIELD8(0xe0) + +/* + * RFCSR 13: + */ +#define RFCSR13_TX_POWER FIELD8(0x1f) +#define RFCSR13_DR0 FIELD8(0xe0) +#define RFCSR13_RDIV_MT7620 FIELD8(0x03) + +/* + * RFCSR 15: + */ +#define RFCSR15_TX_LO2_EN FIELD8(0x08) + +/* + * RFCSR 16: + */ +#define RFCSR16_TXMIXER_GAIN FIELD8(0x07) +#define RFCSR16_RF_PLL_FREQ_SEL_MT7620 FIELD8(0x0F) +#define RFCSR16_SDM_MODE_MT7620 FIELD8(0xE0) + +/* + * RFCSR 17: + */ +#define RFCSR17_TXMIXER_GAIN FIELD8(0x07) +#define RFCSR17_TX_LO1_EN FIELD8(0x08) +#define RFCSR17_R FIELD8(0x20) +#define RFCSR17_CODE FIELD8(0x7f) + +/* RFCSR 18 */ +#define RFCSR18_XO_TUNE_BYPASS FIELD8(0x40) + +/* RFCSR 19 */ +#define RFCSR19_K FIELD8(0x03) + +/* + * RFCSR 20: + */ +#define RFCSR20_RX_LO1_EN FIELD8(0x08) + +/* + * RFCSR 21: + */ +#define RFCSR21_RX_LO2_EN FIELD8(0x08) +#define RFCSR21_BIT1 FIELD8(0x01) +#define RFCSR21_BIT8 FIELD8(0x80) + +/* + * RFCSR 22: + */ +#define RFCSR22_BASEBAND_LOOPBACK FIELD8(0x01) +#define RFCSR22_FREQPLAN_D_MT7620 FIELD8(0x07) + +/* + * RFCSR 23: + */ +#define RFCSR23_FREQ_OFFSET FIELD8(0x7f) + +/* + * RFCSR 24: + */ +#define RFCSR24_TX_AGC_FC FIELD8(0x1f) +#define RFCSR24_TX_H20M FIELD8(0x20) +#define RFCSR24_TX_CALIB FIELD8(0x7f) + +/* + * RFCSR 27: + */ +#define RFCSR27_R1 FIELD8(0x03) +#define RFCSR27_R2 FIELD8(0x04) +#define RFCSR27_R3 FIELD8(0x30) +#define RFCSR27_R4 FIELD8(0x40) + +/* + * RFCSR 28: + */ +#define RFCSR28_CH11_HT40 FIELD8(0x04) + +/* + * RFCSR 29: + */ +#define RFCSR29_ADC6_TEST FIELD8(0x01) +#define RFCSR29_ADC6_INT_TEST FIELD8(0x02) +#define RFCSR29_RSSI_RESET FIELD8(0x04) +#define RFCSR29_RSSI_ON FIELD8(0x08) +#define RFCSR29_RSSI_RIP_CTRL FIELD8(0x30) +#define RFCSR29_RSSI_GAIN FIELD8(0xc0) + +/* + * RFCSR 30: + */ +#define RFCSR30_TX_H20M FIELD8(0x02) +#define RFCSR30_RX_H20M FIELD8(0x04) +#define RFCSR30_RX_VCM FIELD8(0x18) +#define RFCSR30_RF_CALIBRATION FIELD8(0x80) +#define RF3322_RFCSR30_TX_H20M FIELD8(0x01) +#define RF3322_RFCSR30_RX_H20M FIELD8(0x02) + +/* + * RFCSR 31: + */ +#define RFCSR31_RX_AGC_FC FIELD8(0x1f) +#define RFCSR31_RX_H20M FIELD8(0x20) +#define RFCSR31_RX_CALIB FIELD8(0x7f) + +/* RFCSR 32 bits for RF3053 */ +#define RFCSR32_TX_AGC_FC FIELD8(0xf8) + +/* RFCSR 36 bits for RF3053 */ +#define RFCSR36_RF_BS FIELD8(0x80) + +/* + * RFCSR 34: + */ +#define RFCSR34_TX0_EXT_PA FIELD8(0x04) +#define RFCSR34_TX1_EXT_PA FIELD8(0x08) + +/* + * RFCSR 38: + */ +#define RFCSR38_RX_LO1_EN FIELD8(0x20) + +/* + * RFCSR 39: + */ +#define RFCSR39_RX_DIV FIELD8(0x40) +#define RFCSR39_RX_LO2_EN FIELD8(0x80) + +/* + * RFCSR 41: + */ +#define RFCSR41_BIT1 FIELD8(0x01) +#define RFCSR41_BIT4 FIELD8(0x08) + +/* + * RFCSR 42: + */ +#define RFCSR42_BIT1 FIELD8(0x01) +#define RFCSR42_BIT4 FIELD8(0x08) +#define RFCSR42_TX2_EN_MT7620 FIELD8(0x40) + +/* + * RFCSR 49: + */ +#define RFCSR49_TX FIELD8(0x3f) +#define RFCSR49_EP FIELD8(0xc0) +/* bits for RT3593 */ +#define RFCSR49_TX_LO1_IC FIELD8(0x1c) +#define RFCSR49_TX_DIV FIELD8(0x20) + +/* + * RFCSR 50: + */ +#define RFCSR50_TX FIELD8(0x3f) +#define RFCSR50_TX0_EXT_PA FIELD8(0x02) +#define RFCSR50_TX1_EXT_PA FIELD8(0x10) +#define RFCSR50_EP FIELD8(0xc0) +/* bits for RT3593 */ +#define RFCSR50_TX_LO1_EN FIELD8(0x20) +#define RFCSR50_TX_LO2_EN FIELD8(0x10) + +/* RFCSR 51 */ +/* bits for RT3593 */ +#define RFCSR51_BITS01 FIELD8(0x03) +#define RFCSR51_BITS24 FIELD8(0x1c) +#define RFCSR51_BITS57 FIELD8(0xe0) + +#define RFCSR53_TX_POWER FIELD8(0x3f) +#define RFCSR53_UNKNOWN FIELD8(0xc0) + +#define RFCSR54_TX_POWER FIELD8(0x3f) +#define RFCSR54_UNKNOWN FIELD8(0xc0) + +#define RFCSR55_TX_POWER FIELD8(0x3f) +#define RFCSR55_UNKNOWN FIELD8(0xc0) + +#define RFCSR57_DRV_CC FIELD8(0xfc) + + +/* + * RF registers + */ + +/* + * RF 2 + */ +#define RF2_ANTENNA_RX2 FIELD32(0x00000040) +#define RF2_ANTENNA_TX1 FIELD32(0x00004000) +#define RF2_ANTENNA_RX1 FIELD32(0x00020000) + +/* + * RF 3 + */ +#define RF3_TXPOWER_G FIELD32(0x00003e00) +#define RF3_TXPOWER_A_7DBM_BOOST FIELD32(0x00000200) +#define RF3_TXPOWER_A FIELD32(0x00003c00) + +/* + * RF 4 + */ +#define RF4_TXPOWER_G FIELD32(0x000007c0) +#define RF4_TXPOWER_A_7DBM_BOOST FIELD32(0x00000040) +#define RF4_TXPOWER_A FIELD32(0x00000780) +#define RF4_FREQ_OFFSET FIELD32(0x001f8000) +#define RF4_HT40 FIELD32(0x00200000) + +/* + * EEPROM content. + * The wordsize of the EEPROM is 16 bits. + */ + +enum rt2800_eeprom_word { + EEPROM_CHIP_ID = 0, + EEPROM_VERSION, + EEPROM_MAC_ADDR_0, + EEPROM_MAC_ADDR_1, + EEPROM_MAC_ADDR_2, + EEPROM_NIC_CONF0, + EEPROM_NIC_CONF1, + EEPROM_FREQ, + EEPROM_LED_AG_CONF, + EEPROM_LED_ACT_CONF, + EEPROM_LED_POLARITY, + EEPROM_NIC_CONF2, + EEPROM_LNA, + EEPROM_RSSI_BG, + EEPROM_RSSI_BG2, + EEPROM_TXMIXER_GAIN_BG, + EEPROM_RSSI_A, + EEPROM_RSSI_A2, + EEPROM_TXMIXER_GAIN_A, + EEPROM_EIRP_MAX_TX_POWER, + EEPROM_TXPOWER_DELTA, + EEPROM_TXPOWER_BG1, + EEPROM_TXPOWER_BG2, + EEPROM_TSSI_BOUND_BG1, + EEPROM_TSSI_BOUND_BG2, + EEPROM_TSSI_BOUND_BG3, + EEPROM_TSSI_BOUND_BG4, + EEPROM_TSSI_BOUND_BG5, + EEPROM_TXPOWER_A1, + EEPROM_TXPOWER_A2, + EEPROM_TXPOWER_INIT, + EEPROM_TSSI_BOUND_A1, + EEPROM_TSSI_BOUND_A2, + EEPROM_TSSI_BOUND_A3, + EEPROM_TSSI_BOUND_A4, + EEPROM_TSSI_BOUND_A5, + EEPROM_TXPOWER_BYRATE, + EEPROM_BBP_START, + + /* IDs for extended EEPROM format used by three-chain devices */ + EEPROM_EXT_LNA2, + EEPROM_EXT_TXPOWER_BG3, + EEPROM_EXT_TXPOWER_A3, + + /* New values must be added before this */ + EEPROM_WORD_COUNT +}; + +/* + * EEPROM Version + */ +#define EEPROM_VERSION_FAE FIELD16(0x00ff) +#define EEPROM_VERSION_VERSION FIELD16(0xff00) + +/* + * HW MAC address. + */ +#define EEPROM_MAC_ADDR_BYTE0 FIELD16(0x00ff) +#define EEPROM_MAC_ADDR_BYTE1 FIELD16(0xff00) +#define EEPROM_MAC_ADDR_BYTE2 FIELD16(0x00ff) +#define EEPROM_MAC_ADDR_BYTE3 FIELD16(0xff00) +#define EEPROM_MAC_ADDR_BYTE4 FIELD16(0x00ff) +#define EEPROM_MAC_ADDR_BYTE5 FIELD16(0xff00) + +/* + * EEPROM NIC Configuration 0 + * RXPATH: 1: 1R, 2: 2R, 3: 3R + * TXPATH: 1: 1T, 2: 2T, 3: 3T + * RF_TYPE: RFIC type + */ +#define EEPROM_NIC_CONF0_RXPATH FIELD16(0x000f) +#define EEPROM_NIC_CONF0_TXPATH FIELD16(0x00f0) +#define EEPROM_NIC_CONF0_RF_TYPE FIELD16(0x0f00) + +/* + * EEPROM NIC Configuration 1 + * HW_RADIO: 0: disable, 1: enable + * EXTERNAL_TX_ALC: 0: disable, 1: enable + * EXTERNAL_LNA_2G: 0: disable, 1: enable + * EXTERNAL_LNA_5G: 0: disable, 1: enable + * CARDBUS_ACCEL: 0: enable, 1: disable + * BW40M_SB_2G: 0: disable, 1: enable + * BW40M_SB_5G: 0: disable, 1: enable + * WPS_PBC: 0: disable, 1: enable + * BW40M_2G: 0: enable, 1: disable + * BW40M_5G: 0: enable, 1: disable + * BROADBAND_EXT_LNA: 0: disable, 1: enable + * ANT_DIVERSITY: 00: Disable, 01: Diversity, + * 10: Main antenna, 11: Aux antenna + * INTERNAL_TX_ALC: 0: disable, 1: enable + * BT_COEXIST: 0: disable, 1: enable + * DAC_TEST: 0: disable, 1: enable + * EXTERNAL_TX0_PA: 0: disable, 1: enable (only on RT3352) + * EXTERNAL_TX1_PA: 0: disable, 1: enable (only on RT3352) + */ +#define EEPROM_NIC_CONF1_HW_RADIO FIELD16(0x0001) +#define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC FIELD16(0x0002) +#define EEPROM_NIC_CONF1_EXTERNAL_LNA_2G FIELD16(0x0004) +#define EEPROM_NIC_CONF1_EXTERNAL_LNA_5G FIELD16(0x0008) +#define EEPROM_NIC_CONF1_CARDBUS_ACCEL FIELD16(0x0010) +#define EEPROM_NIC_CONF1_BW40M_SB_2G FIELD16(0x0020) +#define EEPROM_NIC_CONF1_BW40M_SB_5G FIELD16(0x0040) +#define EEPROM_NIC_CONF1_WPS_PBC FIELD16(0x0080) +#define EEPROM_NIC_CONF1_BW40M_2G FIELD16(0x0100) +#define EEPROM_NIC_CONF1_BW40M_5G FIELD16(0x0200) +#define EEPROM_NIC_CONF1_BROADBAND_EXT_LNA FIELD16(0x400) +#define EEPROM_NIC_CONF1_ANT_DIVERSITY FIELD16(0x1800) +#define EEPROM_NIC_CONF1_INTERNAL_TX_ALC FIELD16(0x2000) +#define EEPROM_NIC_CONF1_BT_COEXIST FIELD16(0x4000) +#define EEPROM_NIC_CONF1_DAC_TEST FIELD16(0x8000) +#define EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352 FIELD16(0x4000) +#define EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352 FIELD16(0x8000) + +/* + * EEPROM frequency + */ +#define EEPROM_FREQ_OFFSET FIELD16(0x00ff) +#define EEPROM_FREQ_LED_MODE FIELD16(0x7f00) +#define EEPROM_FREQ_LED_POLARITY FIELD16(0x1000) + +/* + * EEPROM LED + * POLARITY_RDY_G: Polarity RDY_G setting. + * POLARITY_RDY_A: Polarity RDY_A setting. + * POLARITY_ACT: Polarity ACT setting. + * POLARITY_GPIO_0: Polarity GPIO0 setting. + * POLARITY_GPIO_1: Polarity GPIO1 setting. + * POLARITY_GPIO_2: Polarity GPIO2 setting. + * POLARITY_GPIO_3: Polarity GPIO3 setting. + * POLARITY_GPIO_4: Polarity GPIO4 setting. + * LED_MODE: Led mode. + */ +#define EEPROM_LED_POLARITY_RDY_BG FIELD16(0x0001) +#define EEPROM_LED_POLARITY_RDY_A FIELD16(0x0002) +#define EEPROM_LED_POLARITY_ACT FIELD16(0x0004) +#define EEPROM_LED_POLARITY_GPIO_0 FIELD16(0x0008) +#define EEPROM_LED_POLARITY_GPIO_1 FIELD16(0x0010) +#define EEPROM_LED_POLARITY_GPIO_2 FIELD16(0x0020) +#define EEPROM_LED_POLARITY_GPIO_3 FIELD16(0x0040) +#define EEPROM_LED_POLARITY_GPIO_4 FIELD16(0x0080) +#define EEPROM_LED_LED_MODE FIELD16(0x1f00) + +/* + * EEPROM NIC Configuration 2 + * RX_STREAM: 0: Reserved, 1: 1 Stream, 2: 2 Stream + * TX_STREAM: 0: Reserved, 1: 1 Stream, 2: 2 Stream + * CRYSTAL: 00: Reserved, 01: One crystal, 10: Two crystal, 11: Reserved + */ +#define EEPROM_NIC_CONF2_RX_STREAM FIELD16(0x000f) +#define EEPROM_NIC_CONF2_TX_STREAM FIELD16(0x00f0) +#define EEPROM_NIC_CONF2_CRYSTAL FIELD16(0x0600) + +/* + * EEPROM LNA + */ +#define EEPROM_LNA_BG FIELD16(0x00ff) +#define EEPROM_LNA_A0 FIELD16(0xff00) + +/* + * EEPROM RSSI BG offset + */ +#define EEPROM_RSSI_BG_OFFSET0 FIELD16(0x00ff) +#define EEPROM_RSSI_BG_OFFSET1 FIELD16(0xff00) + +/* + * EEPROM RSSI BG2 offset + */ +#define EEPROM_RSSI_BG2_OFFSET2 FIELD16(0x00ff) +#define EEPROM_RSSI_BG2_LNA_A1 FIELD16(0xff00) + +/* + * EEPROM TXMIXER GAIN BG offset (note overlaps with EEPROM RSSI BG2). + */ +#define EEPROM_TXMIXER_GAIN_BG_VAL FIELD16(0x0007) + +/* + * EEPROM RSSI A offset + */ +#define EEPROM_RSSI_A_OFFSET0 FIELD16(0x00ff) +#define EEPROM_RSSI_A_OFFSET1 FIELD16(0xff00) + +/* + * EEPROM RSSI A2 offset + */ +#define EEPROM_RSSI_A2_OFFSET2 FIELD16(0x00ff) +#define EEPROM_RSSI_A2_LNA_A2 FIELD16(0xff00) + +/* + * EEPROM TXMIXER GAIN A offset (note overlaps with EEPROM RSSI A2). + */ +#define EEPROM_TXMIXER_GAIN_A_VAL FIELD16(0x0007) + +/* + * EEPROM EIRP Maximum TX power values(unit: dbm) + */ +#define EEPROM_EIRP_MAX_TX_POWER_2GHZ FIELD16(0x00ff) +#define EEPROM_EIRP_MAX_TX_POWER_5GHZ FIELD16(0xff00) + +/* + * EEPROM TXpower delta: 20MHZ AND 40 MHZ use different power. + * This is delta in 40MHZ. + * VALUE: Tx Power dalta value, MAX=4(unit: dbm) + * TYPE: 1: Plus the delta value, 0: minus the delta value + * ENABLE: enable tx power compensation for 40BW + */ +#define EEPROM_TXPOWER_DELTA_VALUE_2G FIELD16(0x003f) +#define EEPROM_TXPOWER_DELTA_TYPE_2G FIELD16(0x0040) +#define EEPROM_TXPOWER_DELTA_ENABLE_2G FIELD16(0x0080) +#define EEPROM_TXPOWER_DELTA_VALUE_5G FIELD16(0x3f00) +#define EEPROM_TXPOWER_DELTA_TYPE_5G FIELD16(0x4000) +#define EEPROM_TXPOWER_DELTA_ENABLE_5G FIELD16(0x8000) + +/* + * EEPROM TXPOWER 802.11BG + */ +#define EEPROM_TXPOWER_BG_SIZE 7 +#define EEPROM_TXPOWER_BG_1 FIELD16(0x00ff) +#define EEPROM_TXPOWER_BG_2 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11BG + * MINUS4: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -4) + * MINUS3: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -3) + */ +#define EEPROM_TSSI_BOUND_BG1_MINUS4 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_BG1_MINUS3 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11BG + * MINUS2: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -2) + * MINUS1: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -1) + */ +#define EEPROM_TSSI_BOUND_BG2_MINUS2 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_BG2_MINUS1 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11BG + * REF: Reference TSSI value, no tx power changes needed + * PLUS1: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 1) + */ +#define EEPROM_TSSI_BOUND_BG3_REF FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_BG3_PLUS1 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11BG + * PLUS2: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 2) + * PLUS3: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 3) + */ +#define EEPROM_TSSI_BOUND_BG4_PLUS2 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_BG4_PLUS3 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11BG + * PLUS4: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 4) + * AGC_STEP: Temperature compensation step. + */ +#define EEPROM_TSSI_BOUND_BG5_PLUS4 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_BG5_AGC_STEP FIELD16(0xff00) + +/* + * EEPROM TXPOWER 802.11A + */ +#define EEPROM_TXPOWER_A_SIZE 6 +#define EEPROM_TXPOWER_A_1 FIELD16(0x00ff) +#define EEPROM_TXPOWER_A_2 FIELD16(0xff00) + +/* EEPROM_TXPOWER_{A,G} fields for RT3593 */ +#define EEPROM_TXPOWER_ALC FIELD8(0x1f) +#define EEPROM_TXPOWER_FINE_CTRL FIELD8(0xe0) + +/* + * EEPROM temperature compensation boundaries 802.11A + * MINUS4: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -4) + * MINUS3: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -3) + */ +#define EEPROM_TSSI_BOUND_A1_MINUS4 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_A1_MINUS3 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11A + * MINUS2: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -2) + * MINUS1: If the actual TSSI is below this boundary, tx power needs to be + * reduced by (agc_step * -1) + */ +#define EEPROM_TSSI_BOUND_A2_MINUS2 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_A2_MINUS1 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11A + * REF: Reference TSSI value, no tx power changes needed + * PLUS1: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 1) + */ +#define EEPROM_TSSI_BOUND_A3_REF FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_A3_PLUS1 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11A + * PLUS2: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 2) + * PLUS3: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 3) + */ +#define EEPROM_TSSI_BOUND_A4_PLUS2 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_A4_PLUS3 FIELD16(0xff00) + +/* + * EEPROM temperature compensation boundaries 802.11A + * PLUS4: If the actual TSSI is above this boundary, tx power needs to be + * increased by (agc_step * 4) + * AGC_STEP: Temperature compensation step. + */ +#define EEPROM_TSSI_BOUND_A5_PLUS4 FIELD16(0x00ff) +#define EEPROM_TSSI_BOUND_A5_AGC_STEP FIELD16(0xff00) + +/* + * EEPROM TXPOWER by rate: tx power per tx rate for HT20 mode + */ +#define EEPROM_TXPOWER_BYRATE_SIZE 9 + +#define EEPROM_TXPOWER_BYRATE_RATE0 FIELD16(0x000f) +#define EEPROM_TXPOWER_BYRATE_RATE1 FIELD16(0x00f0) +#define EEPROM_TXPOWER_BYRATE_RATE2 FIELD16(0x0f00) +#define EEPROM_TXPOWER_BYRATE_RATE3 FIELD16(0xf000) + +/* + * EEPROM BBP. + */ +#define EEPROM_BBP_SIZE 16 +#define EEPROM_BBP_VALUE FIELD16(0x00ff) +#define EEPROM_BBP_REG_ID FIELD16(0xff00) + +/* EEPROM_EXT_LNA2 */ +#define EEPROM_EXT_LNA2_A1 FIELD16(0x00ff) +#define EEPROM_EXT_LNA2_A2 FIELD16(0xff00) + +/* + * EEPROM IQ Calibration, unlike other entries those are byte addresses. + */ + +#define EEPROM_IQ_GAIN_CAL_TX0_2G 0x130 +#define EEPROM_IQ_PHASE_CAL_TX0_2G 0x131 +#define EEPROM_IQ_GROUPDELAY_CAL_TX0_2G 0x132 +#define EEPROM_IQ_GAIN_CAL_TX1_2G 0x133 +#define EEPROM_IQ_PHASE_CAL_TX1_2G 0x134 +#define EEPROM_IQ_GROUPDELAY_CAL_TX1_2G 0x135 +#define EEPROM_IQ_GAIN_CAL_RX0_2G 0x136 +#define EEPROM_IQ_PHASE_CAL_RX0_2G 0x137 +#define EEPROM_IQ_GROUPDELAY_CAL_RX0_2G 0x138 +#define EEPROM_IQ_GAIN_CAL_RX1_2G 0x139 +#define EEPROM_IQ_PHASE_CAL_RX1_2G 0x13A +#define EEPROM_IQ_GROUPDELAY_CAL_RX1_2G 0x13B +#define EEPROM_RF_IQ_COMPENSATION_CONTROL 0x13C +#define EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CONTROL 0x13D +#define EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5G 0x144 +#define EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5G 0x145 +#define EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5G 0X146 +#define EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5G 0x147 +#define EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5G 0x148 +#define EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5G 0x149 +#define EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5G 0x14A +#define EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5G 0x14B +#define EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5G 0X14C +#define EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5G 0x14D +#define EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5G 0x14E +#define EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5G 0x14F +#define EEPROM_IQ_GROUPDELAY_CAL_TX0_CH36_TO_CH64_5G 0x150 +#define EEPROM_IQ_GROUPDELAY_CAL_TX1_CH36_TO_CH64_5G 0x151 +#define EEPROM_IQ_GROUPDELAY_CAL_TX0_CH100_TO_CH138_5G 0x152 +#define EEPROM_IQ_GROUPDELAY_CAL_TX1_CH100_TO_CH138_5G 0x153 +#define EEPROM_IQ_GROUPDELAY_CAL_TX0_CH140_TO_CH165_5G 0x154 +#define EEPROM_IQ_GROUPDELAY_CAL_TX1_CH140_TO_CH165_5G 0x155 +#define EEPROM_IQ_GAIN_CAL_RX0_CH36_TO_CH64_5G 0x156 +#define EEPROM_IQ_PHASE_CAL_RX0_CH36_TO_CH64_5G 0x157 +#define EEPROM_IQ_GAIN_CAL_RX0_CH100_TO_CH138_5G 0X158 +#define EEPROM_IQ_PHASE_CAL_RX0_CH100_TO_CH138_5G 0x159 +#define EEPROM_IQ_GAIN_CAL_RX0_CH140_TO_CH165_5G 0x15A +#define EEPROM_IQ_PHASE_CAL_RX0_CH140_TO_CH165_5G 0x15B +#define EEPROM_IQ_GAIN_CAL_RX1_CH36_TO_CH64_5G 0x15C +#define EEPROM_IQ_PHASE_CAL_RX1_CH36_TO_CH64_5G 0x15D +#define EEPROM_IQ_GAIN_CAL_RX1_CH100_TO_CH138_5G 0X15E +#define EEPROM_IQ_PHASE_CAL_RX1_CH100_TO_CH138_5G 0x15F +#define EEPROM_IQ_GAIN_CAL_RX1_CH140_TO_CH165_5G 0x160 +#define EEPROM_IQ_PHASE_CAL_RX1_CH140_TO_CH165_5G 0x161 +#define EEPROM_IQ_GROUPDELAY_CAL_RX0_CH36_TO_CH64_5G 0x162 +#define EEPROM_IQ_GROUPDELAY_CAL_RX1_CH36_TO_CH64_5G 0x163 +#define EEPROM_IQ_GROUPDELAY_CAL_RX0_CH100_TO_CH138_5G 0x164 +#define EEPROM_IQ_GROUPDELAY_CAL_RX1_CH100_TO_CH138_5G 0x165 +#define EEPROM_IQ_GROUPDELAY_CAL_RX0_CH140_TO_CH165_5G 0x166 +#define EEPROM_IQ_GROUPDELAY_CAL_RX1_CH140_TO_CH165_5G 0x167 + +/* + * MCU mailbox commands. + * MCU_SLEEP - go to power-save mode. + * arg1: 1: save as much power as possible, 0: save less power. + * status: 1: success, 2: already asleep, + * 3: maybe MAC is busy so can't finish this task. + * MCU_RADIO_OFF + * arg0: 0: do power-saving, NOT turn off radio. + */ +#define MCU_SLEEP 0x30 +#define MCU_WAKEUP 0x31 +#define MCU_RADIO_OFF 0x35 +#define MCU_CURRENT 0x36 +#define MCU_LED 0x50 +#define MCU_LED_STRENGTH 0x51 +#define MCU_LED_AG_CONF 0x52 +#define MCU_LED_ACT_CONF 0x53 +#define MCU_LED_LED_POLARITY 0x54 +#define MCU_RADAR 0x60 +#define MCU_BOOT_SIGNAL 0x72 +#define MCU_ANT_SELECT 0X73 +#define MCU_FREQ_OFFSET 0x74 +#define MCU_BBP_SIGNAL 0x80 +#define MCU_POWER_SAVE 0x83 +#define MCU_BAND_SELECT 0x91 + +/* + * MCU mailbox tokens + */ +#define TOKEN_SLEEP 1 +#define TOKEN_RADIO_OFF 2 +#define TOKEN_WAKEUP 3 + + +/* + * DMA descriptor defines. + */ + +#define TXWI_DESC_SIZE_4WORDS (4 * sizeof(__le32)) +#define TXWI_DESC_SIZE_5WORDS (5 * sizeof(__le32)) + +#define RXWI_DESC_SIZE_4WORDS (4 * sizeof(__le32)) +#define RXWI_DESC_SIZE_5WORDS (5 * sizeof(__le32)) +#define RXWI_DESC_SIZE_6WORDS (6 * sizeof(__le32)) + +/* + * TX WI structure + */ + +/* + * Word0 + * FRAG: 1 To inform TKIP engine this is a fragment. + * MIMO_PS: The remote peer is in dynamic MIMO-PS mode + * TX_OP: 0:HT TXOP rule , 1:PIFS TX ,2:Backoff, 3:sifs + * BW: Channel bandwidth 0:20MHz, 1:40 MHz (for legacy rates this will + * duplicate the frame to both channels). + * STBC: 1: STBC support MCS =0-7, 2,3 : RESERVED + * AMPDU: 1: this frame is eligible for AMPDU aggregation, the hw will + * aggregate consecutive frames with the same RA and QoS TID. If + * a frame A with the same RA and QoS TID but AMPDU=0 is queued + * directly after a frame B with AMPDU=1, frame A might still + * get aggregated into the AMPDU started by frame B. So, setting + * AMPDU to 0 does _not_ necessarily mean the frame is sent as + * MPDU, it can still end up in an AMPDU if the previous frame + * was tagged as AMPDU. + */ +#define TXWI_W0_FRAG FIELD32(0x00000001) +#define TXWI_W0_MIMO_PS FIELD32(0x00000002) +#define TXWI_W0_CF_ACK FIELD32(0x00000004) +#define TXWI_W0_TS FIELD32(0x00000008) +#define TXWI_W0_AMPDU FIELD32(0x00000010) +#define TXWI_W0_MPDU_DENSITY FIELD32(0x000000e0) +#define TXWI_W0_TX_OP FIELD32(0x00000300) +#define TXWI_W0_MCS FIELD32(0x007f0000) +#define TXWI_W0_BW FIELD32(0x00800000) +#define TXWI_W0_SHORT_GI FIELD32(0x01000000) +#define TXWI_W0_STBC FIELD32(0x06000000) +#define TXWI_W0_IFS FIELD32(0x08000000) +#define TXWI_W0_PHYMODE FIELD32(0xc0000000) + +/* + * Word1 + * ACK: 0: No Ack needed, 1: Ack needed + * NSEQ: 0: Don't assign hw sequence number, 1: Assign hw sequence number + * BW_WIN_SIZE: BA windows size of the recipient + * WIRELESS_CLI_ID: Client ID for WCID table access + * MPDU_TOTAL_BYTE_COUNT: Length of 802.11 frame + * PACKETID: Will be latched into the TX_STA_FIFO register once the according + * frame was processed. If multiple frames are aggregated together + * (AMPDU==1) the reported tx status will always contain the packet + * id of the first frame. 0: Don't report tx status for this frame. + * PACKETID_QUEUE: Part of PACKETID, This is the queue index (0-3) + * PACKETID_ENTRY: Part of PACKETID, THis is the queue entry index (1-3) + * This identification number is calculated by ((idx % 3) + 1). + * The (+1) is required to prevent PACKETID to become 0. + */ +#define TXWI_W1_ACK FIELD32(0x00000001) +#define TXWI_W1_NSEQ FIELD32(0x00000002) +#define TXWI_W1_BW_WIN_SIZE FIELD32(0x000000fc) +#define TXWI_W1_WIRELESS_CLI_ID FIELD32(0x0000ff00) +#define TXWI_W1_MPDU_TOTAL_BYTE_COUNT FIELD32(0x0fff0000) +#define TXWI_W1_PACKETID FIELD32(0xf0000000) +#define TXWI_W1_PACKETID_QUEUE FIELD32(0x30000000) +#define TXWI_W1_PACKETID_ENTRY FIELD32(0xc0000000) + +/* + * Word2 + */ +#define TXWI_W2_IV FIELD32(0xffffffff) + +/* + * Word3 + */ +#define TXWI_W3_EIV FIELD32(0xffffffff) + +/* + * RX WI structure + */ + +/* + * Word0 + */ +#define RXWI_W0_WIRELESS_CLI_ID FIELD32(0x000000ff) +#define RXWI_W0_KEY_INDEX FIELD32(0x00000300) +#define RXWI_W0_BSSID FIELD32(0x00001c00) +#define RXWI_W0_UDF FIELD32(0x0000e000) +#define RXWI_W0_MPDU_TOTAL_BYTE_COUNT FIELD32(0x0fff0000) +#define RXWI_W0_TID FIELD32(0xf0000000) + +/* + * Word1 + */ +#define RXWI_W1_FRAG FIELD32(0x0000000f) +#define RXWI_W1_SEQUENCE FIELD32(0x0000fff0) +#define RXWI_W1_MCS FIELD32(0x007f0000) +#define RXWI_W1_BW FIELD32(0x00800000) +#define RXWI_W1_SHORT_GI FIELD32(0x01000000) +#define RXWI_W1_STBC FIELD32(0x06000000) +#define RXWI_W1_PHYMODE FIELD32(0xc0000000) + +/* + * Word2 + */ +#define RXWI_W2_RSSI0 FIELD32(0x000000ff) +#define RXWI_W2_RSSI1 FIELD32(0x0000ff00) +#define RXWI_W2_RSSI2 FIELD32(0x00ff0000) + +/* + * Word3 + */ +#define RXWI_W3_SNR0 FIELD32(0x000000ff) +#define RXWI_W3_SNR1 FIELD32(0x0000ff00) + +/* + * Macros for converting txpower from EEPROM to mac80211 value + * and from mac80211 value to register value. + */ +#define MIN_G_TXPOWER 0 +#define MIN_A_TXPOWER -7 +#define MAX_G_TXPOWER 31 +#define MAX_A_TXPOWER 15 +#define DEFAULT_TXPOWER 5 + +#define MIN_A_TXPOWER_3593 0 +#define MAX_A_TXPOWER_3593 31 + +#define TXPOWER_G_FROM_DEV(__txpower) \ + ((__txpower) > MAX_G_TXPOWER) ? DEFAULT_TXPOWER : (__txpower) + +#define TXPOWER_A_FROM_DEV(__txpower) \ + ((__txpower) > MAX_A_TXPOWER) ? DEFAULT_TXPOWER : (__txpower) + +/* + * Board's maximun TX power limitation + */ +#define EIRP_MAX_TX_POWER_LIMIT 0x50 + +/* + * Number of TBTT intervals after which we have to adjust + * the hw beacon timer. + */ +#define BCN_TBTT_OFFSET 64 + +/* + * Security key table memory. + * + * The pairwise key table shares some memory with the beacon frame + * buffers 6 and 7. That basically means that when beacon 6 & 7 + * are used we should only use the reduced pairwise key table which + * has a maximum of 222 entries. + * + * --------------------------------------------- + * |0x4000 | Pairwise Key | Reduced Pairwise | + * | | Table | Key Table | + * | | Size: 256 * 32 | Size: 222 * 32 | + * |0x5BC0 | |------------------- + * | | | Beacon 6 | + * |0x5DC0 | |------------------- + * | | | Beacon 7 | + * |0x5FC0 | |------------------- + * |0x5FFF | | + * -------------------------- + * + * MAC_WCID_BASE: 8-bytes (use only 6 bytes) * 256 entry + * PAIRWISE_KEY_TABLE_BASE: 32-byte * 256 entry + * MAC_IVEIV_TABLE_BASE: 8-byte * 256-entry + * MAC_WCID_ATTRIBUTE_BASE: 4-byte * 256-entry + * SHARED_KEY_TABLE_BASE: 32-byte * 16-entry + * SHARED_KEY_MODE_BASE: 4-byte * 16-entry + */ +#define MAC_WCID_BASE 0x1800 +#define PAIRWISE_KEY_TABLE_BASE 0x4000 +#define MAC_IVEIV_TABLE_BASE 0x6000 +#define MAC_WCID_ATTRIBUTE_BASE 0x6800 +#define SHARED_KEY_TABLE_BASE 0x6c00 +#define SHARED_KEY_MODE_BASE 0x7000 + +#define MAC_WCID_ENTRY(__idx) \ + (MAC_WCID_BASE + ((__idx) * sizeof(struct mac_wcid_entry))) +#define PAIRWISE_KEY_ENTRY(__idx) \ + (PAIRWISE_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry))) +#define MAC_IVEIV_ENTRY(__idx) \ + (MAC_IVEIV_TABLE_BASE + ((__idx) * sizeof(struct mac_iveiv_entry))) +#define MAC_WCID_ATTR_ENTRY(__idx) \ + (MAC_WCID_ATTRIBUTE_BASE + ((__idx) * sizeof(u32))) +#define SHARED_KEY_ENTRY(__idx) \ + (SHARED_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry))) +#define SHARED_KEY_MODE_ENTRY(__idx) \ + (SHARED_KEY_MODE_BASE + ((__idx) * sizeof(u32))) + + +#endif /* ifndef RT2800_H */ diff --git a/libwifiuserspace/rt2800usb/rt2800lib.c b/libwifiuserspace/rt2800usb/rt2800lib.c new file mode 100644 index 0000000..218c860 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2800lib.c @@ -0,0 +1,7737 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#include + +#ifndef _WIN32 +#include +#else +#include "Windows.h" +#define usleep(x) Sleep((x) < 1000 ? 1 : (x) / 1000) +#define sleep(x) Sleep(x*1000) +#endif +#include + +#include "kernel/bitops.h" +#include "kernel/cfg80211.h" +#include "kernel/crc_ccit.h" +#include "kernel/types.h" +#include "kernel/endian.h" +#include "kernel/etherdevice.h" +#include "kernel/mac80211.h" +#include "kernel/ieee80211.h" +#include "kernel/if_ether.h" +#include "kernel/kernel.h" + +#include "rt2x00.h" +#include "rt2x00usb.h" +#include "rt2x00queue.h" +#include "rt2800.h" +#include "rt2800usb.h" +#include "rt2800lib.h" + +/* + * Register access. + * All access to the CSR registers will go through the methods + * rt2800_register_read and rt2800_register_write. + * BBP and RF register require indirect register access, + * and use the CSR registers BBPCSR and RFCSR to achieve this. + * These indirect registers work with busy bits, + * and we will try maximal REGISTER_BUSY_COUNT times to access + * the register while taking a REGISTER_BUSY_DELAY us delay + * between each attampt. When the busy bit is still set at that time, + * the access attempt is considered to have failed, + * and we will print an error. + * The _lock versions must be used if you already hold the csr_mutex + */ +#define WAIT_FOR_BBP(__dev, __reg) \ + rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg)) +#define WAIT_FOR_RFCSR(__dev, __reg) \ + rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY, (__reg)) +#define WAIT_FOR_RFCSR_MT7620(__dev, __reg) \ + rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY_MT7620, \ + (__reg)) +#define WAIT_FOR_RF(__dev, __reg) \ + rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg)) +#define WAIT_FOR_MCU(__dev, __reg) \ + rt2800_regbusy_read((__dev), H2M_MAILBOX_CSR, \ + H2M_MAILBOX_CSR_OWNER, (__reg)) + +static inline bool rt2800_is_305x_soc(struct rt2x00_dev *rt2x00dev) { + /* check for rt2872 on SoC */ + if (!rt2x00_is_soc(rt2x00dev) || + !rt2x00_rt(rt2x00dev, RT2872)) + return false; + + /* we know for sure that these rf chipsets are used on rt305x boards */ + if (rt2x00_rf(rt2x00dev, RF3020) || + rt2x00_rf(rt2x00dev, RF3021) || + rt2x00_rf(rt2x00dev, RF3022)) + return true; + + rt2x00_warn(rt2x00dev, "Unknown RF chipset on rt305x\n"); + return false; +} + +static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev, + const unsigned int word, const u8 value) +{ + u32 reg; + + mutex_lock(&rt2x00dev->csr_mutex); + + /* + * Wait until the BBP becomes available, afterwards we + * can safely write the new data into the register. + */ + if (WAIT_FOR_BBP(rt2x00dev, ®)) { + reg = 0; + rt2x00_set_field32(®, BBP_CSR_CFG_VALUE, value); + rt2x00_set_field32(®, BBP_CSR_CFG_REGNUM, word); + rt2x00_set_field32(®, BBP_CSR_CFG_BUSY, 1); + rt2x00_set_field32(®, BBP_CSR_CFG_READ_CONTROL, 0); + rt2x00_set_field32(®, BBP_CSR_CFG_BBP_RW_MODE, 1); + + rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg); + } + + mutex_unlock(&rt2x00dev->csr_mutex); +} + +static u8 rt2800_bbp_read(struct rt2x00_dev *rt2x00dev, const unsigned int word) +{ + u32 reg = 0; + u8 value; + + mutex_lock(&rt2x00dev->csr_mutex); + + /* + * Wait until the BBP becomes available, afterwards we + * can safely write the read request into the register. + * After the data has been written, we wait until hardware + * returns the correct value, if at any time the register + * doesn't become available in time, reg will be 0xffffffff + * which means we return 0xff to the caller. + */ + if (WAIT_FOR_BBP(rt2x00dev, ®)) { + reg = 0; + rt2x00_set_field32(®, BBP_CSR_CFG_REGNUM, word); + rt2x00_set_field32(®, BBP_CSR_CFG_BUSY, 1); + rt2x00_set_field32(®, BBP_CSR_CFG_READ_CONTROL, 1); + rt2x00_set_field32(®, BBP_CSR_CFG_BBP_RW_MODE, 1); + + rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg); + + WAIT_FOR_BBP(rt2x00dev, ®); + } + + value = rt2x00_get_field32(reg, BBP_CSR_CFG_VALUE); + + mutex_unlock(&rt2x00dev->csr_mutex); + + return value; +} + + +static void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev, + const unsigned int word, const u8 value) +{ + u32 reg; + + mutex_lock(&rt2x00dev->csr_mutex); + + /* + * Wait until the RFCSR becomes available, afterwards we + * can safely write the new data into the register. + */ + switch (rt2x00dev->chip.rt) { + case RT6352: + if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®)) { + reg = 0; + rt2x00_set_field32(®, RF_CSR_CFG_DATA_MT7620, value); + rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, + word); + rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 1); + rt2x00_set_field32(®, RF_CSR_CFG_BUSY_MT7620, 1); + + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); + } + break; + + default: + if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { + reg = 0; + rt2x00_set_field32(®, RF_CSR_CFG_DATA, value); + rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); + rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); + rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); + + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); + } + break; + } + + mutex_unlock(&rt2x00dev->csr_mutex); +} + +static void rt2800_rfcsr_write_bank(struct rt2x00_dev *rt2x00dev, const u8 bank, + const unsigned int reg, const u8 value) +{ + rt2800_rfcsr_write(rt2x00dev, (reg | (bank << 6)), value); +} + +static void rt2800_rfcsr_write_chanreg(struct rt2x00_dev *rt2x00dev, + const unsigned int reg, const u8 value) +{ + rt2800_rfcsr_write_bank(rt2x00dev, 4, reg, value); + rt2800_rfcsr_write_bank(rt2x00dev, 6, reg, value); +} + +static void rt2800_rfcsr_write_dccal(struct rt2x00_dev *rt2x00dev, + const unsigned int reg, const u8 value) +{ + rt2800_rfcsr_write_bank(rt2x00dev, 5, reg, value); + rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value); +} + +static u8 rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev, + const unsigned int word) +{ + u32 reg; + u8 value; + + mutex_lock(&rt2x00dev->csr_mutex); + + /* + * Wait until the RFCSR becomes available, afterwards we + * can safely write the read request into the register. + * After the data has been written, we wait until hardware + * returns the correct value, if at any time the register + * doesn't become available in time, reg will be 0xffffffff + * which means we return 0xff to the caller. + */ + switch (rt2x00dev->chip.rt) { + case RT6352: + if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®)) { + reg = 0; + rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, + word); + rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 0); + rt2x00_set_field32(®, RF_CSR_CFG_BUSY_MT7620, 1); + + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); + + WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®); + } + + value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA_MT7620); + break; + + default: + if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { + reg = 0; + rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); + rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 0); + rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); + + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); + + WAIT_FOR_RFCSR(rt2x00dev, ®); + } + + value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA); + break; + } + + mutex_unlock(&rt2x00dev->csr_mutex); + + return value; +} + +static u8 rt2800_rfcsr_read_bank(struct rt2x00_dev *rt2x00dev, const u8 bank, + const unsigned int reg) +{ + return rt2800_rfcsr_read(rt2x00dev, (reg | (bank << 6))); +} + +static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev, + const unsigned int word, const u32 value) +{ + u32 reg; + + mutex_lock(&rt2x00dev->csr_mutex); + + /* + * Wait until the RF becomes available, afterwards we + * can safely write the new data into the register. + */ + if (WAIT_FOR_RF(rt2x00dev, ®)) { + reg = 0; + rt2x00_set_field32(®, RF_CSR_CFG0_REG_VALUE_BW, value); + rt2x00_set_field32(®, RF_CSR_CFG0_STANDBYMODE, 0); + rt2x00_set_field32(®, RF_CSR_CFG0_SEL, 0); + rt2x00_set_field32(®, RF_CSR_CFG0_BUSY, 1); + + rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG0, reg); + rt2x00_rf_write(rt2x00dev, word, value); + } + + mutex_unlock(&rt2x00dev->csr_mutex); +} + +static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, + const unsigned int word, + const u8 value) +{ + u8 chain, reg; + + for (chain = 0; chain < rt2x00dev->default_ant.rx_chain_num; chain++) { + reg = rt2800_bbp_read(rt2x00dev, 27); + rt2x00_set_field8(®, BBP27_RX_CHAIN_SEL, chain); + rt2800_bbp_write(rt2x00dev, 27, reg); + + rt2800_bbp_write(rt2x00dev, word, value); + } +} + + +static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = { + [EEPROM_CHIP_ID] = 0x0000, + [EEPROM_VERSION] = 0x0001, + [EEPROM_MAC_ADDR_0] = 0x0002, + [EEPROM_MAC_ADDR_1] = 0x0003, + [EEPROM_MAC_ADDR_2] = 0x0004, + [EEPROM_NIC_CONF0] = 0x001a, + [EEPROM_NIC_CONF1] = 0x001b, + [EEPROM_FREQ] = 0x001d, + [EEPROM_LED_AG_CONF] = 0x001e, + [EEPROM_LED_ACT_CONF] = 0x001f, + [EEPROM_LED_POLARITY] = 0x0020, + [EEPROM_NIC_CONF2] = 0x0021, + [EEPROM_LNA] = 0x0022, + [EEPROM_RSSI_BG] = 0x0023, + [EEPROM_RSSI_BG2] = 0x0024, + [EEPROM_TXMIXER_GAIN_BG] = 0x0024, /* overlaps with RSSI_BG2 */ + [EEPROM_RSSI_A] = 0x0025, + [EEPROM_RSSI_A2] = 0x0026, + [EEPROM_TXMIXER_GAIN_A] = 0x0026, /* overlaps with RSSI_A2 */ + [EEPROM_EIRP_MAX_TX_POWER] = 0x0027, + [EEPROM_TXPOWER_DELTA] = 0x0028, + [EEPROM_TXPOWER_BG1] = 0x0029, + [EEPROM_TXPOWER_BG2] = 0x0030, + [EEPROM_TSSI_BOUND_BG1] = 0x0037, + [EEPROM_TSSI_BOUND_BG2] = 0x0038, + [EEPROM_TSSI_BOUND_BG3] = 0x0039, + [EEPROM_TSSI_BOUND_BG4] = 0x003a, + [EEPROM_TSSI_BOUND_BG5] = 0x003b, + [EEPROM_TXPOWER_A1] = 0x003c, + [EEPROM_TXPOWER_A2] = 0x0053, + [EEPROM_TXPOWER_INIT] = 0x0068, + [EEPROM_TSSI_BOUND_A1] = 0x006a, + [EEPROM_TSSI_BOUND_A2] = 0x006b, + [EEPROM_TSSI_BOUND_A3] = 0x006c, + [EEPROM_TSSI_BOUND_A4] = 0x006d, + [EEPROM_TSSI_BOUND_A5] = 0x006e, + [EEPROM_TXPOWER_BYRATE] = 0x006f, + [EEPROM_BBP_START] = 0x0078, +}; + +static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = { + [EEPROM_CHIP_ID] = 0x0000, + [EEPROM_VERSION] = 0x0001, + [EEPROM_MAC_ADDR_0] = 0x0002, + [EEPROM_MAC_ADDR_1] = 0x0003, + [EEPROM_MAC_ADDR_2] = 0x0004, + [EEPROM_NIC_CONF0] = 0x001a, + [EEPROM_NIC_CONF1] = 0x001b, + [EEPROM_NIC_CONF2] = 0x001c, + [EEPROM_EIRP_MAX_TX_POWER] = 0x0020, + [EEPROM_FREQ] = 0x0022, + [EEPROM_LED_AG_CONF] = 0x0023, + [EEPROM_LED_ACT_CONF] = 0x0024, + [EEPROM_LED_POLARITY] = 0x0025, + [EEPROM_LNA] = 0x0026, + [EEPROM_EXT_LNA2] = 0x0027, + [EEPROM_RSSI_BG] = 0x0028, + [EEPROM_RSSI_BG2] = 0x0029, + [EEPROM_RSSI_A] = 0x002a, + [EEPROM_RSSI_A2] = 0x002b, + [EEPROM_TXPOWER_BG1] = 0x0030, + [EEPROM_TXPOWER_BG2] = 0x0037, + [EEPROM_EXT_TXPOWER_BG3] = 0x003e, + [EEPROM_TSSI_BOUND_BG1] = 0x0045, + [EEPROM_TSSI_BOUND_BG2] = 0x0046, + [EEPROM_TSSI_BOUND_BG3] = 0x0047, + [EEPROM_TSSI_BOUND_BG4] = 0x0048, + [EEPROM_TSSI_BOUND_BG5] = 0x0049, + [EEPROM_TXPOWER_A1] = 0x004b, + [EEPROM_TXPOWER_A2] = 0x0065, + [EEPROM_EXT_TXPOWER_A3] = 0x007f, + [EEPROM_TSSI_BOUND_A1] = 0x009a, + [EEPROM_TSSI_BOUND_A2] = 0x009b, + [EEPROM_TSSI_BOUND_A3] = 0x009c, + [EEPROM_TSSI_BOUND_A4] = 0x009d, + [EEPROM_TSSI_BOUND_A5] = 0x009e, + [EEPROM_TXPOWER_BYRATE] = 0x00a0, +}; + +static unsigned int rt2800_eeprom_word_index(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word) { + const unsigned int *map; + unsigned int index; + + if (word >= EEPROM_WORD_COUNT) { + rt2x00_err(rt2x00dev, "invalid EEPROM word %d\n", word); + return 0; + } + + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) + map = rt2800_eeprom_map_ext; + else + map = rt2800_eeprom_map; + + index = map[word]; + + /* Index 0 is valid only for EEPROM_CHIP_ID. + * Otherwise it means that the offset of the + * given word is not initialized in the map, + * or that the field is not usable on the + * actual chipset. + */ + if (word != EEPROM_CHIP_ID && index == 0) { + rt2x00_err(rt2x00dev, "invalid access of EEPROM word %d", word); + } + + return index; +} + +static void *rt2800_eeprom_addr(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word) +{ + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, word); + return rt2x00_eeprom_addr(rt2x00dev, index); +} + +static u16 rt2800_eeprom_read(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word) { + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, word); + return rt2x00_eeprom_read(rt2x00dev, index); +} + +static void rt2800_eeprom_write(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word, u16 data) { + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, word); + rt2x00_eeprom_write(rt2x00dev, index, data); +} + +static u16 rt2800_eeprom_read_from_array(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word array, + unsigned int offset) { + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, array); + return rt2x00_eeprom_read(rt2x00dev, index + offset); +} + +static int rt2800_enable_wlan_rt3290(struct rt2x00_dev *rt2x00dev) { + u32 reg; + int i, count; + + reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL); + rt2x00_set_field32(®, WLAN_GPIO_OUT_OE_BIT_ALL, 0xff); + rt2x00_set_field32(®, FRC_WL_ANT_SET, 1); + rt2x00_set_field32(®, WLAN_CLK_EN, 0); + rt2x00_set_field32(®, WLAN_EN, 1); + rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); + + usleep(REGISTER_BUSY_DELAY); + + count = 0; + do { + /* + * Check PLL_LD & XTAL_RDY. + */ + for (i = 0; i < REGISTER_BUSY_COUNT; i++) { + reg = rt2800_register_read(rt2x00dev, CMB_CTRL); + if (rt2x00_get_field32(reg, PLL_LD) && + rt2x00_get_field32(reg, XTAL_RDY)) + break; + usleep(REGISTER_BUSY_DELAY); + } + + if (i >= REGISTER_BUSY_COUNT) { + + if (count >= 10) + return -EIO; + + rt2800_register_write(rt2x00dev, 0x58, 0x018); + usleep(REGISTER_BUSY_DELAY); + rt2800_register_write(rt2x00dev, 0x58, 0x418); + usleep(REGISTER_BUSY_DELAY); + rt2800_register_write(rt2x00dev, 0x58, 0x618); + usleep(REGISTER_BUSY_DELAY); + count++; + } else { + count = 0; + } + + reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL); + rt2x00_set_field32(®, PCIE_APP0_CLK_REQ, 0); + rt2x00_set_field32(®, WLAN_CLK_EN, 1); + rt2x00_set_field32(®, WLAN_RESET, 1); + rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); + usleep(10); + rt2x00_set_field32(®, WLAN_RESET, 0); + rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); + usleep(10); + rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, 0x7fffffff); + } while (count != 0); + + return 0; +} + +void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, + const u8 command, const u8 token, + const u8 arg0, const u8 arg1) { + u32 reg; + + mutex_lock(&rt2x00dev->csr_mutex); + + /* + * Wait until the MCU becomes available, afterwards we + * can safely write the new data into the register. + */ + if (WAIT_FOR_MCU(rt2x00dev, ®)) { + rt2x00_set_field32(®, H2M_MAILBOX_CSR_OWNER, 1); + rt2x00_set_field32(®, H2M_MAILBOX_CSR_CMD_TOKEN, token); + rt2x00_set_field32(®, H2M_MAILBOX_CSR_ARG0, arg0); + rt2x00_set_field32(®, H2M_MAILBOX_CSR_ARG1, arg1); + rt2800_register_write_lock(rt2x00dev, H2M_MAILBOX_CSR, reg); + + reg = 0; + rt2x00_set_field32(®, HOST_CMD_CSR_HOST_COMMAND, command); + rt2800_register_write_lock(rt2x00dev, HOST_CMD_CSR, reg); + } + + mutex_unlock(&rt2x00dev->csr_mutex); +} + +int rt2800_wait_csr_ready(struct rt2x00_dev *rt2x00dev) { + unsigned int i = 0; + u32 reg; + + for (i = 0; i < REGISTER_BUSY_COUNT; i++) { + reg = rt2800_register_read(rt2x00dev, MAC_CSR0); + if (reg && reg != ~0U) + return 0; + usleep(1); + } + + rt2x00_err(rt2x00dev, "Unstable hardware\n"); + return -EBUSY; +} + +int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev) { + unsigned int i; + u32 reg; + + /* + * Some devices are really slow to respond here. Wait a whole second + * before timing out. + */ + for (i = 0; i < REGISTER_BUSY_COUNT; i++) { + reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG); + if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) && + !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY)) + return 0; + + usleep(10); + } + + rt2x00_err(rt2x00dev, "WPDMA TX/RX busy [0x%08x]\n", reg); + return -EACCES; +} + +int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev) { + u32 reg; + u16 efuse_ctrl_reg; + + if (rt2x00_rt(rt2x00dev, RT3290)) + efuse_ctrl_reg = EFUSE_CTRL_3290; + else + efuse_ctrl_reg = EFUSE_CTRL; + + reg = rt2800_register_read(rt2x00dev, efuse_ctrl_reg); + return rt2x00_get_field32(reg, EFUSE_CTRL_PRESENT); +} + +static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i) { + u32 reg; + u16 efuse_ctrl_reg; + u16 efuse_data0_reg; + u16 efuse_data1_reg; + u16 efuse_data2_reg; + u16 efuse_data3_reg; + + if (rt2x00_rt(rt2x00dev, RT3290)) { + efuse_ctrl_reg = EFUSE_CTRL_3290; + efuse_data0_reg = EFUSE_DATA0_3290; + efuse_data1_reg = EFUSE_DATA1_3290; + efuse_data2_reg = EFUSE_DATA2_3290; + efuse_data3_reg = EFUSE_DATA3_3290; + } else { + efuse_ctrl_reg = EFUSE_CTRL; + efuse_data0_reg = EFUSE_DATA0; + efuse_data1_reg = EFUSE_DATA1; + efuse_data2_reg = EFUSE_DATA2; + efuse_data3_reg = EFUSE_DATA3; + } + + reg = rt2800_register_read_lock(rt2x00dev, efuse_ctrl_reg); + rt2x00_set_field32(®, EFUSE_CTRL_ADDRESS_IN, i); + rt2x00_set_field32(®, EFUSE_CTRL_MODE, 0); + rt2x00_set_field32(®, EFUSE_CTRL_KICK, 1); + rt2800_register_write_lock(rt2x00dev, efuse_ctrl_reg, reg); + + /* Wait until the EEPROM has been loaded */ + rt2800_regbusy_read(rt2x00dev, efuse_ctrl_reg, EFUSE_CTRL_KICK, ®); + /* Apparently the data is read from end to start */ + reg = rt2800_register_read_lock(rt2x00dev, efuse_data3_reg); + /* The returned value is in CPU order, but eeprom is le */ + *(u32 *)&rt2x00dev->eeprom[i] = cpu_to_le32(reg); + reg = rt2800_register_read_lock(rt2x00dev, efuse_data2_reg); + *(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg); + reg = rt2800_register_read_lock(rt2x00dev, efuse_data1_reg); + *(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg); + reg = rt2800_register_read_lock(rt2x00dev, efuse_data0_reg); + *(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg); +} + +int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev) { + unsigned int i; + + for (i = 0; i < EEPROM_SIZE / sizeof(u16); i += 8) + rt2800_efuse_read(rt2x00dev, i); + + return 0; +} + +/* + * Configuration handlers. + */ +static void rt2800_config_wcid(struct rt2x00_dev *rt2x00dev, + const u8 *address, + int wcid) { + struct mac_wcid_entry wcid_entry; + u32 offset; + + offset = MAC_WCID_ENTRY(wcid); + + memset(&wcid_entry, 0xff, sizeof(wcid_entry)); + if (address) + memcpy(wcid_entry.mac, address, ETH_ALEN); + + rt2800_register_multiwrite(rt2x00dev, offset, + &wcid_entry, sizeof(wcid_entry)); +} + +static void rt2800_delete_wcid_attr(struct rt2x00_dev *rt2x00dev, int wcid) { + u32 offset; + offset = MAC_WCID_ATTR_ENTRY(wcid); + rt2800_register_write(rt2x00dev, offset, 0); +} + +#if 0 +static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev, + int wcid, u32 bssidx) { + u32 offset = MAC_WCID_ATTR_ENTRY(wcid); + u32 reg; + + /* + * The BSS Idx numbers is split in a main value of 3 bits, + * and a extended field for adding one additional bit to the value. + */ + reg = rt2800_register_read(rt2x00dev, offset); + rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX, (bssidx & 0x7)); + rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX_EXT, + (bssidx & 0x8) >> 3); + rt2800_register_write(rt2x00dev, offset, reg); +} + +static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_crypto *crypto, + struct ieee80211_key_conf *key) { + struct mac_iveiv_entry iveiv_entry; + u32 offset; + u32 reg; + + /* + * Gutted to simply clear the keys, we never set it since we + * don't tx from userspace + */ + + offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx); + + /* Delete the cipher without touching the bssidx */ + reg = rt2800_register_read(rt2x00dev, offset); + rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_KEYTAB, 0); + rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER, 0); + rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER_EXT, 0); + rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0); + rt2800_register_write(rt2x00dev, offset, reg); + + offset = MAC_IVEIV_ENTRY(key->hw_key_idx); + + /* + * Similarly gutted of the key type setting + */ + memset(&iveiv_entry, 0, sizeof(iveiv_entry)); + iveiv_entry.iv[3] |= key->keyidx << 6; + rt2800_register_multiwrite(rt2x00dev, offset, + &iveiv_entry, sizeof(iveiv_entry)); +} +#endif + +/* + * We don't allow userspace to tx so we don't have to do anything here + */ +static inline void rt2800_clear_beacon_register(struct rt2x00_dev *rt2x00dev, + unsigned int index) { + +} + +static void rt2800_config_3572bt_ant(struct rt2x00_dev *rt2x00dev) +{ + u32 reg; + u16 eeprom; + u8 led_ctrl, led_g_mode, led_r_mode; + + reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH); + if (rt2x00dev->curr_band == NL80211_BAND_5GHZ) { + rt2x00_set_field32(®, GPIO_SWITCH_0, 1); + rt2x00_set_field32(®, GPIO_SWITCH_1, 1); + } else { + rt2x00_set_field32(®, GPIO_SWITCH_0, 0); + rt2x00_set_field32(®, GPIO_SWITCH_1, 0); + } + rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg); + + reg = rt2800_register_read(rt2x00dev, LED_CFG); + led_g_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 3 : 0; + led_r_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 0 : 3; + if (led_g_mode != rt2x00_get_field32(reg, LED_CFG_G_LED_MODE) || + led_r_mode != rt2x00_get_field32(reg, LED_CFG_R_LED_MODE)) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ); + led_ctrl = rt2x00_get_field16(eeprom, EEPROM_FREQ_LED_MODE); + if (led_ctrl == 0 || led_ctrl > 0x40) { + rt2x00_set_field32(®, LED_CFG_G_LED_MODE, led_g_mode); + rt2x00_set_field32(®, LED_CFG_R_LED_MODE, led_r_mode); + rt2800_register_write(rt2x00dev, LED_CFG, reg); + } else { + rt2800_mcu_request(rt2x00dev, MCU_BAND_SELECT, 0xff, + (led_g_mode << 2) | led_r_mode, 1); + } + } +} + +static void rt2800_set_ant_diversity(struct rt2x00_dev *rt2x00dev, + enum antenna ant) +{ + u32 reg; + u8 eesk_pin = (ant == ANTENNA_A) ? 1 : 0; + u8 gpio_bit3 = (ant == ANTENNA_A) ? 0 : 1; + + if (rt2x00_is_pci(rt2x00dev)) { + reg = rt2800_register_read(rt2x00dev, E2PROM_CSR); + rt2x00_set_field32(®, E2PROM_CSR_DATA_CLOCK, eesk_pin); + rt2800_register_write(rt2x00dev, E2PROM_CSR, reg); + } else if (rt2x00_is_usb(rt2x00dev)) + rt2800_mcu_request(rt2x00dev, MCU_ANT_SELECT, 0xff, + eesk_pin, 0); + + reg = rt2800_register_read(rt2x00dev, GPIO_CTRL); + rt2x00_set_field32(®, GPIO_CTRL_DIR3, 0); + rt2x00_set_field32(®, GPIO_CTRL_VAL3, gpio_bit3); + rt2800_register_write(rt2x00dev, GPIO_CTRL, reg); +} + +void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant) +{ + u8 r1; + u8 r3; + u16 eeprom; + + rt2x00_info(rt2x00dev, "Configuring rt2800 antenna\n"); + + r1 = rt2800_bbp_read(rt2x00dev, 1); + r3 = rt2800_bbp_read(rt2x00dev, 3); + + if (rt2x00_rt(rt2x00dev, RT3572) && + rt2x00_has_cap_bt_coexist(rt2x00dev)) + rt2800_config_3572bt_ant(rt2x00dev); + + /* + * Configure the TX antenna. + */ + switch (ant->tx_chain_num) { + case 1: + rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0); + break; + case 2: + if (rt2x00_rt(rt2x00dev, RT3572) && + rt2x00_has_cap_bt_coexist(rt2x00dev)) + rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 1); + else + rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2); + break; + case 3: + rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2); + break; + } + + /* + * Configure the RX antenna. + */ + switch (ant->rx_chain_num) { + case 1: + if (rt2x00_rt(rt2x00dev, RT3070) || + rt2x00_rt(rt2x00dev, RT3090) || + rt2x00_rt(rt2x00dev, RT3352) || + rt2x00_rt(rt2x00dev, RT3390)) { + eeprom = rt2800_eeprom_read(rt2x00dev, + EEPROM_NIC_CONF1); + if (rt2x00_get_field16(eeprom, + EEPROM_NIC_CONF1_ANT_DIVERSITY)) + rt2800_set_ant_diversity(rt2x00dev, + rt2x00dev->default_ant.rx); + } + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0); + break; + case 2: + if (rt2x00_rt(rt2x00dev, RT3572) && + rt2x00_has_cap_bt_coexist(rt2x00dev)) { + rt2x00_set_field8(&r3, BBP3_RX_ADC, 1); + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, + rt2x00dev->curr_band == NL80211_BAND_5GHZ); + rt2800_set_ant_diversity(rt2x00dev, ANTENNA_B); + } else { + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1); + } + break; + case 3: + rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2); + break; + } + + rt2800_bbp_write(rt2x00dev, 3, r3); + rt2800_bbp_write(rt2x00dev, 1, r1); + + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { + if (ant->rx_chain_num == 1) + rt2800_bbp_write(rt2x00dev, 86, 0x00); + else + rt2800_bbp_write(rt2x00dev, 86, 0x46); + } +} +EXPORT_SYMBOL_GPL(rt2800_config_ant); + +static void rt2800_config_lna_gain(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_conf *libconf) +{ + u16 eeprom; + short lna_gain; + + if (libconf->rf.channel <= 14) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA); + lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_BG); + } else if (libconf->rf.channel <= 64) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA); + lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0); + } else if (libconf->rf.channel <= 128) { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); + lna_gain = rt2x00_get_field16(eeprom, + EEPROM_EXT_LNA2_A1); + } else { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2); + lna_gain = rt2x00_get_field16(eeprom, + EEPROM_RSSI_BG2_LNA_A1); + } + } else { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); + lna_gain = rt2x00_get_field16(eeprom, + EEPROM_EXT_LNA2_A2); + } else { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2); + lna_gain = rt2x00_get_field16(eeprom, + EEPROM_RSSI_A2_LNA_A2); + } + } + + rt2x00dev->lna_gain = lna_gain; +} + +#define FREQ_OFFSET_BOUND 0x5f + +static void rt2800_freq_cal_mode1(struct rt2x00_dev *rt2x00dev) +{ + u8 freq_offset, prev_freq_offset; + u8 rfcsr, prev_rfcsr; + + freq_offset = rt2x00_get_field8(rt2x00dev->freq_offset, RFCSR17_CODE); + freq_offset = min_t(u8, freq_offset, FREQ_OFFSET_BOUND); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 17); + prev_rfcsr = rfcsr; + + rt2x00_set_field8(&rfcsr, RFCSR17_CODE, freq_offset); + if (rfcsr == prev_rfcsr) + return; + + if (rt2x00_is_usb(rt2x00dev)) { + rt2800_mcu_request(rt2x00dev, MCU_FREQ_OFFSET, 0xff, + freq_offset, prev_rfcsr); + return; + } + + prev_freq_offset = rt2x00_get_field8(prev_rfcsr, RFCSR17_CODE); + while (prev_freq_offset != freq_offset) { + if (prev_freq_offset < freq_offset) + prev_freq_offset++; + else + prev_freq_offset--; + + rt2x00_set_field8(&rfcsr, RFCSR17_CODE, prev_freq_offset); + rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); + + usleep_range(1000, 1500); + } +} + +static void rt2800_config_channel_rf2xxx(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + rt2x00_set_field32(&rf->rf4, RF4_FREQ_OFFSET, rt2x00dev->freq_offset); + + if (rt2x00dev->default_ant.tx_chain_num == 1) + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_TX1, 1); + + if (rt2x00dev->default_ant.rx_chain_num == 1) { + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX1, 1); + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1); + } else if (rt2x00dev->default_ant.rx_chain_num == 2) + rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1); + + if (rf->channel > 14) { + /* + * When TX power is below 0, we should increase it by 7 to + * make it a positive value (Minimum value is -7). + * However this means that values between 0 and 7 have + * double meaning, and we should set a 7DBm boost flag. + */ + rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A_7DBM_BOOST, + (info->default_power1 >= 0)); + + if (info->default_power1 < 0) + info->default_power1 += 7; + + rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A, info->default_power1); + + rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A_7DBM_BOOST, + (info->default_power2 >= 0)); + + if (info->default_power2 < 0) + info->default_power2 += 7; + + rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A, info->default_power2); + } else { + rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_G, info->default_power1); + rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_G, info->default_power2); + } + + rt2x00_set_field32(&rf->rf4, RF4_HT40, conf_is_ht40(conf)); + + rt2800_rf_write(rt2x00dev, 1, rf->rf1); + rt2800_rf_write(rt2x00dev, 2, rf->rf2); + rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004); + rt2800_rf_write(rt2x00dev, 4, rf->rf4); + + udelay(200); + + rt2800_rf_write(rt2x00dev, 1, rf->rf1); + rt2800_rf_write(rt2x00dev, 2, rf->rf2); + rt2800_rf_write(rt2x00dev, 3, rf->rf3 | 0x00000004); + rt2800_rf_write(rt2x00dev, 4, rf->rf4); + + udelay(200); + + rt2800_rf_write(rt2x00dev, 1, rf->rf1); + rt2800_rf_write(rt2x00dev, 2, rf->rf2); + rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004); + rt2800_rf_write(rt2x00dev, 4, rf->rf4); +} + +static void rt2800_config_channel_rf3xxx(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + struct rt2800_drv_data *drv_data = (struct rt2800_drv_data *) rt2x00dev->drv_data; + u8 rfcsr, calib_tx, calib_rx; + + rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); + rt2x00_set_field8(&rfcsr, RFCSR3_K, rf->rf3); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); + rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2); + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 12); + rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER, info->default_power1); + rt2800_rfcsr_write(rt2x00dev, 12, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 13); + rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, info->default_power2); + rt2800_rfcsr_write(rt2x00dev, 13, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, + rt2x00dev->default_ant.rx_chain_num <= 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, + rt2x00dev->default_ant.rx_chain_num <= 2); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, + rt2x00dev->default_ant.tx_chain_num <= 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, + rt2x00dev->default_ant.tx_chain_num <= 2); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 23); + rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset); + rt2800_rfcsr_write(rt2x00dev, 23, rfcsr); + + if (rt2x00_rt(rt2x00dev, RT3390)) { + calib_tx = conf_is_ht40(conf) ? 0x68 : 0x4f; + calib_rx = conf_is_ht40(conf) ? 0x6f : 0x4f; + } else { + if (conf_is_ht40(conf)) { + calib_tx = drv_data->calibration_bw40; + calib_rx = drv_data->calibration_bw40; + } else { + calib_tx = drv_data->calibration_bw20; + calib_rx = drv_data->calibration_bw20; + } + } + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 24); + rt2x00_set_field8(&rfcsr, RFCSR24_TX_CALIB, calib_tx); + rt2800_rfcsr_write(rt2x00dev, 24, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 31); + rt2x00_set_field8(&rfcsr, RFCSR31_RX_CALIB, calib_rx); + rt2800_rfcsr_write(rt2x00dev, 31, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 7); + rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1); + rt2800_rfcsr_write(rt2x00dev, 7, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); + rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1); + rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); + + usleep_range(1000, 1500); + + rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 0); + rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); +} + +static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + struct rt2800_drv_data *drv_data = (struct rt2800_drv_data *) rt2x00dev->drv_data; + u8 rfcsr; + u32 reg; + + if (rf->channel <= 14) { + rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25); + rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26); + } else { + rt2800_bbp_write(rt2x00dev, 25, 0x09); + rt2800_bbp_write(rt2x00dev, 26, 0xff); + } + + rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1); + rt2800_rfcsr_write(rt2x00dev, 3, rf->rf3); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); + rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 2); + else + rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 1); + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 5); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR5_R1, 1); + else + rt2x00_set_field8(&rfcsr, RFCSR5_R1, 2); + rt2800_rfcsr_write(rt2x00dev, 5, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 12); + if (rf->channel <= 14) { + rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 3); + rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER, + info->default_power1); + } else { + rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 7); + rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER, + (info->default_power1 & 0x3) | + ((info->default_power1 & 0xC) << 1)); + } + rt2800_rfcsr_write(rt2x00dev, 12, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 13); + if (rf->channel <= 14) { + rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 3); + rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, + info->default_power2); + } else { + rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 7); + rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, + (info->default_power2 & 0x3) | + ((info->default_power2 & 0xC) << 1)); + } + rt2800_rfcsr_write(rt2x00dev, 13, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); + if (rt2x00_has_cap_bt_coexist(rt2x00dev)) { + if (rf->channel <= 14) { + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1); + } + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1); + } else { + switch (rt2x00dev->default_ant.tx_chain_num) { + case 1: + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); + /* fall through */ + case 2: + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1); + break; + } + + switch (rt2x00dev->default_ant.rx_chain_num) { + case 1: + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); + /* fall through */ + case 2: + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1); + break; + } + } + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 23); + rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset); + rt2800_rfcsr_write(rt2x00dev, 23, rfcsr); + + if (conf_is_ht40(conf)) { + rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw40); + rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw40); + } else { + rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw20); + rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw20); + } + + if (rf->channel <= 14) { + rt2800_rfcsr_write(rt2x00dev, 7, 0xd8); + rt2800_rfcsr_write(rt2x00dev, 9, 0xc3); + rt2800_rfcsr_write(rt2x00dev, 10, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 11, 0xb9); + rt2800_rfcsr_write(rt2x00dev, 15, 0x53); + rfcsr = 0x4c; + rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN, + drv_data->txmixer_gain_24g); + rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 17, 0x23); + rt2800_rfcsr_write(rt2x00dev, 19, 0x93); + rt2800_rfcsr_write(rt2x00dev, 20, 0xb3); + rt2800_rfcsr_write(rt2x00dev, 25, 0x15); + rt2800_rfcsr_write(rt2x00dev, 26, 0x85); + rt2800_rfcsr_write(rt2x00dev, 27, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0x9b); + } else { + rfcsr = rt2800_rfcsr_read(rt2x00dev, 7); + rt2x00_set_field8(&rfcsr, RFCSR7_BIT2, 1); + rt2x00_set_field8(&rfcsr, RFCSR7_BIT3, 0); + rt2x00_set_field8(&rfcsr, RFCSR7_BIT4, 1); + rt2x00_set_field8(&rfcsr, RFCSR7_BITS67, 0); + rt2800_rfcsr_write(rt2x00dev, 7, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 9, 0xc0); + rt2800_rfcsr_write(rt2x00dev, 10, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 11, 0x00); + rt2800_rfcsr_write(rt2x00dev, 15, 0x43); + rfcsr = 0x7a; + rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN, + drv_data->txmixer_gain_5g); + rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 17, 0x23); + if (rf->channel <= 64) { + rt2800_rfcsr_write(rt2x00dev, 19, 0xb7); + rt2800_rfcsr_write(rt2x00dev, 20, 0xf6); + rt2800_rfcsr_write(rt2x00dev, 25, 0x3d); + } else if (rf->channel <= 128) { + rt2800_rfcsr_write(rt2x00dev, 19, 0x74); + rt2800_rfcsr_write(rt2x00dev, 20, 0xf4); + rt2800_rfcsr_write(rt2x00dev, 25, 0x01); + } else { + rt2800_rfcsr_write(rt2x00dev, 19, 0x72); + rt2800_rfcsr_write(rt2x00dev, 20, 0xf3); + rt2800_rfcsr_write(rt2x00dev, 25, 0x01); + } + rt2800_rfcsr_write(rt2x00dev, 26, 0x87); + rt2800_rfcsr_write(rt2x00dev, 27, 0x01); + rt2800_rfcsr_write(rt2x00dev, 29, 0x9f); + } + + reg = rt2800_register_read(rt2x00dev, GPIO_CTRL); + rt2x00_set_field32(®, GPIO_CTRL_DIR7, 0); + if (rf->channel <= 14) + rt2x00_set_field32(®, GPIO_CTRL_VAL7, 1); + else + rt2x00_set_field32(®, GPIO_CTRL_VAL7, 0); + rt2800_register_write(rt2x00dev, GPIO_CTRL, reg); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 7); + rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1); + rt2800_rfcsr_write(rt2x00dev, 7, rfcsr); +} + +static void rt2800_config_channel_rf3053(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + struct rt2800_drv_data *drv_data = (struct rt2800_drv_data *) rt2x00dev->drv_data; + u8 txrx_agc_fc; + u8 txrx_h20m; + u8 rfcsr; + u8 bbp; + const bool txbf_enabled = false; /* TODO */ + + /* TODO: use TX{0,1,2}FinePowerControl values from EEPROM */ + bbp = rt2800_bbp_read(rt2x00dev, 109); + rt2x00_set_field8(&bbp, BBP109_TX0_POWER, 0); + rt2x00_set_field8(&bbp, BBP109_TX1_POWER, 0); + rt2800_bbp_write(rt2x00dev, 109, bbp); + + bbp = rt2800_bbp_read(rt2x00dev, 110); + rt2x00_set_field8(&bbp, BBP110_TX2_POWER, 0); + rt2800_bbp_write(rt2x00dev, 110, bbp); + + if (rf->channel <= 14) { + /* Restore BBP 25 & 26 for 2.4 GHz */ + rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25); + rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26); + } else { + /* Hard code BBP 25 & 26 for 5GHz */ + + /* Enable IQ Phase correction */ + rt2800_bbp_write(rt2x00dev, 25, 0x09); + /* Setup IQ Phase correction value */ + rt2800_bbp_write(rt2x00dev, 26, 0xff); + } + + rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1); + rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3 & 0xf); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 11); + rt2x00_set_field8(&rfcsr, RFCSR11_R, (rf->rf2 & 0x3)); + rt2800_rfcsr_write(rt2x00dev, 11, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 11); + rt2x00_set_field8(&rfcsr, RFCSR11_PLL_IDOH, 1); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 1); + else + rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 2); + rt2800_rfcsr_write(rt2x00dev, 11, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 53); + if (rf->channel <= 14) { + rfcsr = 0; + rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER, + info->default_power1 & 0x1f); + } else { + if (rt2x00_is_usb(rt2x00dev)) + rfcsr = 0x40; + + rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER, + ((info->default_power1 & 0x18) << 1) | + (info->default_power1 & 7)); + } + rt2800_rfcsr_write(rt2x00dev, 53, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 55); + if (rf->channel <= 14) { + rfcsr = 0; + rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER, + info->default_power2 & 0x1f); + } else { + if (rt2x00_is_usb(rt2x00dev)) + rfcsr = 0x40; + + rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER, + ((info->default_power2 & 0x18) << 1) | + (info->default_power2 & 7)); + } + rt2800_rfcsr_write(rt2x00dev, 55, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 54); + if (rf->channel <= 14) { + rfcsr = 0; + rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER, + info->default_power3 & 0x1f); + } else { + if (rt2x00_is_usb(rt2x00dev)) + rfcsr = 0x40; + + rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER, + ((info->default_power3 & 0x18) << 1) | + (info->default_power3 & 7)); + } + rt2800_rfcsr_write(rt2x00dev, 54, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1); + + switch (rt2x00dev->default_ant.tx_chain_num) { + case 3: + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1); + /* fallthrough */ + case 2: + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); + /* fallthrough */ + case 1: + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1); + break; + } + + switch (rt2x00dev->default_ant.rx_chain_num) { + case 3: + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1); + /* fallthrough */ + case 2: + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); + /* fallthrough */ + case 1: + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1); + break; + } + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rt2800_freq_cal_mode1(rt2x00dev); + + if (conf_is_ht40(conf)) { + txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw40, + RFCSR24_TX_AGC_FC); + txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw40, + RFCSR24_TX_H20M); + } else { + txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw20, + RFCSR24_TX_AGC_FC); + txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw20, + RFCSR24_TX_H20M); + } + + /* NOTE: the reference driver does not writes the new value + * back to RFCSR 32 + */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 32); + rt2x00_set_field8(&rfcsr, RFCSR32_TX_AGC_FC, txrx_agc_fc); + + if (rf->channel <= 14) + rfcsr = 0xa0; + else + rfcsr = 0x80; + rt2800_rfcsr_write(rt2x00dev, 31, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); + rt2x00_set_field8(&rfcsr, RFCSR30_TX_H20M, txrx_h20m); + rt2x00_set_field8(&rfcsr, RFCSR30_RX_H20M, txrx_h20m); + rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); + + /* Band selection */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 36); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1); + else + rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0); + rt2800_rfcsr_write(rt2x00dev, 36, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 34); + if (rf->channel <= 14) + rfcsr = 0x3c; + else + rfcsr = 0x20; + rt2800_rfcsr_write(rt2x00dev, 34, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 12); + if (rf->channel <= 14) + rfcsr = 0x1a; + else + rfcsr = 0x12; + rt2800_rfcsr_write(rt2x00dev, 12, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); + if (rf->channel >= 1 && rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1); + else if (rf->channel >= 36 && rf->channel <= 64) + rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2); + else if (rf->channel >= 100 && rf->channel <= 128) + rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2); + else + rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1); + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); + rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2); + rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); + + rt2800_rfcsr_write(rt2x00dev, 46, 0x60); + + if (rf->channel <= 14) { + rt2800_rfcsr_write(rt2x00dev, 10, 0xd3); + rt2800_rfcsr_write(rt2x00dev, 13, 0x12); + } else { + rt2800_rfcsr_write(rt2x00dev, 10, 0xd8); + rt2800_rfcsr_write(rt2x00dev, 13, 0x23); + } + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 51); + rt2x00_set_field8(&rfcsr, RFCSR51_BITS01, 1); + rt2800_rfcsr_write(rt2x00dev, 51, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 51); + if (rf->channel <= 14) { + rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 5); + rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 3); + } else { + rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 4); + rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 2); + } + rt2800_rfcsr_write(rt2x00dev, 51, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 49); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 3); + else + rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 2); + + if (txbf_enabled) + rt2x00_set_field8(&rfcsr, RFCSR49_TX_DIV, 1); + + rt2800_rfcsr_write(rt2x00dev, 49, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 50); + rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO1_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 50, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 57); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x1b); + else + rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x0f); + rt2800_rfcsr_write(rt2x00dev, 57, rfcsr); + + if (rf->channel <= 14) { + rt2800_rfcsr_write(rt2x00dev, 44, 0x93); + rt2800_rfcsr_write(rt2x00dev, 52, 0x45); + } else { + rt2800_rfcsr_write(rt2x00dev, 44, 0x9b); + rt2800_rfcsr_write(rt2x00dev, 52, 0x05); + } + + /* Initiate VCO calibration */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); + if (rf->channel <= 14) { + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + } else { + rt2x00_set_field8(&rfcsr, RFCSR3_BIT1, 1); + rt2x00_set_field8(&rfcsr, RFCSR3_BIT2, 1); + rt2x00_set_field8(&rfcsr, RFCSR3_BIT3, 1); + rt2x00_set_field8(&rfcsr, RFCSR3_BIT4, 1); + rt2x00_set_field8(&rfcsr, RFCSR3_BIT5, 1); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + } + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + + if (rf->channel >= 1 && rf->channel <= 14) { + rfcsr = 0x23; + if (txbf_enabled) + rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1); + rt2800_rfcsr_write(rt2x00dev, 39, rfcsr); + + rt2800_rfcsr_write(rt2x00dev, 45, 0xbb); + } else if (rf->channel >= 36 && rf->channel <= 64) { + rfcsr = 0x36; + if (txbf_enabled) + rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1); + rt2800_rfcsr_write(rt2x00dev, 39, 0x36); + + rt2800_rfcsr_write(rt2x00dev, 45, 0xeb); + } else if (rf->channel >= 100 && rf->channel <= 128) { + rfcsr = 0x32; + if (txbf_enabled) + rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1); + rt2800_rfcsr_write(rt2x00dev, 39, rfcsr); + + rt2800_rfcsr_write(rt2x00dev, 45, 0xb3); + } else { + rfcsr = 0x30; + if (txbf_enabled) + rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1); + rt2800_rfcsr_write(rt2x00dev, 39, rfcsr); + + rt2800_rfcsr_write(rt2x00dev, 45, 0x9b); + } +} + +static void rt2800_config_channel_rf3853(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + u8 rfcsr; + u8 bbp; + u8 pwr1, pwr2, pwr3; + + const bool txbf_enabled = false; /* TODO */ + + /* TODO: add band selection */ + + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 6, 0x40); + else if (rf->channel < 132) + rt2800_rfcsr_write(rt2x00dev, 6, 0x80); + else + rt2800_rfcsr_write(rt2x00dev, 6, 0x40); + + rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1); + rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3); + + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 11, 0x46); + else + rt2800_rfcsr_write(rt2x00dev, 11, 0x48); + + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 12, 0x1a); + else + rt2800_rfcsr_write(rt2x00dev, 12, 0x52); + + rt2800_rfcsr_write(rt2x00dev, 13, 0x12); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1); + + switch (rt2x00dev->default_ant.tx_chain_num) { + case 3: + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1); + /* fallthrough */ + case 2: + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); + /* fallthrough */ + case 1: + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1); + break; + } + + switch (rt2x00dev->default_ant.rx_chain_num) { + case 3: + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1); + /* fallthrough */ + case 2: + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); + /* fallthrough */ + case 1: + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1); + break; + } + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rt2800_freq_cal_mode1(rt2x00dev); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); + if (!conf_is_ht40(conf)) + rfcsr &= ~(0x06); + else + rfcsr |= 0x06; + rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); + + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 31, 0xa0); + else + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + + if (conf_is_ht40(conf)) + rt2800_rfcsr_write(rt2x00dev, 32, 0x80); + else + rt2800_rfcsr_write(rt2x00dev, 32, 0xd8); + + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 34, 0x3c); + else + rt2800_rfcsr_write(rt2x00dev, 34, 0x20); + + /* loopback RF_BS */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 36); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1); + else + rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0); + rt2800_rfcsr_write(rt2x00dev, 36, rfcsr); + + if (rf->channel <= 14) + rfcsr = 0x23; + else if (rf->channel < 100) + rfcsr = 0x36; + else if (rf->channel < 132) + rfcsr = 0x32; + else + rfcsr = 0x30; + + if (txbf_enabled) + rfcsr |= 0x40; + + rt2800_rfcsr_write(rt2x00dev, 39, rfcsr); + + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 44, 0x93); + else + rt2800_rfcsr_write(rt2x00dev, 44, 0x9b); + + if (rf->channel <= 14) + rfcsr = 0xbb; + else if (rf->channel < 100) + rfcsr = 0xeb; + else if (rf->channel < 132) + rfcsr = 0xb3; + else + rfcsr = 0x9b; + rt2800_rfcsr_write(rt2x00dev, 45, rfcsr); + + if (rf->channel <= 14) + rfcsr = 0x8e; + else + rfcsr = 0x8a; + + if (txbf_enabled) + rfcsr |= 0x20; + + rt2800_rfcsr_write(rt2x00dev, 49, rfcsr); + + rt2800_rfcsr_write(rt2x00dev, 50, 0x86); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 51); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 51, 0x75); + else + rt2800_rfcsr_write(rt2x00dev, 51, 0x51); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 52); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 52, 0x45); + else + rt2800_rfcsr_write(rt2x00dev, 52, 0x05); + + if (rf->channel <= 14) { + pwr1 = info->default_power1 & 0x1f; + pwr2 = info->default_power2 & 0x1f; + pwr3 = info->default_power3 & 0x1f; + } else { + pwr1 = 0x48 | ((info->default_power1 & 0x18) << 1) | + (info->default_power1 & 0x7); + pwr2 = 0x48 | ((info->default_power2 & 0x18) << 1) | + (info->default_power2 & 0x7); + pwr3 = 0x48 | ((info->default_power3 & 0x18) << 1) | + (info->default_power3 & 0x7); + } + + rt2800_rfcsr_write(rt2x00dev, 53, pwr1); + rt2800_rfcsr_write(rt2x00dev, 54, pwr2); + rt2800_rfcsr_write(rt2x00dev, 55, pwr3); + + rt2x00_dbg(rt2x00dev, "Channel:%d, pwr1:%02x, pwr2:%02x, pwr3:%02x\n", + rf->channel, pwr1, pwr2, pwr3); + + bbp = (info->default_power1 >> 5) | + ((info->default_power2 & 0xe0) >> 1); + rt2800_bbp_write(rt2x00dev, 109, bbp); + + bbp = rt2800_bbp_read(rt2x00dev, 110); + bbp &= 0x0f; + bbp |= (info->default_power3 & 0xe0) >> 1; + rt2800_bbp_write(rt2x00dev, 110, bbp); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 57); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 57, 0x6e); + else + rt2800_rfcsr_write(rt2x00dev, 57, 0x3e); + + /* Enable RF tuning */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + + udelay(2000); + + bbp = rt2800_bbp_read(rt2x00dev, 49); + /* clear update flag */ + rt2800_bbp_write(rt2x00dev, 49, bbp & 0xfe); + rt2800_bbp_write(rt2x00dev, 49, bbp); + + /* TODO: add calibration for TxBF */ +} + +#define POWER_BOUND 0x27 +#define POWER_BOUND_5G 0x2b + +static void rt2800_config_channel_rf3290(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + u8 rfcsr; + + rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1); + rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3); + rfcsr = rt2800_rfcsr_read(rt2x00dev, 11); + rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf2); + rt2800_rfcsr_write(rt2x00dev, 11, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 49); + if (info->default_power1 > POWER_BOUND) + rt2x00_set_field8(&rfcsr, RFCSR49_TX, POWER_BOUND); + else + rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1); + rt2800_rfcsr_write(rt2x00dev, 49, rfcsr); + + rt2800_freq_cal_mode1(rt2x00dev); + + if (rf->channel <= 14) { + if (rf->channel == 6) + rt2800_bbp_write(rt2x00dev, 68, 0x0c); + else + rt2800_bbp_write(rt2x00dev, 68, 0x0b); + + if (rf->channel >= 1 && rf->channel <= 6) + rt2800_bbp_write(rt2x00dev, 59, 0x0f); + else if (rf->channel >= 7 && rf->channel <= 11) + rt2800_bbp_write(rt2x00dev, 59, 0x0e); + else if (rf->channel >= 12 && rf->channel <= 14) + rt2800_bbp_write(rt2x00dev, 59, 0x0d); + } +} + +static void rt2800_config_channel_rf3322(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + u8 rfcsr; + + rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1); + rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3); + + rt2800_rfcsr_write(rt2x00dev, 11, 0x42); + rt2800_rfcsr_write(rt2x00dev, 12, 0x1c); + rt2800_rfcsr_write(rt2x00dev, 13, 0x00); + + if (info->default_power1 > POWER_BOUND) + rt2800_rfcsr_write(rt2x00dev, 47, POWER_BOUND); + else + rt2800_rfcsr_write(rt2x00dev, 47, info->default_power1); + + if (info->default_power2 > POWER_BOUND) + rt2800_rfcsr_write(rt2x00dev, 48, POWER_BOUND); + else + rt2800_rfcsr_write(rt2x00dev, 48, info->default_power2); + + rt2800_freq_cal_mode1(rt2x00dev); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1); + + if ( rt2x00dev->default_ant.tx_chain_num == 2 ) + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); + else + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0); + + if ( rt2x00dev->default_ant.rx_chain_num == 2 ) + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); + else + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); + + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); + + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rt2800_rfcsr_write(rt2x00dev, 31, 80); +} + +static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + u8 rfcsr; + int idx = rf->channel-1; + + rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1); + rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3); + rfcsr = rt2800_rfcsr_read(rt2x00dev, 11); + rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf2); + rt2800_rfcsr_write(rt2x00dev, 11, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 49); + if (info->default_power1 > POWER_BOUND) + rt2x00_set_field8(&rfcsr, RFCSR49_TX, POWER_BOUND); + else + rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1); + rt2800_rfcsr_write(rt2x00dev, 49, rfcsr); + + if (rt2x00_rt(rt2x00dev, RT5392)) { + rfcsr = rt2800_rfcsr_read(rt2x00dev, 50); + if (info->default_power2 > POWER_BOUND) + rt2x00_set_field8(&rfcsr, RFCSR50_TX, POWER_BOUND); + else + rt2x00_set_field8(&rfcsr, RFCSR50_TX, + info->default_power2); + rt2800_rfcsr_write(rt2x00dev, 50, rfcsr); + } + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + if (rt2x00_rt(rt2x00dev, RT5392)) { + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); + } + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rt2800_freq_cal_mode1(rt2x00dev); + + if (rt2x00_has_cap_bt_coexist(rt2x00dev)) { + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) { + /* r55/r59 value array of channel 1~14 */ + static const char r55_bt_rev[] = {0x83, 0x83, + 0x83, 0x73, 0x73, 0x63, 0x53, 0x53, + 0x53, 0x43, 0x43, 0x43, 0x43, 0x43}; + static const char r59_bt_rev[] = {0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07}; + + rt2800_rfcsr_write(rt2x00dev, 55, + r55_bt_rev[idx]); + rt2800_rfcsr_write(rt2x00dev, 59, + r59_bt_rev[idx]); + } else { + static const char r59_bt[] = {0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89, + 0x88, 0x88, 0x86, 0x85, 0x84}; + + rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]); + } + } else { + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) { + static const char r55_nonbt_rev[] = {0x23, 0x23, + 0x23, 0x23, 0x13, 0x13, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03}; + static const char r59_nonbt_rev[] = {0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x05, 0x04, 0x04}; + + rt2800_rfcsr_write(rt2x00dev, 55, + r55_nonbt_rev[idx]); + rt2800_rfcsr_write(rt2x00dev, 59, + r59_nonbt_rev[idx]); + } else if (rt2x00_rt(rt2x00dev, RT5390) || + rt2x00_rt(rt2x00dev, RT5392) || + rt2x00_rt(rt2x00dev, RT6352)) { + static const char r59_non_bt[] = {0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d, + 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86}; + + rt2800_rfcsr_write(rt2x00dev, 59, + r59_non_bt[idx]); + } else if (rt2x00_rt(rt2x00dev, RT5350)) { + static const char r59_non_bt[] = {0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, + 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06}; + + rt2800_rfcsr_write(rt2x00dev, 59, + r59_non_bt[idx]); + } + } +} + +static void rt2800_config_channel_rf55xx(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + u8 rfcsr, ep_reg; + u32 reg; + int power_bound; + + rt2x00_info(rt2x00dev, "channel_rf55xx config channel %u\n", rf->channel); + + /* TODO */ + const bool is_11b = false; + const bool is_type_ep = false; + + reg = rt2800_register_read(rt2x00dev, LDO_CFG0); + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, + (rf->channel > 14 || conf_is_ht40(conf)) ? 5 : 0); + rt2800_register_write(rt2x00dev, LDO_CFG0, reg); + + /* Order of values on rf_channel entry: N, K, mod, R */ + rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1 & 0xff); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 9); + rt2x00_set_field8(&rfcsr, RFCSR9_K, rf->rf2 & 0xf); + rt2x00_set_field8(&rfcsr, RFCSR9_N, (rf->rf1 & 0x100) >> 8); + rt2x00_set_field8(&rfcsr, RFCSR9_MOD, ((rf->rf3 - 8) & 0x4) >> 2); + rt2800_rfcsr_write(rt2x00dev, 9, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 11); + rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf4 - 1); + rt2x00_set_field8(&rfcsr, RFCSR11_MOD, (rf->rf3 - 8) & 0x3); + rt2800_rfcsr_write(rt2x00dev, 11, rfcsr); + + if (rf->channel <= 14) { + rt2800_rfcsr_write(rt2x00dev, 10, 0x90); + /* FIXME: RF11 owerwrite ? */ + rt2800_rfcsr_write(rt2x00dev, 11, 0x4A); + rt2800_rfcsr_write(rt2x00dev, 12, 0x52); + rt2800_rfcsr_write(rt2x00dev, 13, 0x42); + rt2800_rfcsr_write(rt2x00dev, 22, 0x40); + rt2800_rfcsr_write(rt2x00dev, 24, 0x4A); + rt2800_rfcsr_write(rt2x00dev, 25, 0x80); + rt2800_rfcsr_write(rt2x00dev, 27, 0x42); + rt2800_rfcsr_write(rt2x00dev, 36, 0x80); + rt2800_rfcsr_write(rt2x00dev, 37, 0x08); + rt2800_rfcsr_write(rt2x00dev, 38, 0x89); + rt2800_rfcsr_write(rt2x00dev, 39, 0x1B); + rt2800_rfcsr_write(rt2x00dev, 40, 0x0D); + rt2800_rfcsr_write(rt2x00dev, 41, 0x9B); + rt2800_rfcsr_write(rt2x00dev, 42, 0xD5); + rt2800_rfcsr_write(rt2x00dev, 43, 0x72); + rt2800_rfcsr_write(rt2x00dev, 44, 0x0E); + rt2800_rfcsr_write(rt2x00dev, 45, 0xA2); + rt2800_rfcsr_write(rt2x00dev, 46, 0x6B); + rt2800_rfcsr_write(rt2x00dev, 48, 0x10); + rt2800_rfcsr_write(rt2x00dev, 51, 0x3E); + rt2800_rfcsr_write(rt2x00dev, 52, 0x48); + rt2800_rfcsr_write(rt2x00dev, 54, 0x38); + rt2800_rfcsr_write(rt2x00dev, 56, 0xA1); + rt2800_rfcsr_write(rt2x00dev, 57, 0x00); + rt2800_rfcsr_write(rt2x00dev, 58, 0x39); + rt2800_rfcsr_write(rt2x00dev, 60, 0x45); + rt2800_rfcsr_write(rt2x00dev, 61, 0x91); + rt2800_rfcsr_write(rt2x00dev, 62, 0x39); + + /* TODO RF27 <- tssi */ + + rfcsr = rf->channel <= 10 ? 0x07 : 0x06; + rt2800_rfcsr_write(rt2x00dev, 23, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 59, rfcsr); + + if (is_11b) { + /* CCK */ + rt2800_rfcsr_write(rt2x00dev, 31, 0xF8); + rt2800_rfcsr_write(rt2x00dev, 32, 0xC0); + if (is_type_ep) + rt2800_rfcsr_write(rt2x00dev, 55, 0x06); + else + rt2800_rfcsr_write(rt2x00dev, 55, 0x47); + } else { + /* OFDM */ + if (is_type_ep) + rt2800_rfcsr_write(rt2x00dev, 55, 0x03); + else + rt2800_rfcsr_write(rt2x00dev, 55, 0x43); + } + + power_bound = POWER_BOUND; + ep_reg = 0x2; + } else { + rt2800_rfcsr_write(rt2x00dev, 10, 0x97); + /* FIMXE: RF11 overwrite */ + rt2800_rfcsr_write(rt2x00dev, 11, 0x40); + rt2800_rfcsr_write(rt2x00dev, 25, 0xBF); + rt2800_rfcsr_write(rt2x00dev, 27, 0x42); + rt2800_rfcsr_write(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write(rt2x00dev, 37, 0x04); + rt2800_rfcsr_write(rt2x00dev, 38, 0x85); + rt2800_rfcsr_write(rt2x00dev, 40, 0x42); + rt2800_rfcsr_write(rt2x00dev, 41, 0xBB); + rt2800_rfcsr_write(rt2x00dev, 42, 0xD7); + rt2800_rfcsr_write(rt2x00dev, 45, 0x41); + rt2800_rfcsr_write(rt2x00dev, 48, 0x00); + rt2800_rfcsr_write(rt2x00dev, 57, 0x77); + rt2800_rfcsr_write(rt2x00dev, 60, 0x05); + rt2800_rfcsr_write(rt2x00dev, 61, 0x01); + + /* TODO RF27 <- tssi */ + + if (rf->channel >= 36 && rf->channel <= 64) { + + rt2800_rfcsr_write(rt2x00dev, 12, 0x2E); + rt2800_rfcsr_write(rt2x00dev, 13, 0x22); + rt2800_rfcsr_write(rt2x00dev, 22, 0x60); + rt2800_rfcsr_write(rt2x00dev, 23, 0x7F); + if (rf->channel <= 50) + rt2800_rfcsr_write(rt2x00dev, 24, 0x09); + else if (rf->channel >= 52) + rt2800_rfcsr_write(rt2x00dev, 24, 0x07); + rt2800_rfcsr_write(rt2x00dev, 39, 0x1C); + rt2800_rfcsr_write(rt2x00dev, 43, 0x5B); + rt2800_rfcsr_write(rt2x00dev, 44, 0X40); + rt2800_rfcsr_write(rt2x00dev, 46, 0X00); + rt2800_rfcsr_write(rt2x00dev, 51, 0xFE); + rt2800_rfcsr_write(rt2x00dev, 52, 0x0C); + rt2800_rfcsr_write(rt2x00dev, 54, 0xF8); + if (rf->channel <= 50) { + rt2800_rfcsr_write(rt2x00dev, 55, 0x06), + rt2800_rfcsr_write(rt2x00dev, 56, 0xD3); + } else if (rf->channel >= 52) { + rt2800_rfcsr_write(rt2x00dev, 55, 0x04); + rt2800_rfcsr_write(rt2x00dev, 56, 0xBB); + } + + rt2800_rfcsr_write(rt2x00dev, 58, 0x15); + rt2800_rfcsr_write(rt2x00dev, 59, 0x7F); + rt2800_rfcsr_write(rt2x00dev, 62, 0x15); + + } else if (rf->channel >= 100 && rf->channel <= 165) { + + rt2800_rfcsr_write(rt2x00dev, 12, 0x0E); + rt2800_rfcsr_write(rt2x00dev, 13, 0x42); + rt2800_rfcsr_write(rt2x00dev, 22, 0x40); + if (rf->channel <= 153) { + rt2800_rfcsr_write(rt2x00dev, 23, 0x3C); + rt2800_rfcsr_write(rt2x00dev, 24, 0x06); + } else if (rf->channel >= 155) { + rt2800_rfcsr_write(rt2x00dev, 23, 0x38); + rt2800_rfcsr_write(rt2x00dev, 24, 0x05); + } + if (rf->channel <= 138) { + rt2800_rfcsr_write(rt2x00dev, 39, 0x1A); + rt2800_rfcsr_write(rt2x00dev, 43, 0x3B); + rt2800_rfcsr_write(rt2x00dev, 44, 0x20); + rt2800_rfcsr_write(rt2x00dev, 46, 0x18); + } else if (rf->channel >= 140) { + rt2800_rfcsr_write(rt2x00dev, 39, 0x18); + rt2800_rfcsr_write(rt2x00dev, 43, 0x1B); + rt2800_rfcsr_write(rt2x00dev, 44, 0x10); + rt2800_rfcsr_write(rt2x00dev, 46, 0X08); + } + if (rf->channel <= 124) + rt2800_rfcsr_write(rt2x00dev, 51, 0xFC); + else if (rf->channel >= 126) + rt2800_rfcsr_write(rt2x00dev, 51, 0xEC); + if (rf->channel <= 138) + rt2800_rfcsr_write(rt2x00dev, 52, 0x06); + else if (rf->channel >= 140) + rt2800_rfcsr_write(rt2x00dev, 52, 0x06); + rt2800_rfcsr_write(rt2x00dev, 54, 0xEB); + if (rf->channel <= 138) + rt2800_rfcsr_write(rt2x00dev, 55, 0x01); + else if (rf->channel >= 140) + rt2800_rfcsr_write(rt2x00dev, 55, 0x00); + if (rf->channel <= 128) + rt2800_rfcsr_write(rt2x00dev, 56, 0xBB); + else if (rf->channel >= 130) + rt2800_rfcsr_write(rt2x00dev, 56, 0xAB); + if (rf->channel <= 116) + rt2800_rfcsr_write(rt2x00dev, 58, 0x1D); + else if (rf->channel >= 118) + rt2800_rfcsr_write(rt2x00dev, 58, 0x15); + if (rf->channel <= 138) + rt2800_rfcsr_write(rt2x00dev, 59, 0x3F); + else if (rf->channel >= 140) + rt2800_rfcsr_write(rt2x00dev, 59, 0x7C); + if (rf->channel <= 116) + rt2800_rfcsr_write(rt2x00dev, 62, 0x1D); + else if (rf->channel >= 118) + rt2800_rfcsr_write(rt2x00dev, 62, 0x15); + } + + power_bound = POWER_BOUND_5G; + ep_reg = 0x3; + } + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 49); + if (info->default_power1 > power_bound) + rt2x00_set_field8(&rfcsr, RFCSR49_TX, power_bound); + else + rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1); + if (is_type_ep) + rt2x00_set_field8(&rfcsr, RFCSR49_EP, ep_reg); + rt2800_rfcsr_write(rt2x00dev, 49, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 50); + if (info->default_power2 > power_bound) + rt2x00_set_field8(&rfcsr, RFCSR50_TX, power_bound); + else + rt2x00_set_field8(&rfcsr, RFCSR50_TX, info->default_power2); + if (is_type_ep) + rt2x00_set_field8(&rfcsr, RFCSR50_EP, ep_reg); + rt2800_rfcsr_write(rt2x00dev, 50, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1); + + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, + rt2x00dev->default_ant.tx_chain_num >= 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, + rt2x00dev->default_ant.tx_chain_num == 2); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); + + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, + rt2x00dev->default_ant.rx_chain_num >= 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, + rt2x00dev->default_ant.rx_chain_num == 2); + rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); + + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 6, 0xe4); + + if (conf_is_ht40(conf)) + rt2800_rfcsr_write(rt2x00dev, 30, 0x16); + else + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + + if (!is_11b) { + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x80); + } + + /* TODO proper frequency adjustment */ + rt2800_freq_cal_mode1(rt2x00dev); + + /* TODO merge with others */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + + /* BBP settings */ + rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); + + rt2800_bbp_write(rt2x00dev, 79, (rf->channel <= 14) ? 0x1C : 0x18); + rt2800_bbp_write(rt2x00dev, 80, (rf->channel <= 14) ? 0x0E : 0x08); + rt2800_bbp_write(rt2x00dev, 81, (rf->channel <= 14) ? 0x3A : 0x38); + rt2800_bbp_write(rt2x00dev, 82, (rf->channel <= 14) ? 0x62 : 0x92); + + /* GLRT band configuration */ + rt2800_bbp_write(rt2x00dev, 195, 128); + rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0xE0 : 0xF0); + rt2800_bbp_write(rt2x00dev, 195, 129); + rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x1F : 0x1E); + rt2800_bbp_write(rt2x00dev, 195, 130); + rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x38 : 0x28); + rt2800_bbp_write(rt2x00dev, 195, 131); + rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x32 : 0x20); + rt2800_bbp_write(rt2x00dev, 195, 133); + rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x28 : 0x7F); + rt2800_bbp_write(rt2x00dev, 195, 124); + rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F); +} + +static void rt2800_config_channel_rf7620(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; + u8 rx_agc_fc, tx_agc_fc; + u8 rfcsr; + + /* Frequeny plan setting */ + /* Rdiv setting (set 0x03 if Xtal==20) + * R13[1:0] + */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 13); + rt2x00_set_field8(&rfcsr, RFCSR13_RDIV_MT7620, + rt2800_clk_is_20mhz(rt2x00dev) ? 3 : 0); + rt2800_rfcsr_write(rt2x00dev, 13, rfcsr); + + /* N setting + * R20[7:0] in rf->rf1 + * R21[0] always 0 + */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 20); + rfcsr = (rf->rf1 & 0x00ff); + rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); + rt2x00_set_field8(&rfcsr, RFCSR21_BIT1, 0); + rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); + + /* K setting (always 0) + * R16[3:0] (RF PLL freq selection) + */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); + rt2x00_set_field8(&rfcsr, RFCSR16_RF_PLL_FREQ_SEL_MT7620, 0); + rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); + + /* D setting (always 0) + * R22[2:0] (D=15, R22[2:0]=<111>) + */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 22); + rt2x00_set_field8(&rfcsr, RFCSR22_FREQPLAN_D_MT7620, 0); + rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); + + /* Ksd setting + * Ksd: R17<7:0> in rf->rf2 + * R18<7:0> in rf->rf3 + * R19<1:0> in rf->rf4 + */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 17); + rfcsr = rf->rf2; + rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 18); + rfcsr = rf->rf3; + rt2800_rfcsr_write(rt2x00dev, 18, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 19); + rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4); + rt2800_rfcsr_write(rt2x00dev, 19, rfcsr); + + /* Default: XO=20MHz , SDM mode */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); + rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); + rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); + rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); + rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620, + rt2x00dev->default_ant.tx_chain_num != 1); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 2); + rt2x00_set_field8(&rfcsr, RFCSR2_TX2_EN_MT7620, + rt2x00dev->default_ant.tx_chain_num != 1); + rt2x00_set_field8(&rfcsr, RFCSR2_RX2_EN_MT7620, + rt2x00dev->default_ant.rx_chain_num != 1); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 42); + rt2x00_set_field8(&rfcsr, RFCSR42_TX2_EN_MT7620, + rt2x00dev->default_ant.tx_chain_num != 1); + rt2800_rfcsr_write(rt2x00dev, 42, rfcsr); + + /* RF for DC Cal BW */ + if (conf_is_ht40(conf)) { + rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10); + rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10); + rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04); + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10); + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10); + } else { + rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x20); + rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x20); + rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x20); + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20); + } + + if (conf_is_ht40(conf)) { + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x08); + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x08); + } else { + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x28); + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x28); + } + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 28); + rt2x00_set_field8(&rfcsr, RFCSR28_CH11_HT40, + conf_is_ht40(conf) && (rf->channel == 11)); + rt2800_rfcsr_write(rt2x00dev, 28, rfcsr); + + if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) { + if (conf_is_ht40(conf)) { + rx_agc_fc = drv_data->rx_calibration_bw40; + tx_agc_fc = drv_data->tx_calibration_bw40; + } else { + rx_agc_fc = drv_data->rx_calibration_bw20; + tx_agc_fc = drv_data->tx_calibration_bw20; + } + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6); + rfcsr &= (~0x3F); + rfcsr |= rx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rfcsr); + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7); + rfcsr &= (~0x3F); + rfcsr |= rx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rfcsr); + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 6); + rfcsr &= (~0x3F); + rfcsr |= rx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 7, 6, rfcsr); + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 7); + rfcsr &= (~0x3F); + rfcsr |= rx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 7, 7, rfcsr); + + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58); + rfcsr &= (~0x3F); + rfcsr |= tx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rfcsr); + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59); + rfcsr &= (~0x3F); + rfcsr |= tx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rfcsr); + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 58); + rfcsr &= (~0x3F); + rfcsr |= tx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 7, 58, rfcsr); + rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 59); + rfcsr &= (~0x3F); + rfcsr |= tx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr); + } +} + +#if 0 +static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev, + struct ieee80211_channel *chan, + int power_level) { + u16 eeprom, target_power, max_power; + u32 mac_sys_ctrl, mac_status; + u32 reg; + u8 bbp; + int i; + + /* hardware unit is 0.5dBm, limited to 23.5dBm */ + power_level *= 2; + if (power_level > 0x2f) + power_level = 0x2f; + + max_power = chan->max_power * 2; + if (max_power > 0x2f) + max_power = 0x2f; + + reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_0); + rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, power_level); + rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, power_level); + rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_0, max_power); + rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_1, max_power); + + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_INTERNAL_TX_ALC)) { + /* init base power by eeprom target power */ + target_power = rt2800_eeprom_read(rt2x00dev, + EEPROM_TXPOWER_INIT); + rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, target_power); + rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, target_power); + } + rt2800_register_write(rt2x00dev, TX_ALC_CFG_0, reg); + + reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1); + rt2x00_set_field32(®, TX_ALC_CFG_1_TX_TEMP_COMP, 0); + rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg); + + /* Save MAC SYS CTRL registers */ + mac_sys_ctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); + /* Disable Tx/Rx */ + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0); + /* Check MAC Tx/Rx idle */ + for (i = 0; i < 10000; i++) { + mac_status = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG); + if (mac_status & 0x3) + usleep_range(50, 200); + else + break; + } + + if (i == 10000) + rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n"); + + if (chan->center_freq > 2457) { + bbp = rt2800_bbp_read(rt2x00dev, 30); + bbp = 0x40; + rt2800_bbp_write(rt2x00dev, 30, bbp); + rt2800_rfcsr_write(rt2x00dev, 39, 0); + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) + rt2800_rfcsr_write(rt2x00dev, 42, 0xfb); + else + rt2800_rfcsr_write(rt2x00dev, 42, 0x7b); + } else { + bbp = rt2800_bbp_read(rt2x00dev, 30); + bbp = 0x1f; + rt2800_bbp_write(rt2x00dev, 30, bbp); + rt2800_rfcsr_write(rt2x00dev, 39, 0x80); + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) + rt2800_rfcsr_write(rt2x00dev, 42, 0xdb); + else + rt2800_rfcsr_write(rt2x00dev, 42, 0x5b); + } + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl); + + rt2800_vco_calibration(rt2x00dev); +} +#endif + +/* + * Link tuning + */ +void rt2800_link_stats(struct rt2x00_dev *rt2x00dev, struct link_qual *qual) +{ + u32 reg; + + /* + * Update FCS error count from register. + */ + reg = rt2800_register_read(rt2x00dev, RX_STA_CNT0); + qual->rx_failed = rt2x00_get_field32(reg, RX_STA_CNT0_CRC_ERR); +} +EXPORT_SYMBOL_GPL(rt2800_link_stats); + +static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev) +{ + u8 vgc; + + if (rt2x00dev->curr_band == NL80211_BAND_2GHZ) { + if (rt2x00_rt(rt2x00dev, RT3070) || + rt2x00_rt(rt2x00dev, RT3071) || + rt2x00_rt(rt2x00dev, RT3090) || + rt2x00_rt(rt2x00dev, RT3290) || + rt2x00_rt(rt2x00dev, RT3390) || + rt2x00_rt(rt2x00dev, RT3572) || + rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT5390) || + rt2x00_rt(rt2x00dev, RT5392) || + rt2x00_rt(rt2x00dev, RT5592) || + rt2x00_rt(rt2x00dev, RT6352)) + vgc = 0x1c + (2 * rt2x00dev->lna_gain); + else + vgc = 0x2e + rt2x00dev->lna_gain; + } else { /* 5GHZ band */ + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) + vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3; + else if (rt2x00_rt(rt2x00dev, RT5592)) + vgc = 0x24 + (2 * rt2x00dev->lna_gain); + else { + if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) + vgc = 0x32 + (rt2x00dev->lna_gain * 5) / 3; + else + vgc = 0x3a + (rt2x00dev->lna_gain * 5) / 3; + } + } + + return vgc; +} + +static inline void rt2800_set_vgc(struct rt2x00_dev *rt2x00dev, + struct link_qual *qual, u8 vgc_level) +{ + if (qual->vgc_level != vgc_level) { + if (rt2x00_rt(rt2x00dev, RT3572) || + rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, + vgc_level); + } else if (rt2x00_rt(rt2x00dev, RT5592)) { + rt2800_bbp_write(rt2x00dev, 83, qual->rssi > -65 ? 0x4a : 0x7a); + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, vgc_level); + } else { + rt2800_bbp_write(rt2x00dev, 66, vgc_level); + } + + qual->vgc_level = vgc_level; + qual->vgc_level_reg = vgc_level; + } +} + +void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual) +{ + rt2800_set_vgc(rt2x00dev, qual, rt2800_get_default_vgc(rt2x00dev)); +} +EXPORT_SYMBOL_GPL(rt2800_reset_tuner); + +void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual, + const u32 count) +{ + u8 vgc; + + if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) + return; + + /* When RSSI is better than a certain threshold, increase VGC + * with a chip specific value in order to improve the balance + * between sensibility and noise isolation. + */ + + vgc = rt2800_get_default_vgc(rt2x00dev); + + switch (rt2x00dev->chip.rt) { + case RT3572: + case RT3593: + if (qual->rssi > -65) { + if (rt2x00dev->curr_band == NL80211_BAND_2GHZ) + vgc += 0x20; + else + vgc += 0x10; + } + break; + + case RT3883: + if (qual->rssi > -65) + vgc += 0x10; + break; + + case RT5592: + if (qual->rssi > -65) + vgc += 0x20; + break; + + default: + if (qual->rssi > -80) + vgc += 0x10; + break; + } + + rt2800_set_vgc(rt2x00dev, qual, vgc); +} +EXPORT_SYMBOL_GPL(rt2800_link_tuner); + +/* + * Initialization functions. + */ +int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) { + struct rt2800_drv_data *drv_data = (struct rt2800_drv_data *) rt2x00dev->drv_data; + u32 reg; + u16 eeprom; + unsigned int i; + int ret; + + rt2800_disable_wpdma(rt2x00dev); + + ret = rt2800_drv_init_registers(rt2x00dev); + if (ret) + return ret; + + rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f); + rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003); + + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); + + reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG); + rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_INTERVAL, 1600); + rt2x00_set_field32(®, BCN_TIME_CFG_TSF_TICKING, 0); + rt2x00_set_field32(®, BCN_TIME_CFG_TSF_SYNC, 0); + rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 0); + rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_GEN, 0); + rt2x00_set_field32(®, BCN_TIME_CFG_TX_TIME_COMPENSATE, 0); + rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); + + /* rt2800_config_filter(rt2x00dev, FIF_ALLMULTI); */ + /* All flags except FIF_FCSFAIL and FIF_PLCPFAIL */ + rt2800_config_filter(rt2x00dev, + FIF_ALLMULTI | FIF_FCSFAIL | FIF_CONTROL | FIF_PSPOLL | FIF_OTHER_BSS); + + reg = rt2800_register_read(rt2x00dev, BKOFF_SLOT_CFG); + rt2x00_set_field32(®, BKOFF_SLOT_CFG_SLOT_TIME, 9); + rt2x00_set_field32(®, BKOFF_SLOT_CFG_CC_DELAY_TIME, 2); + rt2800_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg); + + if (rt2x00_rt(rt2x00dev, RT3290)) { + reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL); + if (rt2x00_get_field32(reg, WLAN_EN) == 1) { + rt2x00_set_field32(®, PCIE_APP0_CLK_REQ, 1); + rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg); + } + + reg = rt2800_register_read(rt2x00dev, CMB_CTRL); + if (!(rt2x00_get_field32(reg, LDO0_EN) == 1)) { + rt2x00_set_field32(®, LDO0_EN, 1); + rt2x00_set_field32(®, LDO_BGSEL, 3); + rt2800_register_write(rt2x00dev, CMB_CTRL, reg); + } + + reg = rt2800_register_read(rt2x00dev, OSC_CTRL); + rt2x00_set_field32(®, OSC_ROSC_EN, 1); + rt2x00_set_field32(®, OSC_CAL_REQ, 1); + rt2x00_set_field32(®, OSC_REF_CYCLE, 0x27); + rt2800_register_write(rt2x00dev, OSC_CTRL, reg); + + reg = rt2800_register_read(rt2x00dev, COEX_CFG0); + rt2x00_set_field32(®, COEX_CFG_ANT, 0x5e); + rt2800_register_write(rt2x00dev, COEX_CFG0, reg); + + reg = rt2800_register_read(rt2x00dev, COEX_CFG2); + rt2x00_set_field32(®, BT_COEX_CFG1, 0x00); + rt2x00_set_field32(®, BT_COEX_CFG0, 0x17); + rt2x00_set_field32(®, WL_COEX_CFG1, 0x93); + rt2x00_set_field32(®, WL_COEX_CFG0, 0x7f); + rt2800_register_write(rt2x00dev, COEX_CFG2, reg); + + reg = rt2800_register_read(rt2x00dev, PLL_CTRL); + rt2x00_set_field32(®, PLL_CONTROL, 1); + rt2800_register_write(rt2x00dev, PLL_CTRL, reg); + } + + if (rt2x00_rt(rt2x00dev, RT3071) || + rt2x00_rt(rt2x00dev, RT3090) || + rt2x00_rt(rt2x00dev, RT3290) || + rt2x00_rt(rt2x00dev, RT3390)) { + + if (rt2x00_rt(rt2x00dev, RT3290)) + rt2800_register_write(rt2x00dev, TX_SW_CFG0, + 0x00000404); + else + rt2800_register_write(rt2x00dev, TX_SW_CFG0, + 0x00000400); + + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); + if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) || + rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E) || + rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST)) + rt2800_register_write(rt2x00dev, TX_SW_CFG2, + 0x0000002c); + else + rt2800_register_write(rt2x00dev, TX_SW_CFG2, + 0x0000000f); + } else { + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + } + } else if (rt2x00_rt(rt2x00dev, RT3070)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400); + + if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x0000002c); + } else { + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + } + } else if (rt2800_is_305x_soc(rt2x00dev)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030); + } else if (rt2x00_rt(rt2x00dev, RT3352)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + } else if (rt2x00_rt(rt2x00dev, RT3572)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); + } else if (rt2x00_rt(rt2x00dev, RT3593)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); + if (rt2x00_rt_rev_lt(rt2x00dev, RT3593, REV_RT3593E)) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + if (rt2x00_get_field16(eeprom, + EEPROM_NIC_CONF1_DAC_TEST)) + rt2800_register_write(rt2x00dev, TX_SW_CFG2, + 0x0000001f); + else + rt2800_register_write(rt2x00dev, TX_SW_CFG2, + 0x0000000f); + } else { + rt2800_register_write(rt2x00dev, TX_SW_CFG2, + 0x00000000); + } + } else if (rt2x00_rt(rt2x00dev, RT3883)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00040000); + rt2800_register_write(rt2x00dev, TX_TXBF_CFG_0, 0x8000fc21); + rt2800_register_write(rt2x00dev, TX_TXBF_CFG_3, 0x00009c40); + } else if (rt2x00_rt(rt2x00dev, RT5390) || + rt2x00_rt(rt2x00dev, RT5392) || + rt2x00_rt(rt2x00dev, RT6352)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + } else if (rt2x00_rt(rt2x00dev, RT5592)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + } else if (rt2x00_rt(rt2x00dev, RT5350)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); + } else if (rt2x00_rt(rt2x00dev, RT6352)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002); + rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F); + rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000); + rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0); + rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0); + rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C); + rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C); + rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, + 0x3630363A); + rt2800_register_write(rt2x00dev, TX1_RF_GAIN_CORRECT, + 0x3630363A); + reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1); + rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0); + rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg); + } else { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); + } + + reg = rt2800_register_read(rt2x00dev, TX_LINK_CFG); + rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_MFB_LIFETIME, 32); + rt2x00_set_field32(®, TX_LINK_CFG_MFB_ENABLE, 0); + rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_UMFS_ENABLE, 0); + rt2x00_set_field32(®, TX_LINK_CFG_TX_MRQ_EN, 0); + rt2x00_set_field32(®, TX_LINK_CFG_TX_RDG_EN, 0); + rt2x00_set_field32(®, TX_LINK_CFG_TX_CF_ACK_EN, 1); + rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_MFB, 0); + rt2x00_set_field32(®, TX_LINK_CFG_REMOTE_MFS, 0); + rt2800_register_write(rt2x00dev, TX_LINK_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, TX_TIMEOUT_CFG); + rt2x00_set_field32(®, TX_TIMEOUT_CFG_MPDU_LIFETIME, 9); + rt2x00_set_field32(®, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT, 32); + rt2x00_set_field32(®, TX_TIMEOUT_CFG_TX_OP_TIMEOUT, 10); + rt2800_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, MAX_LEN_CFG); + rt2x00_set_field32(®, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE); + if (rt2x00_is_usb(rt2x00dev)) { + drv_data->max_psdu = 3; + } else if (rt2x00_rt_rev_gte(rt2x00dev, RT2872, REV_RT2872E) || + rt2x00_rt(rt2x00dev, RT2883) || + rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070E)) { + drv_data->max_psdu = 2; + } else { + drv_data->max_psdu = 1; + } + rt2x00_set_field32(®, MAX_LEN_CFG_MAX_PSDU, drv_data->max_psdu); + rt2x00_set_field32(®, MAX_LEN_CFG_MIN_PSDU, 10); + rt2x00_set_field32(®, MAX_LEN_CFG_MIN_MPDU, 10); + rt2800_register_write(rt2x00dev, MAX_LEN_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, LED_CFG); + rt2x00_set_field32(®, LED_CFG_ON_PERIOD, 70); + rt2x00_set_field32(®, LED_CFG_OFF_PERIOD, 30); + rt2x00_set_field32(®, LED_CFG_SLOW_BLINK_PERIOD, 3); + rt2x00_set_field32(®, LED_CFG_R_LED_MODE, 3); + rt2x00_set_field32(®, LED_CFG_G_LED_MODE, 3); + rt2x00_set_field32(®, LED_CFG_Y_LED_MODE, 3); + rt2x00_set_field32(®, LED_CFG_LED_POLAR, 1); + rt2800_register_write(rt2x00dev, LED_CFG, reg); + + rt2800_register_write(rt2x00dev, PBF_MAX_PCNT, 0x1f3fbf9f); + + reg = rt2800_register_read(rt2x00dev, TX_RTY_CFG); + rt2x00_set_field32(®, TX_RTY_CFG_SHORT_RTY_LIMIT, 2); + rt2x00_set_field32(®, TX_RTY_CFG_LONG_RTY_LIMIT, 2); + rt2x00_set_field32(®, TX_RTY_CFG_LONG_RTY_THRE, 2000); + rt2x00_set_field32(®, TX_RTY_CFG_NON_AGG_RTY_MODE, 0); + rt2x00_set_field32(®, TX_RTY_CFG_AGG_RTY_MODE, 0); + rt2x00_set_field32(®, TX_RTY_CFG_TX_AUTO_FB_ENABLE, 1); + rt2800_register_write(rt2x00dev, TX_RTY_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, AUTO_RSP_CFG); + rt2x00_set_field32(®, AUTO_RSP_CFG_AUTORESPONDER, 1); + rt2x00_set_field32(®, AUTO_RSP_CFG_BAC_ACK_POLICY, 1); + rt2x00_set_field32(®, AUTO_RSP_CFG_CTS_40_MMODE, 1); + rt2x00_set_field32(®, AUTO_RSP_CFG_CTS_40_MREF, 0); + rt2x00_set_field32(®, AUTO_RSP_CFG_AR_PREAMBLE, 0); + rt2x00_set_field32(®, AUTO_RSP_CFG_DUAL_CTS_EN, 0); + rt2x00_set_field32(®, AUTO_RSP_CFG_ACK_CTS_PSM_BIT, 0); + rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, CCK_PROT_CFG); + rt2x00_set_field32(®, CCK_PROT_CFG_PROTECT_RATE, 3); + rt2x00_set_field32(®, CCK_PROT_CFG_PROTECT_CTRL, 0); + rt2x00_set_field32(®, CCK_PROT_CFG_PROTECT_NAV_SHORT, 1); + rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_CCK, 1); + rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_OFDM, 1); + rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_MM20, 1); + rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_MM40, 0); + rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_GF20, 1); + rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_GF40, 0); + rt2x00_set_field32(®, CCK_PROT_CFG_RTS_TH_EN, 1); + rt2800_register_write(rt2x00dev, CCK_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, OFDM_PROT_CFG); + rt2x00_set_field32(®, OFDM_PROT_CFG_PROTECT_RATE, 3); + rt2x00_set_field32(®, OFDM_PROT_CFG_PROTECT_CTRL, 0); + rt2x00_set_field32(®, OFDM_PROT_CFG_PROTECT_NAV_SHORT, 1); + rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_CCK, 1); + rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_OFDM, 1); + rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_MM20, 1); + rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_MM40, 0); + rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_GF20, 1); + rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_GF40, 0); + rt2x00_set_field32(®, OFDM_PROT_CFG_RTS_TH_EN, 1); + rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, MM20_PROT_CFG); + rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_RATE, 0x4004); + rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_CTRL, 1); + rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_NAV_SHORT, 1); + rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_CCK, 0); + rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_OFDM, 1); + rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_MM20, 1); + rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_MM40, 0); + rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_GF20, 1); + rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_GF40, 0); + rt2x00_set_field32(®, MM20_PROT_CFG_RTS_TH_EN, 0); + rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, MM40_PROT_CFG); + rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_RATE, 0x4084); + rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_CTRL, 1); + rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_NAV_SHORT, 1); + rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_CCK, 0); + rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_OFDM, 1); + rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_MM20, 1); + rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_MM40, 1); + rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_GF20, 1); + rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_GF40, 1); + rt2x00_set_field32(®, MM40_PROT_CFG_RTS_TH_EN, 0); + rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, GF20_PROT_CFG); + rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_RATE, 0x4004); + rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_CTRL, 1); + rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_NAV_SHORT, 1); + rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_CCK, 0); + rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_OFDM, 1); + rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_MM20, 1); + rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_MM40, 0); + rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_GF20, 1); + rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_GF40, 0); + rt2x00_set_field32(®, GF20_PROT_CFG_RTS_TH_EN, 0); + rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, GF40_PROT_CFG); + rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_RATE, 0x4084); + rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_CTRL, 1); + rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_NAV_SHORT, 1); + rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_CCK, 0); + rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_OFDM, 1); + rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_MM20, 1); + rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_MM40, 1); + rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_GF20, 1); + rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_GF40, 1); + rt2x00_set_field32(®, GF40_PROT_CFG_RTS_TH_EN, 0); + rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg); + + if (rt2x00_is_usb(rt2x00dev)) { + rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); + + reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG); + rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_DMA_BUSY, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_RX_DMA_BUSY, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 3); + rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_BIG_ENDIAN, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_RX_HDR_SCATTER, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_HDR_SEG_LEN, 0); + rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); + } + + /* + * The legacy driver also sets TXOP_CTRL_CFG_RESERVED_TRUN_EN to 1 + * although it is reserved. + */ + reg = rt2800_register_read(rt2x00dev, TXOP_CTRL_CFG); + rt2x00_set_field32(®, TXOP_CTRL_CFG_TIMEOUT_TRUN_EN, 1); + rt2x00_set_field32(®, TXOP_CTRL_CFG_AC_TRUN_EN, 1); + rt2x00_set_field32(®, TXOP_CTRL_CFG_TXRATEGRP_TRUN_EN, 1); + rt2x00_set_field32(®, TXOP_CTRL_CFG_USER_MODE_TRUN_EN, 1); + rt2x00_set_field32(®, TXOP_CTRL_CFG_MIMO_PS_TRUN_EN, 1); + rt2x00_set_field32(®, TXOP_CTRL_CFG_RESERVED_TRUN_EN, 1); + rt2x00_set_field32(®, TXOP_CTRL_CFG_LSIG_TXOP_EN, 0); + rt2x00_set_field32(®, TXOP_CTRL_CFG_EXT_CCA_EN, 0); + rt2x00_set_field32(®, TXOP_CTRL_CFG_EXT_CCA_DLY, 88); + rt2x00_set_field32(®, TXOP_CTRL_CFG_EXT_CWMIN, 0); + rt2800_register_write(rt2x00dev, TXOP_CTRL_CFG, reg); + + reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002; + rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg); + + if (rt2x00_rt(rt2x00dev, RT3883)) { + rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_0, 0x12111008); + rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413); + } + + reg = rt2800_register_read(rt2x00dev, TX_RTS_CFG); + rt2x00_set_field32(®, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 7); + rt2x00_set_field32(®, TX_RTS_CFG_RTS_THRES, + IEEE80211_MAX_RTS_THRESHOLD); + rt2x00_set_field32(®, TX_RTS_CFG_RTS_FBK_EN, 1); + rt2800_register_write(rt2x00dev, TX_RTS_CFG, reg); + + rt2800_register_write(rt2x00dev, EXP_ACK_TIME, 0x002400ca); + + /* + * Usually the CCK SIFS time should be set to 10 and the OFDM SIFS + * time should be set to 16. However, the original Ralink driver uses + * 16 for both and indeed using a value of 10 for CCK SIFS results in + * connection problems with 11g + CTS protection. Hence, use the same + * defaults as the Ralink driver: 16 for both, CCK and OFDM SIFS. + */ + reg = rt2800_register_read(rt2x00dev, XIFS_TIME_CFG); + rt2x00_set_field32(®, XIFS_TIME_CFG_CCKM_SIFS_TIME, 16); + rt2x00_set_field32(®, XIFS_TIME_CFG_OFDM_SIFS_TIME, 16); + rt2x00_set_field32(®, XIFS_TIME_CFG_OFDM_XIFS_TIME, 4); + rt2x00_set_field32(®, XIFS_TIME_CFG_EIFS, 314); + rt2x00_set_field32(®, XIFS_TIME_CFG_BB_RXEND_ENABLE, 1); + rt2800_register_write(rt2x00dev, XIFS_TIME_CFG, reg); + + rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003); + + /* + * ASIC will keep garbage value after boot, clear encryption keys. + */ + for (i = 0; i < 4; i++) + rt2800_register_write(rt2x00dev, + SHARED_KEY_MODE_ENTRY(i), 0); + + for (i = 0; i < 256; i++) { + rt2800_config_wcid(rt2x00dev, NULL, i); + rt2800_delete_wcid_attr(rt2x00dev, i); + rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0); + } + + /* + * Clear all beacons + */ + for (i = 0; i < 8; i++) + rt2800_clear_beacon_register(rt2x00dev, i); + + if (rt2x00_is_usb(rt2x00dev)) { + reg = rt2800_register_read(rt2x00dev, US_CYC_CNT); + rt2x00_set_field32(®, US_CYC_CNT_CLOCK_CYCLE, 30); + rt2800_register_write(rt2x00dev, US_CYC_CNT, reg); + } else if (rt2x00_is_pcie(rt2x00dev)) { + reg = rt2800_register_read(rt2x00dev, US_CYC_CNT); + rt2x00_set_field32(®, US_CYC_CNT_CLOCK_CYCLE, 125); + rt2800_register_write(rt2x00dev, US_CYC_CNT, reg); + } + + reg = rt2800_register_read(rt2x00dev, HT_FBK_CFG0); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS0FBK, 0); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS1FBK, 0); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS2FBK, 1); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS3FBK, 2); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS4FBK, 3); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS5FBK, 4); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS6FBK, 5); + rt2x00_set_field32(®, HT_FBK_CFG0_HTMCS7FBK, 6); + rt2800_register_write(rt2x00dev, HT_FBK_CFG0, reg); + + reg = rt2800_register_read(rt2x00dev, HT_FBK_CFG1); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS8FBK, 8); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS9FBK, 8); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS10FBK, 9); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS11FBK, 10); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS12FBK, 11); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS13FBK, 12); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS14FBK, 13); + rt2x00_set_field32(®, HT_FBK_CFG1_HTMCS15FBK, 14); + rt2800_register_write(rt2x00dev, HT_FBK_CFG1, reg); + + reg = rt2800_register_read(rt2x00dev, LG_FBK_CFG0); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS0FBK, 8); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS1FBK, 8); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS2FBK, 9); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS3FBK, 10); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS4FBK, 11); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS5FBK, 12); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS6FBK, 13); + rt2x00_set_field32(®, LG_FBK_CFG0_OFDMMCS7FBK, 14); + rt2800_register_write(rt2x00dev, LG_FBK_CFG0, reg); + + reg = rt2800_register_read(rt2x00dev, LG_FBK_CFG1); + rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS0FBK, 0); + rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS1FBK, 0); + rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS2FBK, 1); + rt2x00_set_field32(®, LG_FBK_CFG0_CCKMCS3FBK, 2); + rt2800_register_write(rt2x00dev, LG_FBK_CFG1, reg); + + /* + * Do not force the BA window size, we use the TXWI to set it + */ + reg = rt2800_register_read(rt2x00dev, AMPDU_BA_WINSIZE); + rt2x00_set_field32(®, AMPDU_BA_WINSIZE_FORCE_WINSIZE_ENABLE, 0); + rt2x00_set_field32(®, AMPDU_BA_WINSIZE_FORCE_WINSIZE, 0); + rt2800_register_write(rt2x00dev, AMPDU_BA_WINSIZE, reg); + + /* + * We must clear the error counters. + * These registers are cleared on read, + * so we may pass a useless variable to store the value. + */ + reg = rt2800_register_read(rt2x00dev, RX_STA_CNT0); + reg = rt2800_register_read(rt2x00dev, RX_STA_CNT1); + reg = rt2800_register_read(rt2x00dev, RX_STA_CNT2); + reg = rt2800_register_read(rt2x00dev, TX_STA_CNT0); + reg = rt2800_register_read(rt2x00dev, TX_STA_CNT1); + reg = rt2800_register_read(rt2x00dev, TX_STA_CNT2); + + /* + * Setup leadtime for pre tbtt interrupt to 6ms + */ + reg = rt2800_register_read(rt2x00dev, INT_TIMER_CFG); + rt2x00_set_field32(®, INT_TIMER_CFG_PRE_TBTT_TIMER, 6 << 4); + rt2800_register_write(rt2x00dev, INT_TIMER_CFG, reg); + + /* + * Set up channel statistics timer + */ + reg = rt2800_register_read(rt2x00dev, CH_TIME_CFG); + rt2x00_set_field32(®, CH_TIME_CFG_EIFS_BUSY, 1); + rt2x00_set_field32(®, CH_TIME_CFG_NAV_BUSY, 1); + rt2x00_set_field32(®, CH_TIME_CFG_RX_BUSY, 1); + rt2x00_set_field32(®, CH_TIME_CFG_TX_BUSY, 1); + rt2x00_set_field32(®, CH_TIME_CFG_TMR_EN, 1); + rt2800_register_write(rt2x00dev, CH_TIME_CFG, reg); + + return 0; +} + +static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev) +{ + unsigned int i; + u32 reg; + + for (i = 0; i < REGISTER_BUSY_COUNT; i++) { + reg = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG); + if (!rt2x00_get_field32(reg, MAC_STATUS_CFG_BBP_RF_BUSY)) + return 0; + + usleep(REGISTER_BUSY_DELAY); + } + + rt2x00_err(rt2x00dev, "BBP/RF register access failed, aborting\n"); + return -EACCES; +} + +static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev) +{ + unsigned int i; + u8 value; + + /* + * BBP was enabled after firmware was loaded, + * but we need to reactivate it now. + */ + rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0); + rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); + usleep(1); + + for (i = 0; i < REGISTER_BUSY_COUNT; i++) { + value = rt2800_bbp_read(rt2x00dev, 0); + if ((value != 0xff) && (value != 0x00)) + return 0; + usleep(REGISTER_BUSY_DELAY); + } + + rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n"); + return -EACCES; +} + +int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev) { + u32 reg; + + if (rt2x00_rt(rt2x00dev, RT3290)) { + reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL); + return rt2x00_get_field32(reg, WLAN_GPIO_IN_BIT0); + } else { + reg = rt2800_register_read(rt2x00dev, GPIO_CTRL); + return rt2x00_get_field32(reg, GPIO_CTRL_VAL2); + } +} + +static void rt2800_bbp4_mac_if_ctrl(struct rt2x00_dev *rt2x00dev) +{ + u8 value; + + value = rt2800_bbp_read(rt2x00dev, 4); + rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1); + rt2800_bbp_write(rt2x00dev, 4, value); +} + +static void rt2800_init_freq_calibration(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 142, 1); + rt2800_bbp_write(rt2x00dev, 143, 57); +} + +static void rt2800_init_bbp_5592_glrt(struct rt2x00_dev *rt2x00dev) +{ + static const u8 glrt_table[] = { + 0xE0, 0x1F, 0X38, 0x32, 0x08, 0x28, 0x19, 0x0A, 0xFF, 0x00, /* 128 ~ 137 */ + 0x16, 0x10, 0x10, 0x0B, 0x36, 0x2C, 0x26, 0x24, 0x42, 0x36, /* 138 ~ 147 */ + 0x30, 0x2D, 0x4C, 0x46, 0x3D, 0x40, 0x3E, 0x42, 0x3D, 0x40, /* 148 ~ 157 */ + 0X3C, 0x34, 0x2C, 0x2F, 0x3C, 0x35, 0x2E, 0x2A, 0x49, 0x41, /* 158 ~ 167 */ + 0x36, 0x31, 0x30, 0x30, 0x0E, 0x0D, 0x28, 0x21, 0x1C, 0x16, /* 168 ~ 177 */ + 0x50, 0x4A, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, /* 178 ~ 187 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 188 ~ 197 */ + 0x00, 0x00, 0x7D, 0x14, 0x32, 0x2C, 0x36, 0x4C, 0x43, 0x2C, /* 198 ~ 207 */ + 0x2E, 0x36, 0x30, 0x6E, /* 208 ~ 211 */ + }; + int i; + + for (i = 0; i < ARRAY_SIZE(glrt_table); i++) { + rt2800_bbp_write(rt2x00dev, 195, 128 + i); + rt2800_bbp_write(rt2x00dev, 196, glrt_table[i]); + } +}; + +static void rt2800_init_bbp_early(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 65, 0x2C); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + rt2800_bbp_write(rt2x00dev, 68, 0x0B); + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + rt2800_bbp_write(rt2x00dev, 73, 0x10); + rt2800_bbp_write(rt2x00dev, 81, 0x37); + rt2800_bbp_write(rt2x00dev, 82, 0x62); + rt2800_bbp_write(rt2x00dev, 83, 0x6A); + rt2800_bbp_write(rt2x00dev, 84, 0x99); + rt2800_bbp_write(rt2x00dev, 86, 0x00); + rt2800_bbp_write(rt2x00dev, 91, 0x04); + rt2800_bbp_write(rt2x00dev, 92, 0x00); + rt2800_bbp_write(rt2x00dev, 103, 0x00); + rt2800_bbp_write(rt2x00dev, 105, 0x05); + rt2800_bbp_write(rt2x00dev, 106, 0x35); +} + +static void rt2800_disable_unused_dac_adc(struct rt2x00_dev *rt2x00dev) +{ + u16 eeprom; + u8 value; + + value = rt2800_bbp_read(rt2x00dev, 138); + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1) + value |= 0x20; + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1) + value &= ~0x02; + rt2800_bbp_write(rt2x00dev, 138, value); +} + +static void rt2800_init_bbp_305x_soc(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 31, 0x08); + + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x10); + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 78, 0x0e); + rt2800_bbp_write(rt2x00dev, 80, 0x08); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + rt2800_bbp_write(rt2x00dev, 83, 0x6a); + + rt2800_bbp_write(rt2x00dev, 84, 0x99); + + rt2800_bbp_write(rt2x00dev, 86, 0x00); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x00); + + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + + rt2800_bbp_write(rt2x00dev, 105, 0x01); + + rt2800_bbp_write(rt2x00dev, 106, 0x35); +} + +static void rt2800_init_bbp_28xx(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) { + rt2800_bbp_write(rt2x00dev, 69, 0x16); + rt2800_bbp_write(rt2x00dev, 73, 0x12); + } else { + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x10); + } + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 81, 0x37); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + rt2800_bbp_write(rt2x00dev, 83, 0x6a); + + if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D)) + rt2800_bbp_write(rt2x00dev, 84, 0x19); + else + rt2800_bbp_write(rt2x00dev, 84, 0x99); + + rt2800_bbp_write(rt2x00dev, 86, 0x00); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x00); + + rt2800_bbp_write(rt2x00dev, 103, 0x00); + + rt2800_bbp_write(rt2x00dev, 105, 0x05); + + rt2800_bbp_write(rt2x00dev, 106, 0x35); +} + +static void rt2800_init_bbp_30xx(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x10); + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 79, 0x13); + rt2800_bbp_write(rt2x00dev, 80, 0x05); + rt2800_bbp_write(rt2x00dev, 81, 0x33); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + rt2800_bbp_write(rt2x00dev, 83, 0x6a); + + rt2800_bbp_write(rt2x00dev, 84, 0x99); + + rt2800_bbp_write(rt2x00dev, 86, 0x00); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x00); + + if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) || + rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) || + rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E)) + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + else + rt2800_bbp_write(rt2x00dev, 103, 0x00); + + rt2800_bbp_write(rt2x00dev, 105, 0x05); + + rt2800_bbp_write(rt2x00dev, 106, 0x35); + + if (rt2x00_rt(rt2x00dev, RT3071) || + rt2x00_rt(rt2x00dev, RT3090)) + rt2800_disable_unused_dac_adc(rt2x00dev); +} + +static void rt2800_init_bbp_3290(struct rt2x00_dev *rt2x00dev) +{ + u8 value; + + rt2800_bbp4_mac_if_ctrl(rt2x00dev); + + rt2800_bbp_write(rt2x00dev, 31, 0x08); + + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + rt2800_bbp_write(rt2x00dev, 68, 0x0b); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x13); + rt2800_bbp_write(rt2x00dev, 75, 0x46); + rt2800_bbp_write(rt2x00dev, 76, 0x28); + + rt2800_bbp_write(rt2x00dev, 77, 0x58); + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 74, 0x0b); + rt2800_bbp_write(rt2x00dev, 79, 0x18); + rt2800_bbp_write(rt2x00dev, 80, 0x09); + rt2800_bbp_write(rt2x00dev, 81, 0x33); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + rt2800_bbp_write(rt2x00dev, 83, 0x7a); + + rt2800_bbp_write(rt2x00dev, 84, 0x9a); + + rt2800_bbp_write(rt2x00dev, 86, 0x38); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x02); + + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + + rt2800_bbp_write(rt2x00dev, 104, 0x92); + + rt2800_bbp_write(rt2x00dev, 105, 0x1c); + + rt2800_bbp_write(rt2x00dev, 106, 0x03); + + rt2800_bbp_write(rt2x00dev, 128, 0x12); + + rt2800_bbp_write(rt2x00dev, 67, 0x24); + rt2800_bbp_write(rt2x00dev, 143, 0x04); + rt2800_bbp_write(rt2x00dev, 142, 0x99); + rt2800_bbp_write(rt2x00dev, 150, 0x30); + rt2800_bbp_write(rt2x00dev, 151, 0x2e); + rt2800_bbp_write(rt2x00dev, 152, 0x20); + rt2800_bbp_write(rt2x00dev, 153, 0x34); + rt2800_bbp_write(rt2x00dev, 154, 0x40); + rt2800_bbp_write(rt2x00dev, 155, 0x3b); + rt2800_bbp_write(rt2x00dev, 253, 0x04); + + value = rt2800_bbp_read(rt2x00dev, 47); + rt2x00_set_field8(&value, BBP47_TSSI_ADC6, 1); + rt2800_bbp_write(rt2x00dev, 47, value); + + /* Use 5-bit ADC for Acquisition and 8-bit ADC for data */ + value = rt2800_bbp_read(rt2x00dev, 3); + rt2x00_set_field8(&value, BBP3_ADC_MODE_SWITCH, 1); + rt2x00_set_field8(&value, BBP3_ADC_INIT_MODE, 1); + rt2800_bbp_write(rt2x00dev, 3, value); +} + +static void rt2800_init_bbp_3352(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 3, 0x00); + rt2800_bbp_write(rt2x00dev, 4, 0x50); + + rt2800_bbp_write(rt2x00dev, 31, 0x08); + + rt2800_bbp_write(rt2x00dev, 47, 0x48); + + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + rt2800_bbp_write(rt2x00dev, 68, 0x0b); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x13); + rt2800_bbp_write(rt2x00dev, 75, 0x46); + rt2800_bbp_write(rt2x00dev, 76, 0x28); + + rt2800_bbp_write(rt2x00dev, 77, 0x59); + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 78, 0x0e); + rt2800_bbp_write(rt2x00dev, 80, 0x08); + rt2800_bbp_write(rt2x00dev, 81, 0x37); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + if (rt2x00_rt(rt2x00dev, RT5350)) { + rt2800_bbp_write(rt2x00dev, 83, 0x7a); + rt2800_bbp_write(rt2x00dev, 84, 0x9a); + } else { + rt2800_bbp_write(rt2x00dev, 83, 0x6a); + rt2800_bbp_write(rt2x00dev, 84, 0x99); + } + + rt2800_bbp_write(rt2x00dev, 86, 0x38); + + rt2800_bbp_write(rt2x00dev, 88, 0x90); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x02); + + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + + rt2800_bbp_write(rt2x00dev, 104, 0x92); + + if (rt2x00_rt(rt2x00dev, RT5350)) { + rt2800_bbp_write(rt2x00dev, 105, 0x3c); + rt2800_bbp_write(rt2x00dev, 106, 0x03); + } else { + rt2800_bbp_write(rt2x00dev, 105, 0x34); + rt2800_bbp_write(rt2x00dev, 106, 0x05); + } + + rt2800_bbp_write(rt2x00dev, 120, 0x50); + + rt2800_bbp_write(rt2x00dev, 137, 0x0f); + + rt2800_bbp_write(rt2x00dev, 163, 0xbd); + /* Set ITxBF timeout to 0x9c40=1000msec */ + rt2800_bbp_write(rt2x00dev, 179, 0x02); + rt2800_bbp_write(rt2x00dev, 180, 0x00); + rt2800_bbp_write(rt2x00dev, 182, 0x40); + rt2800_bbp_write(rt2x00dev, 180, 0x01); + rt2800_bbp_write(rt2x00dev, 182, 0x9c); + rt2800_bbp_write(rt2x00dev, 179, 0x00); + /* Reprogram the inband interface to put right values in RXWI */ + rt2800_bbp_write(rt2x00dev, 142, 0x04); + rt2800_bbp_write(rt2x00dev, 143, 0x3b); + rt2800_bbp_write(rt2x00dev, 142, 0x06); + rt2800_bbp_write(rt2x00dev, 143, 0xa0); + rt2800_bbp_write(rt2x00dev, 142, 0x07); + rt2800_bbp_write(rt2x00dev, 143, 0xa1); + rt2800_bbp_write(rt2x00dev, 142, 0x08); + rt2800_bbp_write(rt2x00dev, 143, 0xa2); + + rt2800_bbp_write(rt2x00dev, 148, 0xc8); + + if (rt2x00_rt(rt2x00dev, RT5350)) { + /* Antenna Software OFDM */ + rt2800_bbp_write(rt2x00dev, 150, 0x40); + /* Antenna Software CCK */ + rt2800_bbp_write(rt2x00dev, 151, 0x30); + rt2800_bbp_write(rt2x00dev, 152, 0xa3); + /* Clear previously selected antenna */ + rt2800_bbp_write(rt2x00dev, 154, 0); + } +} + +static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x10); + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 79, 0x13); + rt2800_bbp_write(rt2x00dev, 80, 0x05); + rt2800_bbp_write(rt2x00dev, 81, 0x33); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + rt2800_bbp_write(rt2x00dev, 83, 0x6a); + + rt2800_bbp_write(rt2x00dev, 84, 0x99); + + rt2800_bbp_write(rt2x00dev, 86, 0x00); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x00); + + if (rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E)) + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + else + rt2800_bbp_write(rt2x00dev, 103, 0x00); + + rt2800_bbp_write(rt2x00dev, 105, 0x05); + + rt2800_bbp_write(rt2x00dev, 106, 0x35); + + rt2800_disable_unused_dac_adc(rt2x00dev); +} + +static void rt2800_init_bbp_3572(struct rt2x00_dev *rt2x00dev) +{ + rt2800_bbp_write(rt2x00dev, 31, 0x08); + + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x10); + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 79, 0x13); + rt2800_bbp_write(rt2x00dev, 80, 0x05); + rt2800_bbp_write(rt2x00dev, 81, 0x33); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + rt2800_bbp_write(rt2x00dev, 83, 0x6a); + + rt2800_bbp_write(rt2x00dev, 84, 0x99); + + rt2800_bbp_write(rt2x00dev, 86, 0x00); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x00); + + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + + rt2800_bbp_write(rt2x00dev, 105, 0x05); + + rt2800_bbp_write(rt2x00dev, 106, 0x35); + + rt2800_disable_unused_dac_adc(rt2x00dev); +} + +static void rt2800_init_bbp_3593(struct rt2x00_dev *rt2x00dev) +{ + rt2800_init_bbp_early(rt2x00dev); + + rt2800_bbp_write(rt2x00dev, 79, 0x13); + rt2800_bbp_write(rt2x00dev, 80, 0x05); + rt2800_bbp_write(rt2x00dev, 81, 0x33); + rt2800_bbp_write(rt2x00dev, 137, 0x0f); + + rt2800_bbp_write(rt2x00dev, 84, 0x19); + + /* Enable DC filter */ + if (rt2x00_rt_rev_gte(rt2x00dev, RT3593, REV_RT3593E)) + rt2800_bbp_write(rt2x00dev, 103, 0xc0); +} + +static void rt2800_init_bbp_3883(struct rt2x00_dev *rt2x00dev) +{ + rt2800_init_bbp_early(rt2x00dev); + + rt2800_bbp_write(rt2x00dev, 4, 0x50); + rt2800_bbp_write(rt2x00dev, 47, 0x48); + + rt2800_bbp_write(rt2x00dev, 86, 0x46); + rt2800_bbp_write(rt2x00dev, 88, 0x90); + + rt2800_bbp_write(rt2x00dev, 92, 0x02); + + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + rt2800_bbp_write(rt2x00dev, 104, 0x92); + rt2800_bbp_write(rt2x00dev, 105, 0x34); + rt2800_bbp_write(rt2x00dev, 106, 0x12); + rt2800_bbp_write(rt2x00dev, 120, 0x50); + rt2800_bbp_write(rt2x00dev, 137, 0x0f); + rt2800_bbp_write(rt2x00dev, 163, 0x9d); + + /* Set ITxBF timeout to 0x9C40=1000msec */ + rt2800_bbp_write(rt2x00dev, 179, 0x02); + rt2800_bbp_write(rt2x00dev, 180, 0x00); + rt2800_bbp_write(rt2x00dev, 182, 0x40); + rt2800_bbp_write(rt2x00dev, 180, 0x01); + rt2800_bbp_write(rt2x00dev, 182, 0x9c); + + rt2800_bbp_write(rt2x00dev, 179, 0x00); + + /* Reprogram the inband interface to put right values in RXWI */ + rt2800_bbp_write(rt2x00dev, 142, 0x04); + rt2800_bbp_write(rt2x00dev, 143, 0x3b); + rt2800_bbp_write(rt2x00dev, 142, 0x06); + rt2800_bbp_write(rt2x00dev, 143, 0xa0); + rt2800_bbp_write(rt2x00dev, 142, 0x07); + rt2800_bbp_write(rt2x00dev, 143, 0xa1); + rt2800_bbp_write(rt2x00dev, 142, 0x08); + rt2800_bbp_write(rt2x00dev, 143, 0xa2); + rt2800_bbp_write(rt2x00dev, 148, 0xc8); +} + +static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) +{ + int ant, div_mode; + u16 eeprom; + u8 value; + + rt2800_bbp4_mac_if_ctrl(rt2x00dev); + + rt2800_bbp_write(rt2x00dev, 31, 0x08); + + rt2800_bbp_write(rt2x00dev, 65, 0x2c); + rt2800_bbp_write(rt2x00dev, 66, 0x38); + + rt2800_bbp_write(rt2x00dev, 68, 0x0b); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + rt2800_bbp_write(rt2x00dev, 73, 0x13); + rt2800_bbp_write(rt2x00dev, 75, 0x46); + rt2800_bbp_write(rt2x00dev, 76, 0x28); + + rt2800_bbp_write(rt2x00dev, 77, 0x59); + + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + + rt2800_bbp_write(rt2x00dev, 79, 0x13); + rt2800_bbp_write(rt2x00dev, 80, 0x05); + rt2800_bbp_write(rt2x00dev, 81, 0x33); + + rt2800_bbp_write(rt2x00dev, 82, 0x62); + + rt2800_bbp_write(rt2x00dev, 83, 0x7a); + + rt2800_bbp_write(rt2x00dev, 84, 0x9a); + + rt2800_bbp_write(rt2x00dev, 86, 0x38); + + if (rt2x00_rt(rt2x00dev, RT5392)) + rt2800_bbp_write(rt2x00dev, 88, 0x90); + + rt2800_bbp_write(rt2x00dev, 91, 0x04); + + rt2800_bbp_write(rt2x00dev, 92, 0x02); + + if (rt2x00_rt(rt2x00dev, RT5392)) { + rt2800_bbp_write(rt2x00dev, 95, 0x9a); + rt2800_bbp_write(rt2x00dev, 98, 0x12); + } + + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + + rt2800_bbp_write(rt2x00dev, 104, 0x92); + + rt2800_bbp_write(rt2x00dev, 105, 0x3c); + + if (rt2x00_rt(rt2x00dev, RT5390)) + rt2800_bbp_write(rt2x00dev, 106, 0x03); + else if (rt2x00_rt(rt2x00dev, RT5392)) + rt2800_bbp_write(rt2x00dev, 106, 0x12); + else + WARN_ON(1); + + rt2800_bbp_write(rt2x00dev, 128, 0x12); + + if (rt2x00_rt(rt2x00dev, RT5392)) { + rt2800_bbp_write(rt2x00dev, 134, 0xd0); + rt2800_bbp_write(rt2x00dev, 135, 0xf6); + } + + rt2800_disable_unused_dac_adc(rt2x00dev); + + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + div_mode = rt2x00_get_field16(eeprom, + EEPROM_NIC_CONF1_ANT_DIVERSITY); + ant = (div_mode == 3) ? 1 : 0; + + /* check if this is a Bluetooth combo card */ + if (rt2x00_has_cap_bt_coexist(rt2x00dev)) { + u32 reg; + + reg = rt2800_register_read(rt2x00dev, GPIO_CTRL); + rt2x00_set_field32(®, GPIO_CTRL_DIR3, 0); + rt2x00_set_field32(®, GPIO_CTRL_DIR6, 0); + rt2x00_set_field32(®, GPIO_CTRL_VAL3, 0); + rt2x00_set_field32(®, GPIO_CTRL_VAL6, 0); + if (ant == 0) + rt2x00_set_field32(®, GPIO_CTRL_VAL3, 1); + else if (ant == 1) + rt2x00_set_field32(®, GPIO_CTRL_VAL6, 1); + rt2800_register_write(rt2x00dev, GPIO_CTRL, reg); + } + + /* These chips have hardware RX antenna diversity */ + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R) || + rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5370G)) { + rt2800_bbp_write(rt2x00dev, 150, 0); /* Disable Antenna Software OFDM */ + rt2800_bbp_write(rt2x00dev, 151, 0); /* Disable Antenna Software CCK */ + rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */ + } + + value = rt2800_bbp_read(rt2x00dev, 152); + if (ant == 0) + rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1); + else + rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0); + rt2800_bbp_write(rt2x00dev, 152, value); + + rt2800_init_freq_calibration(rt2x00dev); +} + +static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev) +{ + int ant, div_mode; + u16 eeprom; + u8 value; + + rt2800_init_bbp_early(rt2x00dev); + + value = rt2800_bbp_read(rt2x00dev, 105); + rt2x00_set_field8(&value, BBP105_MLD, + rt2x00dev->default_ant.rx_chain_num == 2); + rt2800_bbp_write(rt2x00dev, 105, value); + + rt2800_bbp4_mac_if_ctrl(rt2x00dev); + + rt2800_bbp_write(rt2x00dev, 20, 0x06); + rt2800_bbp_write(rt2x00dev, 31, 0x08); + rt2800_bbp_write(rt2x00dev, 65, 0x2C); + rt2800_bbp_write(rt2x00dev, 68, 0xDD); + rt2800_bbp_write(rt2x00dev, 69, 0x1A); + rt2800_bbp_write(rt2x00dev, 70, 0x05); + rt2800_bbp_write(rt2x00dev, 73, 0x13); + rt2800_bbp_write(rt2x00dev, 74, 0x0F); + rt2800_bbp_write(rt2x00dev, 75, 0x4F); + rt2800_bbp_write(rt2x00dev, 76, 0x28); + rt2800_bbp_write(rt2x00dev, 77, 0x59); + rt2800_bbp_write(rt2x00dev, 84, 0x9A); + rt2800_bbp_write(rt2x00dev, 86, 0x38); + rt2800_bbp_write(rt2x00dev, 88, 0x90); + rt2800_bbp_write(rt2x00dev, 91, 0x04); + rt2800_bbp_write(rt2x00dev, 92, 0x02); + rt2800_bbp_write(rt2x00dev, 95, 0x9a); + rt2800_bbp_write(rt2x00dev, 98, 0x12); + rt2800_bbp_write(rt2x00dev, 103, 0xC0); + rt2800_bbp_write(rt2x00dev, 104, 0x92); + /* FIXME BBP105 owerwrite */ + rt2800_bbp_write(rt2x00dev, 105, 0x3C); + rt2800_bbp_write(rt2x00dev, 106, 0x35); + rt2800_bbp_write(rt2x00dev, 128, 0x12); + rt2800_bbp_write(rt2x00dev, 134, 0xD0); + rt2800_bbp_write(rt2x00dev, 135, 0xF6); + rt2800_bbp_write(rt2x00dev, 137, 0x0F); + + /* Initialize GLRT (Generalized Likehood Radio Test) */ + rt2800_init_bbp_5592_glrt(rt2x00dev); + + rt2800_bbp4_mac_if_ctrl(rt2x00dev); + + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + div_mode = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_ANT_DIVERSITY); + ant = (div_mode == 3) ? 1 : 0; + value = rt2800_bbp_read(rt2x00dev, 152); + if (ant == 0) { + /* Main antenna */ + rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1); + } else { + /* Auxiliary antenna */ + rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0); + } + rt2800_bbp_write(rt2x00dev, 152, value); + + if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) { + value = rt2800_bbp_read(rt2x00dev, 254); + rt2x00_set_field8(&value, BBP254_BIT7, 1); + rt2800_bbp_write(rt2x00dev, 254, value); + } + + rt2800_init_freq_calibration(rt2x00dev); + + rt2800_bbp_write(rt2x00dev, 84, 0x19); + if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) + rt2800_bbp_write(rt2x00dev, 103, 0xc0); +} + +static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev, + const u8 reg, const u8 value) +{ + rt2800_bbp_write(rt2x00dev, 195, reg); + rt2800_bbp_write(rt2x00dev, 196, value); +} + +static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev, + const u8 reg, const u8 value) +{ + rt2800_bbp_write(rt2x00dev, 158, reg); + rt2800_bbp_write(rt2x00dev, 159, value); +} + +static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg) +{ + rt2800_bbp_write(rt2x00dev, 158, reg); + return rt2800_bbp_read(rt2x00dev, 159); +} + +static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev) +{ + u8 bbp; + + /* Apply Maximum Likelihood Detection (MLD) for 2 stream case */ + bbp = rt2800_bbp_read(rt2x00dev, 105); + rt2x00_set_field8(&bbp, BBP105_MLD, + rt2x00dev->default_ant.rx_chain_num == 2); + rt2800_bbp_write(rt2x00dev, 105, bbp); + + /* Avoid data loss and CRC errors */ + rt2800_bbp4_mac_if_ctrl(rt2x00dev); + + /* Fix I/Q swap issue */ + bbp = rt2800_bbp_read(rt2x00dev, 1); + bbp |= 0x04; + rt2800_bbp_write(rt2x00dev, 1, bbp); + + /* BBP for G band */ + rt2800_bbp_write(rt2x00dev, 3, 0x08); + rt2800_bbp_write(rt2x00dev, 4, 0x00); /* rt2800_bbp4_mac_if_ctrl? */ + rt2800_bbp_write(rt2x00dev, 6, 0x08); + rt2800_bbp_write(rt2x00dev, 14, 0x09); + rt2800_bbp_write(rt2x00dev, 15, 0xFF); + rt2800_bbp_write(rt2x00dev, 16, 0x01); + rt2800_bbp_write(rt2x00dev, 20, 0x06); + rt2800_bbp_write(rt2x00dev, 21, 0x00); + rt2800_bbp_write(rt2x00dev, 22, 0x00); + rt2800_bbp_write(rt2x00dev, 27, 0x00); + rt2800_bbp_write(rt2x00dev, 28, 0x00); + rt2800_bbp_write(rt2x00dev, 30, 0x00); + rt2800_bbp_write(rt2x00dev, 31, 0x48); + rt2800_bbp_write(rt2x00dev, 47, 0x40); + rt2800_bbp_write(rt2x00dev, 62, 0x00); + rt2800_bbp_write(rt2x00dev, 63, 0x00); + rt2800_bbp_write(rt2x00dev, 64, 0x00); + rt2800_bbp_write(rt2x00dev, 65, 0x2C); + rt2800_bbp_write(rt2x00dev, 66, 0x1C); + rt2800_bbp_write(rt2x00dev, 67, 0x20); + rt2800_bbp_write(rt2x00dev, 68, 0xDD); + rt2800_bbp_write(rt2x00dev, 69, 0x10); + rt2800_bbp_write(rt2x00dev, 70, 0x05); + rt2800_bbp_write(rt2x00dev, 73, 0x18); + rt2800_bbp_write(rt2x00dev, 74, 0x0F); + rt2800_bbp_write(rt2x00dev, 75, 0x60); + rt2800_bbp_write(rt2x00dev, 76, 0x44); + rt2800_bbp_write(rt2x00dev, 77, 0x59); + rt2800_bbp_write(rt2x00dev, 78, 0x1E); + rt2800_bbp_write(rt2x00dev, 79, 0x1C); + rt2800_bbp_write(rt2x00dev, 80, 0x0C); + rt2800_bbp_write(rt2x00dev, 81, 0x3A); + rt2800_bbp_write(rt2x00dev, 82, 0xB6); + rt2800_bbp_write(rt2x00dev, 83, 0x9A); + rt2800_bbp_write(rt2x00dev, 84, 0x9A); + rt2800_bbp_write(rt2x00dev, 86, 0x38); + rt2800_bbp_write(rt2x00dev, 88, 0x90); + rt2800_bbp_write(rt2x00dev, 91, 0x04); + rt2800_bbp_write(rt2x00dev, 92, 0x02); + rt2800_bbp_write(rt2x00dev, 95, 0x9A); + rt2800_bbp_write(rt2x00dev, 96, 0x00); + rt2800_bbp_write(rt2x00dev, 103, 0xC0); + rt2800_bbp_write(rt2x00dev, 104, 0x92); + /* FIXME BBP105 owerwrite */ + rt2800_bbp_write(rt2x00dev, 105, 0x3C); + rt2800_bbp_write(rt2x00dev, 106, 0x12); + rt2800_bbp_write(rt2x00dev, 109, 0x00); + rt2800_bbp_write(rt2x00dev, 134, 0x10); + rt2800_bbp_write(rt2x00dev, 135, 0xA6); + rt2800_bbp_write(rt2x00dev, 137, 0x04); + rt2800_bbp_write(rt2x00dev, 142, 0x30); + rt2800_bbp_write(rt2x00dev, 143, 0xF7); + rt2800_bbp_write(rt2x00dev, 160, 0xEC); + rt2800_bbp_write(rt2x00dev, 161, 0xC4); + rt2800_bbp_write(rt2x00dev, 162, 0x77); + rt2800_bbp_write(rt2x00dev, 163, 0xF9); + rt2800_bbp_write(rt2x00dev, 164, 0x00); + rt2800_bbp_write(rt2x00dev, 165, 0x00); + rt2800_bbp_write(rt2x00dev, 186, 0x00); + rt2800_bbp_write(rt2x00dev, 187, 0x00); + rt2800_bbp_write(rt2x00dev, 188, 0x00); + rt2800_bbp_write(rt2x00dev, 186, 0x00); + rt2800_bbp_write(rt2x00dev, 187, 0x01); + rt2800_bbp_write(rt2x00dev, 188, 0x00); + rt2800_bbp_write(rt2x00dev, 189, 0x00); + + rt2800_bbp_write(rt2x00dev, 91, 0x06); + rt2800_bbp_write(rt2x00dev, 92, 0x04); + rt2800_bbp_write(rt2x00dev, 93, 0x54); + rt2800_bbp_write(rt2x00dev, 99, 0x50); + rt2800_bbp_write(rt2x00dev, 148, 0x84); + rt2800_bbp_write(rt2x00dev, 167, 0x80); + rt2800_bbp_write(rt2x00dev, 178, 0xFF); + rt2800_bbp_write(rt2x00dev, 106, 0x13); + + /* BBP for G band GLRT function (BBP_128 ~ BBP_221) */ + rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00); + rt2800_bbp_glrt_write(rt2x00dev, 1, 0x14); + rt2800_bbp_glrt_write(rt2x00dev, 2, 0x20); + rt2800_bbp_glrt_write(rt2x00dev, 3, 0x0A); + rt2800_bbp_glrt_write(rt2x00dev, 10, 0x16); + rt2800_bbp_glrt_write(rt2x00dev, 11, 0x06); + rt2800_bbp_glrt_write(rt2x00dev, 12, 0x02); + rt2800_bbp_glrt_write(rt2x00dev, 13, 0x07); + rt2800_bbp_glrt_write(rt2x00dev, 14, 0x05); + rt2800_bbp_glrt_write(rt2x00dev, 15, 0x09); + rt2800_bbp_glrt_write(rt2x00dev, 16, 0x20); + rt2800_bbp_glrt_write(rt2x00dev, 17, 0x08); + rt2800_bbp_glrt_write(rt2x00dev, 18, 0x4A); + rt2800_bbp_glrt_write(rt2x00dev, 19, 0x00); + rt2800_bbp_glrt_write(rt2x00dev, 20, 0x00); + rt2800_bbp_glrt_write(rt2x00dev, 128, 0xE0); + rt2800_bbp_glrt_write(rt2x00dev, 129, 0x1F); + rt2800_bbp_glrt_write(rt2x00dev, 130, 0x4F); + rt2800_bbp_glrt_write(rt2x00dev, 131, 0x32); + rt2800_bbp_glrt_write(rt2x00dev, 132, 0x08); + rt2800_bbp_glrt_write(rt2x00dev, 133, 0x28); + rt2800_bbp_glrt_write(rt2x00dev, 134, 0x19); + rt2800_bbp_glrt_write(rt2x00dev, 135, 0x0A); + rt2800_bbp_glrt_write(rt2x00dev, 138, 0x16); + rt2800_bbp_glrt_write(rt2x00dev, 139, 0x10); + rt2800_bbp_glrt_write(rt2x00dev, 140, 0x10); + rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1A); + rt2800_bbp_glrt_write(rt2x00dev, 142, 0x36); + rt2800_bbp_glrt_write(rt2x00dev, 143, 0x2C); + rt2800_bbp_glrt_write(rt2x00dev, 144, 0x26); + rt2800_bbp_glrt_write(rt2x00dev, 145, 0x24); + rt2800_bbp_glrt_write(rt2x00dev, 146, 0x42); + rt2800_bbp_glrt_write(rt2x00dev, 147, 0x40); + rt2800_bbp_glrt_write(rt2x00dev, 148, 0x30); + rt2800_bbp_glrt_write(rt2x00dev, 149, 0x29); + rt2800_bbp_glrt_write(rt2x00dev, 150, 0x4C); + rt2800_bbp_glrt_write(rt2x00dev, 151, 0x46); + rt2800_bbp_glrt_write(rt2x00dev, 152, 0x3D); + rt2800_bbp_glrt_write(rt2x00dev, 153, 0x40); + rt2800_bbp_glrt_write(rt2x00dev, 154, 0x3E); + rt2800_bbp_glrt_write(rt2x00dev, 155, 0x38); + rt2800_bbp_glrt_write(rt2x00dev, 156, 0x3D); + rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2F); + rt2800_bbp_glrt_write(rt2x00dev, 158, 0x3C); + rt2800_bbp_glrt_write(rt2x00dev, 159, 0x34); + rt2800_bbp_glrt_write(rt2x00dev, 160, 0x2C); + rt2800_bbp_glrt_write(rt2x00dev, 161, 0x2F); + rt2800_bbp_glrt_write(rt2x00dev, 162, 0x3C); + rt2800_bbp_glrt_write(rt2x00dev, 163, 0x35); + rt2800_bbp_glrt_write(rt2x00dev, 164, 0x2E); + rt2800_bbp_glrt_write(rt2x00dev, 165, 0x2F); + rt2800_bbp_glrt_write(rt2x00dev, 166, 0x49); + rt2800_bbp_glrt_write(rt2x00dev, 167, 0x41); + rt2800_bbp_glrt_write(rt2x00dev, 168, 0x36); + rt2800_bbp_glrt_write(rt2x00dev, 169, 0x39); + rt2800_bbp_glrt_write(rt2x00dev, 170, 0x30); + rt2800_bbp_glrt_write(rt2x00dev, 171, 0x30); + rt2800_bbp_glrt_write(rt2x00dev, 172, 0x0E); + rt2800_bbp_glrt_write(rt2x00dev, 173, 0x0D); + rt2800_bbp_glrt_write(rt2x00dev, 174, 0x28); + rt2800_bbp_glrt_write(rt2x00dev, 175, 0x21); + rt2800_bbp_glrt_write(rt2x00dev, 176, 0x1C); + rt2800_bbp_glrt_write(rt2x00dev, 177, 0x16); + rt2800_bbp_glrt_write(rt2x00dev, 178, 0x50); + rt2800_bbp_glrt_write(rt2x00dev, 179, 0x4A); + rt2800_bbp_glrt_write(rt2x00dev, 180, 0x43); + rt2800_bbp_glrt_write(rt2x00dev, 181, 0x50); + rt2800_bbp_glrt_write(rt2x00dev, 182, 0x10); + rt2800_bbp_glrt_write(rt2x00dev, 183, 0x10); + rt2800_bbp_glrt_write(rt2x00dev, 184, 0x10); + rt2800_bbp_glrt_write(rt2x00dev, 185, 0x10); + rt2800_bbp_glrt_write(rt2x00dev, 200, 0x7D); + rt2800_bbp_glrt_write(rt2x00dev, 201, 0x14); + rt2800_bbp_glrt_write(rt2x00dev, 202, 0x32); + rt2800_bbp_glrt_write(rt2x00dev, 203, 0x2C); + rt2800_bbp_glrt_write(rt2x00dev, 204, 0x36); + rt2800_bbp_glrt_write(rt2x00dev, 205, 0x4C); + rt2800_bbp_glrt_write(rt2x00dev, 206, 0x43); + rt2800_bbp_glrt_write(rt2x00dev, 207, 0x2C); + rt2800_bbp_glrt_write(rt2x00dev, 208, 0x2E); + rt2800_bbp_glrt_write(rt2x00dev, 209, 0x36); + rt2800_bbp_glrt_write(rt2x00dev, 210, 0x30); + rt2800_bbp_glrt_write(rt2x00dev, 211, 0x6E); + + /* BBP for G band DCOC function */ + rt2800_bbp_dcoc_write(rt2x00dev, 140, 0x0C); + rt2800_bbp_dcoc_write(rt2x00dev, 141, 0x00); + rt2800_bbp_dcoc_write(rt2x00dev, 142, 0x10); + rt2800_bbp_dcoc_write(rt2x00dev, 143, 0x10); + rt2800_bbp_dcoc_write(rt2x00dev, 144, 0x10); + rt2800_bbp_dcoc_write(rt2x00dev, 145, 0x10); + rt2800_bbp_dcoc_write(rt2x00dev, 146, 0x08); + rt2800_bbp_dcoc_write(rt2x00dev, 147, 0x40); + rt2800_bbp_dcoc_write(rt2x00dev, 148, 0x04); + rt2800_bbp_dcoc_write(rt2x00dev, 149, 0x04); + rt2800_bbp_dcoc_write(rt2x00dev, 150, 0x08); + rt2800_bbp_dcoc_write(rt2x00dev, 151, 0x08); + rt2800_bbp_dcoc_write(rt2x00dev, 152, 0x03); + rt2800_bbp_dcoc_write(rt2x00dev, 153, 0x03); + rt2800_bbp_dcoc_write(rt2x00dev, 154, 0x03); + rt2800_bbp_dcoc_write(rt2x00dev, 155, 0x02); + rt2800_bbp_dcoc_write(rt2x00dev, 156, 0x40); + rt2800_bbp_dcoc_write(rt2x00dev, 157, 0x40); + rt2800_bbp_dcoc_write(rt2x00dev, 158, 0x64); + rt2800_bbp_dcoc_write(rt2x00dev, 159, 0x64); + + rt2800_bbp4_mac_if_ctrl(rt2x00dev); +} + +static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) +{ + unsigned int i; + u16 eeprom; + u8 reg_id; + u8 value; + + if (rt2800_is_305x_soc(rt2x00dev)) + rt2800_init_bbp_305x_soc(rt2x00dev); + + switch (rt2x00dev->chip.rt) { + case RT2860: + case RT2872: + case RT2883: + rt2800_init_bbp_28xx(rt2x00dev); + break; + case RT3070: + case RT3071: + case RT3090: + rt2800_init_bbp_30xx(rt2x00dev); + break; + case RT3290: + rt2800_init_bbp_3290(rt2x00dev); + break; + case RT3352: + case RT5350: + rt2800_init_bbp_3352(rt2x00dev); + break; + case RT3390: + rt2800_init_bbp_3390(rt2x00dev); + break; + case RT3572: + rt2800_init_bbp_3572(rt2x00dev); + break; + case RT3593: + rt2800_init_bbp_3593(rt2x00dev); + return; + case RT3883: + rt2800_init_bbp_3883(rt2x00dev); + return; + case RT5390: + case RT5392: + rt2800_init_bbp_53xx(rt2x00dev); + break; + case RT5592: + rt2800_init_bbp_5592(rt2x00dev); + return; + case RT6352: + rt2800_init_bbp_6352(rt2x00dev); + break; + } + + for (i = 0; i < EEPROM_BBP_SIZE; i++) { + eeprom = rt2800_eeprom_read_from_array(rt2x00dev, + EEPROM_BBP_START, i); + + if (eeprom != 0xffff && eeprom != 0x0000) { + reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID); + value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE); + rt2800_bbp_write(rt2x00dev, reg_id, value); + } + } +} + +static void rt2800_led_open_drain_enable(struct rt2x00_dev *rt2x00dev) +{ + u32 reg; + + reg = rt2800_register_read(rt2x00dev, OPT_14_CSR); + rt2x00_set_field32(®, OPT_14_CSR_BIT0, 1); + rt2800_register_write(rt2x00dev, OPT_14_CSR, reg); +} + +static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev, bool bw40, + u8 filter_target) +{ + unsigned int i; + u8 bbp; + u8 rfcsr; + u8 passband; + u8 stopband; + u8 overtuned = 0; + u8 rfcsr24 = (bw40) ? 0x27 : 0x07; + + rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24); + + bbp = rt2800_bbp_read(rt2x00dev, 4); + rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * bw40); + rt2800_bbp_write(rt2x00dev, 4, bbp); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 31); + rt2x00_set_field8(&rfcsr, RFCSR31_RX_H20M, bw40); + rt2800_rfcsr_write(rt2x00dev, 31, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 22); + rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 1); + rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); + + /* + * Set power & frequency of passband test tone + */ + rt2800_bbp_write(rt2x00dev, 24, 0); + + for (i = 0; i < 100; i++) { + rt2800_bbp_write(rt2x00dev, 25, 0x90); + msleep(1); + + passband = rt2800_bbp_read(rt2x00dev, 55); + if (passband) + break; + } + + /* + * Set power & frequency of stopband test tone + */ + rt2800_bbp_write(rt2x00dev, 24, 0x06); + + for (i = 0; i < 100; i++) { + rt2800_bbp_write(rt2x00dev, 25, 0x90); + msleep(1); + + stopband = rt2800_bbp_read(rt2x00dev, 55); + + if ((passband - stopband) <= filter_target) { + rfcsr24++; + overtuned += ((passband - stopband) == filter_target); + } else + break; + + rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24); + } + + rfcsr24 -= !!overtuned; + + rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24); + return rfcsr24; +} + +static void rt2800_rf_init_calibration(struct rt2x00_dev *rt2x00dev, + const unsigned int rf_reg) +{ + u8 rfcsr; + + rfcsr = rt2800_rfcsr_read(rt2x00dev, rf_reg); + rt2x00_set_field8(&rfcsr, FIELD8(0x80), 1); + rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr); + msleep(1); + rt2x00_set_field8(&rfcsr, FIELD8(0x80), 0); + rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr); +} + +static void rt2800_rx_filter_calibration(struct rt2x00_dev *rt2x00dev) +{ + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; + u8 filter_tgt_bw20; + u8 filter_tgt_bw40; + u8 rfcsr, bbp; + + /* + * TODO: sync filter_tgt values with vendor driver + */ + if (rt2x00_rt(rt2x00dev, RT3070)) { + filter_tgt_bw20 = 0x16; + filter_tgt_bw40 = 0x19; + } else { + filter_tgt_bw20 = 0x13; + filter_tgt_bw40 = 0x15; + } + + drv_data->calibration_bw20 = + rt2800_init_rx_filter(rt2x00dev, false, filter_tgt_bw20); + drv_data->calibration_bw40 = + rt2800_init_rx_filter(rt2x00dev, true, filter_tgt_bw40); + + /* + * Save BBP 25 & 26 values for later use in channel switching (for 3052) + */ + drv_data->bbp25 = rt2800_bbp_read(rt2x00dev, 25); + drv_data->bbp26 = rt2800_bbp_read(rt2x00dev, 26); + + /* + * Set back to initial state + */ + rt2800_bbp_write(rt2x00dev, 24, 0); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 22); + rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 0); + rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); + + /* + * Set BBP back to BW20 + */ + bbp = rt2800_bbp_read(rt2x00dev, 4); + rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 0); + rt2800_bbp_write(rt2x00dev, 4, bbp); +} + +static void rt2800_normal_mode_setup_3xxx(struct rt2x00_dev *rt2x00dev) +{ + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; + u8 min_gain, rfcsr, bbp; + u16 eeprom; + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 17); + + rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0); + if (rt2x00_rt(rt2x00dev, RT3070) || + rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) || + rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E) || + rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) { + if (!rt2x00_has_cap_external_lna_bg(rt2x00dev)) + rt2x00_set_field8(&rfcsr, RFCSR17_R, 1); + } + + min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2; + if (drv_data->txmixer_gain_24g >= min_gain) { + rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN, + drv_data->txmixer_gain_24g); + } + + rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); + + if (rt2x00_rt(rt2x00dev, RT3090)) { + /* Turn off unused DAC1 and ADC1 to reduce power consumption */ + bbp = rt2800_bbp_read(rt2x00dev, 138); + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1) + rt2x00_set_field8(&bbp, BBP138_RX_ADC1, 0); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1) + rt2x00_set_field8(&bbp, BBP138_TX_DAC1, 1); + rt2800_bbp_write(rt2x00dev, 138, bbp); + } + + if (rt2x00_rt(rt2x00dev, RT3070)) { + rfcsr = rt2800_rfcsr_read(rt2x00dev, 27); + if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) + rt2x00_set_field8(&rfcsr, RFCSR27_R1, 3); + else + rt2x00_set_field8(&rfcsr, RFCSR27_R1, 0); + rt2x00_set_field8(&rfcsr, RFCSR27_R2, 0); + rt2x00_set_field8(&rfcsr, RFCSR27_R3, 0); + rt2x00_set_field8(&rfcsr, RFCSR27_R4, 0); + rt2800_rfcsr_write(rt2x00dev, 27, rfcsr); + } else if (rt2x00_rt(rt2x00dev, RT3071) || + rt2x00_rt(rt2x00dev, RT3090) || + rt2x00_rt(rt2x00dev, RT3390)) { + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 15); + rt2x00_set_field8(&rfcsr, RFCSR15_TX_LO2_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 15, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 20); + rt2x00_set_field8(&rfcsr, RFCSR20_RX_LO1_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); + rt2x00_set_field8(&rfcsr, RFCSR21_RX_LO2_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); + } +} + +static void rt2800_normal_mode_setup_3593(struct rt2x00_dev *rt2x00dev) +{ + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; + u8 rfcsr; + u8 tx_gain; + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 50); + rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO2_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 50, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 51); + tx_gain = rt2x00_get_field8(drv_data->txmixer_gain_24g, + RFCSR17_TXMIXER_GAIN); + rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, tx_gain); + rt2800_rfcsr_write(rt2x00dev, 51, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 38); + rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 38, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 39); + rt2x00_set_field8(&rfcsr, RFCSR39_RX_LO2_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 39, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); + rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2); + rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); + + /* TODO: enable stream mode */ +} + +static void rt2800_normal_mode_setup_5xxx(struct rt2x00_dev *rt2x00dev) +{ + u8 reg; + u16 eeprom; + + /* Turn off unused DAC1 and ADC1 to reduce power consumption */ + reg = rt2800_bbp_read(rt2x00dev, 138); + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1) + rt2x00_set_field8(®, BBP138_RX_ADC1, 0); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1) + rt2x00_set_field8(®, BBP138_TX_DAC1, 1); + rt2800_bbp_write(rt2x00dev, 138, reg); + + reg = rt2800_rfcsr_read(rt2x00dev, 38); + rt2x00_set_field8(®, RFCSR38_RX_LO1_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 38, reg); + + reg = rt2800_rfcsr_read(rt2x00dev, 39); + rt2x00_set_field8(®, RFCSR39_RX_LO2_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 39, reg); + + rt2800_bbp4_mac_if_ctrl(rt2x00dev); + + reg = rt2800_rfcsr_read(rt2x00dev, 30); + rt2x00_set_field8(®, RFCSR30_RX_VCM, 2); + rt2800_rfcsr_write(rt2x00dev, 30, reg); +} + +static void rt2800_init_rfcsr_305x_soc(struct rt2x00_dev *rt2x00dev) +{ + rt2800_rf_init_calibration(rt2x00dev, 30); + + rt2800_rfcsr_write(rt2x00dev, 0, 0x50); + rt2800_rfcsr_write(rt2x00dev, 1, 0x01); + rt2800_rfcsr_write(rt2x00dev, 2, 0xf7); + rt2800_rfcsr_write(rt2x00dev, 3, 0x75); + rt2800_rfcsr_write(rt2x00dev, 4, 0x40); + rt2800_rfcsr_write(rt2x00dev, 5, 0x03); + rt2800_rfcsr_write(rt2x00dev, 6, 0x02); + rt2800_rfcsr_write(rt2x00dev, 7, 0x50); + rt2800_rfcsr_write(rt2x00dev, 8, 0x39); + rt2800_rfcsr_write(rt2x00dev, 9, 0x0f); + rt2800_rfcsr_write(rt2x00dev, 10, 0x60); + rt2800_rfcsr_write(rt2x00dev, 11, 0x21); + rt2800_rfcsr_write(rt2x00dev, 12, 0x75); + rt2800_rfcsr_write(rt2x00dev, 13, 0x75); + rt2800_rfcsr_write(rt2x00dev, 14, 0x90); + rt2800_rfcsr_write(rt2x00dev, 15, 0x58); + rt2800_rfcsr_write(rt2x00dev, 16, 0xb3); + rt2800_rfcsr_write(rt2x00dev, 17, 0x92); + rt2800_rfcsr_write(rt2x00dev, 18, 0x2c); + rt2800_rfcsr_write(rt2x00dev, 19, 0x02); + rt2800_rfcsr_write(rt2x00dev, 20, 0xba); + rt2800_rfcsr_write(rt2x00dev, 21, 0xdb); + rt2800_rfcsr_write(rt2x00dev, 22, 0x00); + rt2800_rfcsr_write(rt2x00dev, 23, 0x31); + rt2800_rfcsr_write(rt2x00dev, 24, 0x08); + rt2800_rfcsr_write(rt2x00dev, 25, 0x01); + rt2800_rfcsr_write(rt2x00dev, 26, 0x25); + rt2800_rfcsr_write(rt2x00dev, 27, 0x23); + rt2800_rfcsr_write(rt2x00dev, 28, 0x13); + rt2800_rfcsr_write(rt2x00dev, 29, 0x83); + rt2800_rfcsr_write(rt2x00dev, 30, 0x00); + rt2800_rfcsr_write(rt2x00dev, 31, 0x00); +} + +static void rt2800_init_rfcsr_30xx(struct rt2x00_dev *rt2x00dev) +{ + u8 rfcsr; + u16 eeprom; + u32 reg; + + /* XXX vendor driver do this only for 3070 */ + rt2800_rf_init_calibration(rt2x00dev, 30); + + rt2800_rfcsr_write(rt2x00dev, 4, 0x40); + rt2800_rfcsr_write(rt2x00dev, 5, 0x03); + rt2800_rfcsr_write(rt2x00dev, 6, 0x02); + rt2800_rfcsr_write(rt2x00dev, 7, 0x60); + rt2800_rfcsr_write(rt2x00dev, 9, 0x0f); + rt2800_rfcsr_write(rt2x00dev, 10, 0x41); + rt2800_rfcsr_write(rt2x00dev, 11, 0x21); + rt2800_rfcsr_write(rt2x00dev, 12, 0x7b); + rt2800_rfcsr_write(rt2x00dev, 14, 0x90); + rt2800_rfcsr_write(rt2x00dev, 15, 0x58); + rt2800_rfcsr_write(rt2x00dev, 16, 0xb3); + rt2800_rfcsr_write(rt2x00dev, 17, 0x92); + rt2800_rfcsr_write(rt2x00dev, 18, 0x2c); + rt2800_rfcsr_write(rt2x00dev, 19, 0x02); + rt2800_rfcsr_write(rt2x00dev, 20, 0xba); + rt2800_rfcsr_write(rt2x00dev, 21, 0xdb); + rt2800_rfcsr_write(rt2x00dev, 24, 0x16); + rt2800_rfcsr_write(rt2x00dev, 25, 0x03); + rt2800_rfcsr_write(rt2x00dev, 29, 0x1f); + + if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) { + reg = rt2800_register_read(rt2x00dev, LDO_CFG0); + rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 3); + rt2800_register_write(rt2x00dev, LDO_CFG0, reg); + } else if (rt2x00_rt(rt2x00dev, RT3071) || + rt2x00_rt(rt2x00dev, RT3090)) { + rt2800_rfcsr_write(rt2x00dev, 31, 0x14); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); + rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1); + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + + reg = rt2800_register_read(rt2x00dev, LDO_CFG0); + rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); + if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) || + rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E)) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST)) + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 3); + else + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 0); + } + rt2800_register_write(rt2x00dev, LDO_CFG0, reg); + + reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH); + rt2x00_set_field32(®, GPIO_SWITCH_5, 0); + rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg); + } + + rt2800_rx_filter_calibration(rt2x00dev); + + if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F) || + rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) || + rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E)) + rt2800_rfcsr_write(rt2x00dev, 27, 0x03); + + rt2800_led_open_drain_enable(rt2x00dev); + rt2800_normal_mode_setup_3xxx(rt2x00dev); +} + +static void rt2800_init_rfcsr_3290(struct rt2x00_dev *rt2x00dev) +{ + u8 rfcsr; + + rt2800_rf_init_calibration(rt2x00dev, 2); + + rt2800_rfcsr_write(rt2x00dev, 1, 0x0f); + rt2800_rfcsr_write(rt2x00dev, 2, 0x80); + rt2800_rfcsr_write(rt2x00dev, 3, 0x08); + rt2800_rfcsr_write(rt2x00dev, 4, 0x00); + rt2800_rfcsr_write(rt2x00dev, 6, 0xa0); + rt2800_rfcsr_write(rt2x00dev, 8, 0xf3); + rt2800_rfcsr_write(rt2x00dev, 9, 0x02); + rt2800_rfcsr_write(rt2x00dev, 10, 0x53); + rt2800_rfcsr_write(rt2x00dev, 11, 0x4a); + rt2800_rfcsr_write(rt2x00dev, 12, 0x46); + rt2800_rfcsr_write(rt2x00dev, 13, 0x9f); + rt2800_rfcsr_write(rt2x00dev, 18, 0x02); + rt2800_rfcsr_write(rt2x00dev, 22, 0x20); + rt2800_rfcsr_write(rt2x00dev, 25, 0x83); + rt2800_rfcsr_write(rt2x00dev, 26, 0x82); + rt2800_rfcsr_write(rt2x00dev, 27, 0x09); + rt2800_rfcsr_write(rt2x00dev, 29, 0x10); + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x80); + rt2800_rfcsr_write(rt2x00dev, 33, 0x00); + rt2800_rfcsr_write(rt2x00dev, 34, 0x05); + rt2800_rfcsr_write(rt2x00dev, 35, 0x12); + rt2800_rfcsr_write(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write(rt2x00dev, 38, 0x85); + rt2800_rfcsr_write(rt2x00dev, 39, 0x1b); + rt2800_rfcsr_write(rt2x00dev, 40, 0x0b); + rt2800_rfcsr_write(rt2x00dev, 41, 0xbb); + rt2800_rfcsr_write(rt2x00dev, 42, 0xd5); + rt2800_rfcsr_write(rt2x00dev, 43, 0x7b); + rt2800_rfcsr_write(rt2x00dev, 44, 0x0e); + rt2800_rfcsr_write(rt2x00dev, 45, 0xa2); + rt2800_rfcsr_write(rt2x00dev, 46, 0x73); + rt2800_rfcsr_write(rt2x00dev, 47, 0x00); + rt2800_rfcsr_write(rt2x00dev, 48, 0x10); + rt2800_rfcsr_write(rt2x00dev, 49, 0x98); + rt2800_rfcsr_write(rt2x00dev, 52, 0x38); + rt2800_rfcsr_write(rt2x00dev, 53, 0x00); + rt2800_rfcsr_write(rt2x00dev, 54, 0x78); + rt2800_rfcsr_write(rt2x00dev, 55, 0x43); + rt2800_rfcsr_write(rt2x00dev, 56, 0x02); + rt2800_rfcsr_write(rt2x00dev, 57, 0x80); + rt2800_rfcsr_write(rt2x00dev, 58, 0x7f); + rt2800_rfcsr_write(rt2x00dev, 59, 0x09); + rt2800_rfcsr_write(rt2x00dev, 60, 0x45); + rt2800_rfcsr_write(rt2x00dev, 61, 0xc1); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 29); + rt2x00_set_field8(&rfcsr, RFCSR29_RSSI_GAIN, 3); + rt2800_rfcsr_write(rt2x00dev, 29, rfcsr); + + rt2800_led_open_drain_enable(rt2x00dev); + rt2800_normal_mode_setup_3xxx(rt2x00dev); +} + +static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev) +{ + int tx0_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX0, + &rt2x00dev->cap_flags); + int tx1_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX1, + &rt2x00dev->cap_flags); + u8 rfcsr; + + rt2800_rf_init_calibration(rt2x00dev, 30); + + rt2800_rfcsr_write(rt2x00dev, 0, 0xf0); + rt2800_rfcsr_write(rt2x00dev, 1, 0x23); + rt2800_rfcsr_write(rt2x00dev, 2, 0x50); + rt2800_rfcsr_write(rt2x00dev, 3, 0x18); + rt2800_rfcsr_write(rt2x00dev, 4, 0x00); + rt2800_rfcsr_write(rt2x00dev, 5, 0x00); + rt2800_rfcsr_write(rt2x00dev, 6, 0x33); + rt2800_rfcsr_write(rt2x00dev, 7, 0x00); + rt2800_rfcsr_write(rt2x00dev, 8, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 9, 0x02); + rt2800_rfcsr_write(rt2x00dev, 10, 0xd2); + rt2800_rfcsr_write(rt2x00dev, 11, 0x42); + rt2800_rfcsr_write(rt2x00dev, 12, 0x1c); + rt2800_rfcsr_write(rt2x00dev, 13, 0x00); + rt2800_rfcsr_write(rt2x00dev, 14, 0x5a); + rt2800_rfcsr_write(rt2x00dev, 15, 0x00); + rt2800_rfcsr_write(rt2x00dev, 16, 0x01); + rt2800_rfcsr_write(rt2x00dev, 18, 0x45); + rt2800_rfcsr_write(rt2x00dev, 19, 0x02); + rt2800_rfcsr_write(rt2x00dev, 20, 0x00); + rt2800_rfcsr_write(rt2x00dev, 21, 0x00); + rt2800_rfcsr_write(rt2x00dev, 22, 0x00); + rt2800_rfcsr_write(rt2x00dev, 23, 0x00); + rt2800_rfcsr_write(rt2x00dev, 24, 0x00); + rt2800_rfcsr_write(rt2x00dev, 25, 0x80); + rt2800_rfcsr_write(rt2x00dev, 26, 0x00); + rt2800_rfcsr_write(rt2x00dev, 27, 0x03); + rt2800_rfcsr_write(rt2x00dev, 28, 0x03); + rt2800_rfcsr_write(rt2x00dev, 29, 0x00); + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x80); + rt2800_rfcsr_write(rt2x00dev, 33, 0x00); + rfcsr = 0x01; + if (tx0_ext_pa) + rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1); + if (tx1_ext_pa) + rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1); + rt2800_rfcsr_write(rt2x00dev, 34, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 35, 0x03); + rt2800_rfcsr_write(rt2x00dev, 36, 0xbd); + rt2800_rfcsr_write(rt2x00dev, 37, 0x3c); + rt2800_rfcsr_write(rt2x00dev, 38, 0x5f); + rt2800_rfcsr_write(rt2x00dev, 39, 0xc5); + rt2800_rfcsr_write(rt2x00dev, 40, 0x33); + rfcsr = 0x52; + if (!tx0_ext_pa) { + rt2x00_set_field8(&rfcsr, RFCSR41_BIT1, 1); + rt2x00_set_field8(&rfcsr, RFCSR41_BIT4, 1); + } + rt2800_rfcsr_write(rt2x00dev, 41, rfcsr); + rfcsr = 0x52; + if (!tx1_ext_pa) { + rt2x00_set_field8(&rfcsr, RFCSR42_BIT1, 1); + rt2x00_set_field8(&rfcsr, RFCSR42_BIT4, 1); + } + rt2800_rfcsr_write(rt2x00dev, 42, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 43, 0xdb); + rt2800_rfcsr_write(rt2x00dev, 44, 0xdb); + rt2800_rfcsr_write(rt2x00dev, 45, 0xdb); + rt2800_rfcsr_write(rt2x00dev, 46, 0xdd); + rt2800_rfcsr_write(rt2x00dev, 47, 0x0d); + rt2800_rfcsr_write(rt2x00dev, 48, 0x14); + rt2800_rfcsr_write(rt2x00dev, 49, 0x00); + rfcsr = 0x2d; + if (tx0_ext_pa) + rt2x00_set_field8(&rfcsr, RFCSR50_TX0_EXT_PA, 1); + if (tx1_ext_pa) + rt2x00_set_field8(&rfcsr, RFCSR50_TX1_EXT_PA, 1); + rt2800_rfcsr_write(rt2x00dev, 50, rfcsr); + rt2800_rfcsr_write(rt2x00dev, 51, (tx0_ext_pa ? 0x52 : 0x7f)); + rt2800_rfcsr_write(rt2x00dev, 52, (tx0_ext_pa ? 0xc0 : 0x00)); + rt2800_rfcsr_write(rt2x00dev, 53, (tx0_ext_pa ? 0xd2 : 0x52)); + rt2800_rfcsr_write(rt2x00dev, 54, (tx0_ext_pa ? 0xc0 : 0x1b)); + rt2800_rfcsr_write(rt2x00dev, 55, (tx1_ext_pa ? 0x52 : 0x7f)); + rt2800_rfcsr_write(rt2x00dev, 56, (tx1_ext_pa ? 0xc0 : 0x00)); + rt2800_rfcsr_write(rt2x00dev, 57, (tx0_ext_pa ? 0x49 : 0x52)); + rt2800_rfcsr_write(rt2x00dev, 58, (tx1_ext_pa ? 0xc0 : 0x1b)); + rt2800_rfcsr_write(rt2x00dev, 59, 0x00); + rt2800_rfcsr_write(rt2x00dev, 60, 0x00); + rt2800_rfcsr_write(rt2x00dev, 61, 0x00); + rt2800_rfcsr_write(rt2x00dev, 62, 0x00); + rt2800_rfcsr_write(rt2x00dev, 63, 0x00); + + rt2800_rx_filter_calibration(rt2x00dev); + rt2800_led_open_drain_enable(rt2x00dev); + rt2800_normal_mode_setup_3xxx(rt2x00dev); +} + +static void rt2800_init_rfcsr_3390(struct rt2x00_dev *rt2x00dev) +{ + u32 reg; + + rt2800_rf_init_calibration(rt2x00dev, 30); + + rt2800_rfcsr_write(rt2x00dev, 0, 0xa0); + rt2800_rfcsr_write(rt2x00dev, 1, 0xe1); + rt2800_rfcsr_write(rt2x00dev, 2, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 3, 0x62); + rt2800_rfcsr_write(rt2x00dev, 4, 0x40); + rt2800_rfcsr_write(rt2x00dev, 5, 0x8b); + rt2800_rfcsr_write(rt2x00dev, 6, 0x42); + rt2800_rfcsr_write(rt2x00dev, 7, 0x34); + rt2800_rfcsr_write(rt2x00dev, 8, 0x00); + rt2800_rfcsr_write(rt2x00dev, 9, 0xc0); + rt2800_rfcsr_write(rt2x00dev, 10, 0x61); + rt2800_rfcsr_write(rt2x00dev, 11, 0x21); + rt2800_rfcsr_write(rt2x00dev, 12, 0x3b); + rt2800_rfcsr_write(rt2x00dev, 13, 0xe0); + rt2800_rfcsr_write(rt2x00dev, 14, 0x90); + rt2800_rfcsr_write(rt2x00dev, 15, 0x53); + rt2800_rfcsr_write(rt2x00dev, 16, 0xe0); + rt2800_rfcsr_write(rt2x00dev, 17, 0x94); + rt2800_rfcsr_write(rt2x00dev, 18, 0x5c); + rt2800_rfcsr_write(rt2x00dev, 19, 0x4a); + rt2800_rfcsr_write(rt2x00dev, 20, 0xb2); + rt2800_rfcsr_write(rt2x00dev, 21, 0xf6); + rt2800_rfcsr_write(rt2x00dev, 22, 0x00); + rt2800_rfcsr_write(rt2x00dev, 23, 0x14); + rt2800_rfcsr_write(rt2x00dev, 24, 0x08); + rt2800_rfcsr_write(rt2x00dev, 25, 0x3d); + rt2800_rfcsr_write(rt2x00dev, 26, 0x85); + rt2800_rfcsr_write(rt2x00dev, 27, 0x00); + rt2800_rfcsr_write(rt2x00dev, 28, 0x41); + rt2800_rfcsr_write(rt2x00dev, 29, 0x8f); + rt2800_rfcsr_write(rt2x00dev, 30, 0x20); + rt2800_rfcsr_write(rt2x00dev, 31, 0x0f); + + reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH); + rt2x00_set_field32(®, GPIO_SWITCH_5, 0); + rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg); + + rt2800_rx_filter_calibration(rt2x00dev); + + if (rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) + rt2800_rfcsr_write(rt2x00dev, 27, 0x03); + + rt2800_led_open_drain_enable(rt2x00dev); + rt2800_normal_mode_setup_3xxx(rt2x00dev); +} + +static void rt2800_init_rfcsr_3572(struct rt2x00_dev *rt2x00dev) +{ + u8 rfcsr; + u32 reg; + + rt2800_rf_init_calibration(rt2x00dev, 30); + + rt2800_rfcsr_write(rt2x00dev, 0, 0x70); + rt2800_rfcsr_write(rt2x00dev, 1, 0x81); + rt2800_rfcsr_write(rt2x00dev, 2, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 3, 0x02); + rt2800_rfcsr_write(rt2x00dev, 4, 0x4c); + rt2800_rfcsr_write(rt2x00dev, 5, 0x05); + rt2800_rfcsr_write(rt2x00dev, 6, 0x4a); + rt2800_rfcsr_write(rt2x00dev, 7, 0xd8); + rt2800_rfcsr_write(rt2x00dev, 9, 0xc3); + rt2800_rfcsr_write(rt2x00dev, 10, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 11, 0xb9); + rt2800_rfcsr_write(rt2x00dev, 12, 0x70); + rt2800_rfcsr_write(rt2x00dev, 13, 0x65); + rt2800_rfcsr_write(rt2x00dev, 14, 0xa0); + rt2800_rfcsr_write(rt2x00dev, 15, 0x53); + rt2800_rfcsr_write(rt2x00dev, 16, 0x4c); + rt2800_rfcsr_write(rt2x00dev, 17, 0x23); + rt2800_rfcsr_write(rt2x00dev, 18, 0xac); + rt2800_rfcsr_write(rt2x00dev, 19, 0x93); + rt2800_rfcsr_write(rt2x00dev, 20, 0xb3); + rt2800_rfcsr_write(rt2x00dev, 21, 0xd0); + rt2800_rfcsr_write(rt2x00dev, 22, 0x00); + rt2800_rfcsr_write(rt2x00dev, 23, 0x3c); + rt2800_rfcsr_write(rt2x00dev, 24, 0x16); + rt2800_rfcsr_write(rt2x00dev, 25, 0x15); + rt2800_rfcsr_write(rt2x00dev, 26, 0x85); + rt2800_rfcsr_write(rt2x00dev, 27, 0x00); + rt2800_rfcsr_write(rt2x00dev, 28, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0x9b); + rt2800_rfcsr_write(rt2x00dev, 30, 0x09); + rt2800_rfcsr_write(rt2x00dev, 31, 0x10); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); + rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1); + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + + reg = rt2800_register_read(rt2x00dev, LDO_CFG0); + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 3); + rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); + rt2800_register_write(rt2x00dev, LDO_CFG0, reg); + msleep(1); + reg = rt2800_register_read(rt2x00dev, LDO_CFG0); + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 0); + rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); + rt2800_register_write(rt2x00dev, LDO_CFG0, reg); + + rt2800_rx_filter_calibration(rt2x00dev); + rt2800_led_open_drain_enable(rt2x00dev); + rt2800_normal_mode_setup_3xxx(rt2x00dev); +} + +static void rt3593_post_bbp_init(struct rt2x00_dev *rt2x00dev) +{ + u8 bbp; + bool txbf_enabled = false; /* FIXME */ + + bbp = rt2800_bbp_read(rt2x00dev, 105); + if (rt2x00dev->default_ant.rx_chain_num == 1) + rt2x00_set_field8(&bbp, BBP105_MLD, 0); + else + rt2x00_set_field8(&bbp, BBP105_MLD, 1); + rt2800_bbp_write(rt2x00dev, 105, bbp); + + rt2800_bbp4_mac_if_ctrl(rt2x00dev); + + rt2800_bbp_write(rt2x00dev, 92, 0x02); + rt2800_bbp_write(rt2x00dev, 82, 0x82); + rt2800_bbp_write(rt2x00dev, 106, 0x05); + rt2800_bbp_write(rt2x00dev, 104, 0x92); + rt2800_bbp_write(rt2x00dev, 88, 0x90); + rt2800_bbp_write(rt2x00dev, 148, 0xc8); + rt2800_bbp_write(rt2x00dev, 47, 0x48); + rt2800_bbp_write(rt2x00dev, 120, 0x50); + + if (txbf_enabled) + rt2800_bbp_write(rt2x00dev, 163, 0xbd); + else + rt2800_bbp_write(rt2x00dev, 163, 0x9d); + + /* SNR mapping */ + rt2800_bbp_write(rt2x00dev, 142, 6); + rt2800_bbp_write(rt2x00dev, 143, 160); + rt2800_bbp_write(rt2x00dev, 142, 7); + rt2800_bbp_write(rt2x00dev, 143, 161); + rt2800_bbp_write(rt2x00dev, 142, 8); + rt2800_bbp_write(rt2x00dev, 143, 162); + + /* ADC/DAC control */ + rt2800_bbp_write(rt2x00dev, 31, 0x08); + + /* RX AGC energy lower bound in log2 */ + rt2800_bbp_write(rt2x00dev, 68, 0x0b); + + /* FIXME: BBP 105 owerwrite? */ + rt2800_bbp_write(rt2x00dev, 105, 0x04); + +} + +static void rt2800_init_rfcsr_3593(struct rt2x00_dev *rt2x00dev) +{ + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; + u32 reg; + u8 rfcsr; + + /* Disable GPIO #4 and #7 function for LAN PE control */ + reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH); + rt2x00_set_field32(®, GPIO_SWITCH_4, 0); + rt2x00_set_field32(®, GPIO_SWITCH_7, 0); + rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg); + + /* Initialize default register values */ + rt2800_rfcsr_write(rt2x00dev, 1, 0x03); + rt2800_rfcsr_write(rt2x00dev, 3, 0x80); + rt2800_rfcsr_write(rt2x00dev, 5, 0x00); + rt2800_rfcsr_write(rt2x00dev, 6, 0x40); + rt2800_rfcsr_write(rt2x00dev, 8, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 9, 0x02); + rt2800_rfcsr_write(rt2x00dev, 10, 0xd3); + rt2800_rfcsr_write(rt2x00dev, 11, 0x40); + rt2800_rfcsr_write(rt2x00dev, 12, 0x4e); + rt2800_rfcsr_write(rt2x00dev, 13, 0x12); + rt2800_rfcsr_write(rt2x00dev, 18, 0x40); + rt2800_rfcsr_write(rt2x00dev, 22, 0x20); + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x78); + rt2800_rfcsr_write(rt2x00dev, 33, 0x3b); + rt2800_rfcsr_write(rt2x00dev, 34, 0x3c); + rt2800_rfcsr_write(rt2x00dev, 35, 0xe0); + rt2800_rfcsr_write(rt2x00dev, 38, 0x86); + rt2800_rfcsr_write(rt2x00dev, 39, 0x23); + rt2800_rfcsr_write(rt2x00dev, 44, 0xd3); + rt2800_rfcsr_write(rt2x00dev, 45, 0xbb); + rt2800_rfcsr_write(rt2x00dev, 46, 0x60); + rt2800_rfcsr_write(rt2x00dev, 49, 0x8e); + rt2800_rfcsr_write(rt2x00dev, 50, 0x86); + rt2800_rfcsr_write(rt2x00dev, 51, 0x75); + rt2800_rfcsr_write(rt2x00dev, 52, 0x45); + rt2800_rfcsr_write(rt2x00dev, 53, 0x18); + rt2800_rfcsr_write(rt2x00dev, 54, 0x18); + rt2800_rfcsr_write(rt2x00dev, 55, 0x18); + rt2800_rfcsr_write(rt2x00dev, 56, 0xdb); + rt2800_rfcsr_write(rt2x00dev, 57, 0x6e); + + /* Initiate calibration */ + /* TODO: use rt2800_rf_init_calibration ? */ + rfcsr = rt2800_rfcsr_read(rt2x00dev, 2); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); + + rt2800_freq_cal_mode1(rt2x00dev); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 18); + rt2x00_set_field8(&rfcsr, RFCSR18_XO_TUNE_BYPASS, 1); + rt2800_rfcsr_write(rt2x00dev, 18, rfcsr); + + reg = rt2800_register_read(rt2x00dev, LDO_CFG0); + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 3); + rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); + rt2800_register_write(rt2x00dev, LDO_CFG0, reg); + usleep_range(1000, 1500); + reg = rt2800_register_read(rt2x00dev, LDO_CFG0); + rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 0); + rt2800_register_write(rt2x00dev, LDO_CFG0, reg); + + /* Set initial values for RX filter calibration */ + drv_data->calibration_bw20 = 0x1f; + drv_data->calibration_bw40 = 0x2f; + + /* Save BBP 25 & 26 values for later use in channel switching */ + drv_data->bbp25 = rt2800_bbp_read(rt2x00dev, 25); + drv_data->bbp26 = rt2800_bbp_read(rt2x00dev, 26); + + rt2800_led_open_drain_enable(rt2x00dev); + rt2800_normal_mode_setup_3593(rt2x00dev); + + rt3593_post_bbp_init(rt2x00dev); + + /* TODO: enable stream mode support */ +} + +static void rt2800_init_rfcsr_5350(struct rt2x00_dev *rt2x00dev) +{ + rt2800_rfcsr_write(rt2x00dev, 0, 0xf0); + rt2800_rfcsr_write(rt2x00dev, 1, 0x23); + rt2800_rfcsr_write(rt2x00dev, 2, 0x50); + rt2800_rfcsr_write(rt2x00dev, 3, 0x08); + rt2800_rfcsr_write(rt2x00dev, 4, 0x49); + rt2800_rfcsr_write(rt2x00dev, 5, 0x10); + rt2800_rfcsr_write(rt2x00dev, 6, 0xe0); + rt2800_rfcsr_write(rt2x00dev, 7, 0x00); + rt2800_rfcsr_write(rt2x00dev, 8, 0xf1); + rt2800_rfcsr_write(rt2x00dev, 9, 0x02); + rt2800_rfcsr_write(rt2x00dev, 10, 0x53); + rt2800_rfcsr_write(rt2x00dev, 11, 0x4a); + rt2800_rfcsr_write(rt2x00dev, 12, 0x46); + if (rt2800_clk_is_20mhz(rt2x00dev)) + rt2800_rfcsr_write(rt2x00dev, 13, 0x1f); + else + rt2800_rfcsr_write(rt2x00dev, 13, 0x9f); + rt2800_rfcsr_write(rt2x00dev, 14, 0x00); + rt2800_rfcsr_write(rt2x00dev, 15, 0x00); + rt2800_rfcsr_write(rt2x00dev, 16, 0xc0); + rt2800_rfcsr_write(rt2x00dev, 18, 0x03); + rt2800_rfcsr_write(rt2x00dev, 19, 0x00); + rt2800_rfcsr_write(rt2x00dev, 20, 0x00); + rt2800_rfcsr_write(rt2x00dev, 21, 0x00); + rt2800_rfcsr_write(rt2x00dev, 22, 0x20); + rt2800_rfcsr_write(rt2x00dev, 23, 0x00); + rt2800_rfcsr_write(rt2x00dev, 24, 0x00); + rt2800_rfcsr_write(rt2x00dev, 25, 0x80); + rt2800_rfcsr_write(rt2x00dev, 26, 0x00); + rt2800_rfcsr_write(rt2x00dev, 27, 0x03); + rt2800_rfcsr_write(rt2x00dev, 28, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0xd0); + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x80); + rt2800_rfcsr_write(rt2x00dev, 33, 0x00); + rt2800_rfcsr_write(rt2x00dev, 34, 0x07); + rt2800_rfcsr_write(rt2x00dev, 35, 0x12); + rt2800_rfcsr_write(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write(rt2x00dev, 37, 0x08); + rt2800_rfcsr_write(rt2x00dev, 38, 0x85); + rt2800_rfcsr_write(rt2x00dev, 39, 0x1b); + rt2800_rfcsr_write(rt2x00dev, 40, 0x0b); + rt2800_rfcsr_write(rt2x00dev, 41, 0xbb); + rt2800_rfcsr_write(rt2x00dev, 42, 0xd5); + rt2800_rfcsr_write(rt2x00dev, 43, 0x9b); + rt2800_rfcsr_write(rt2x00dev, 44, 0x0c); + rt2800_rfcsr_write(rt2x00dev, 45, 0xa6); + rt2800_rfcsr_write(rt2x00dev, 46, 0x73); + rt2800_rfcsr_write(rt2x00dev, 47, 0x00); + rt2800_rfcsr_write(rt2x00dev, 48, 0x10); + rt2800_rfcsr_write(rt2x00dev, 49, 0x80); + rt2800_rfcsr_write(rt2x00dev, 50, 0x00); + rt2800_rfcsr_write(rt2x00dev, 51, 0x00); + rt2800_rfcsr_write(rt2x00dev, 52, 0x38); + rt2800_rfcsr_write(rt2x00dev, 53, 0x00); + rt2800_rfcsr_write(rt2x00dev, 54, 0x38); + rt2800_rfcsr_write(rt2x00dev, 55, 0x43); + rt2800_rfcsr_write(rt2x00dev, 56, 0x82); + rt2800_rfcsr_write(rt2x00dev, 57, 0x00); + rt2800_rfcsr_write(rt2x00dev, 58, 0x39); + rt2800_rfcsr_write(rt2x00dev, 59, 0x0b); + rt2800_rfcsr_write(rt2x00dev, 60, 0x45); + rt2800_rfcsr_write(rt2x00dev, 61, 0xd1); + rt2800_rfcsr_write(rt2x00dev, 62, 0x00); + rt2800_rfcsr_write(rt2x00dev, 63, 0x00); +} + +static void rt2800_init_rfcsr_3883(struct rt2x00_dev *rt2x00dev) +{ + u8 rfcsr; + + /* TODO: get the actual ECO value from the SoC */ + const unsigned int eco = 5; + + rt2800_rf_init_calibration(rt2x00dev, 2); + + rt2800_rfcsr_write(rt2x00dev, 0, 0xe0); + rt2800_rfcsr_write(rt2x00dev, 1, 0x03); + rt2800_rfcsr_write(rt2x00dev, 2, 0x50); + rt2800_rfcsr_write(rt2x00dev, 3, 0x20); + rt2800_rfcsr_write(rt2x00dev, 4, 0x00); + rt2800_rfcsr_write(rt2x00dev, 5, 0x00); + rt2800_rfcsr_write(rt2x00dev, 6, 0x40); + rt2800_rfcsr_write(rt2x00dev, 7, 0x00); + rt2800_rfcsr_write(rt2x00dev, 8, 0x5b); + rt2800_rfcsr_write(rt2x00dev, 9, 0x08); + rt2800_rfcsr_write(rt2x00dev, 10, 0xd3); + rt2800_rfcsr_write(rt2x00dev, 11, 0x48); + rt2800_rfcsr_write(rt2x00dev, 12, 0x1a); + rt2800_rfcsr_write(rt2x00dev, 13, 0x12); + rt2800_rfcsr_write(rt2x00dev, 14, 0x00); + rt2800_rfcsr_write(rt2x00dev, 15, 0x00); + rt2800_rfcsr_write(rt2x00dev, 16, 0x00); + + /* RFCSR 17 will be initialized later based on the + * frequency offset stored in the EEPROM + */ + + rt2800_rfcsr_write(rt2x00dev, 18, 0x40); + rt2800_rfcsr_write(rt2x00dev, 19, 0x00); + rt2800_rfcsr_write(rt2x00dev, 20, 0x00); + rt2800_rfcsr_write(rt2x00dev, 21, 0x00); + rt2800_rfcsr_write(rt2x00dev, 22, 0x20); + rt2800_rfcsr_write(rt2x00dev, 23, 0xc0); + rt2800_rfcsr_write(rt2x00dev, 24, 0x00); + rt2800_rfcsr_write(rt2x00dev, 25, 0x00); + rt2800_rfcsr_write(rt2x00dev, 26, 0x00); + rt2800_rfcsr_write(rt2x00dev, 27, 0x00); + rt2800_rfcsr_write(rt2x00dev, 28, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0x00); + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x80); + rt2800_rfcsr_write(rt2x00dev, 33, 0x00); + rt2800_rfcsr_write(rt2x00dev, 34, 0x20); + rt2800_rfcsr_write(rt2x00dev, 35, 0x00); + rt2800_rfcsr_write(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write(rt2x00dev, 37, 0x00); + rt2800_rfcsr_write(rt2x00dev, 38, 0x86); + rt2800_rfcsr_write(rt2x00dev, 39, 0x23); + rt2800_rfcsr_write(rt2x00dev, 40, 0x00); + rt2800_rfcsr_write(rt2x00dev, 41, 0x00); + rt2800_rfcsr_write(rt2x00dev, 42, 0x00); + rt2800_rfcsr_write(rt2x00dev, 43, 0x00); + rt2800_rfcsr_write(rt2x00dev, 44, 0x93); + rt2800_rfcsr_write(rt2x00dev, 45, 0xbb); + rt2800_rfcsr_write(rt2x00dev, 46, 0x60); + rt2800_rfcsr_write(rt2x00dev, 47, 0x00); + rt2800_rfcsr_write(rt2x00dev, 48, 0x00); + rt2800_rfcsr_write(rt2x00dev, 49, 0x8e); + rt2800_rfcsr_write(rt2x00dev, 50, 0x86); + rt2800_rfcsr_write(rt2x00dev, 51, 0x51); + rt2800_rfcsr_write(rt2x00dev, 52, 0x05); + rt2800_rfcsr_write(rt2x00dev, 53, 0x76); + rt2800_rfcsr_write(rt2x00dev, 54, 0x76); + rt2800_rfcsr_write(rt2x00dev, 55, 0x76); + rt2800_rfcsr_write(rt2x00dev, 56, 0xdb); + rt2800_rfcsr_write(rt2x00dev, 57, 0x3e); + rt2800_rfcsr_write(rt2x00dev, 58, 0x00); + rt2800_rfcsr_write(rt2x00dev, 59, 0x00); + rt2800_rfcsr_write(rt2x00dev, 60, 0x00); + rt2800_rfcsr_write(rt2x00dev, 61, 0x00); + rt2800_rfcsr_write(rt2x00dev, 62, 0x00); + rt2800_rfcsr_write(rt2x00dev, 63, 0x00); + + /* TODO: rx filter calibration? */ + + rt2800_bbp_write(rt2x00dev, 137, 0x0f); + + rt2800_bbp_write(rt2x00dev, 163, 0x9d); + + rt2800_bbp_write(rt2x00dev, 105, 0x05); + + rt2800_bbp_write(rt2x00dev, 179, 0x02); + rt2800_bbp_write(rt2x00dev, 180, 0x00); + rt2800_bbp_write(rt2x00dev, 182, 0x40); + rt2800_bbp_write(rt2x00dev, 180, 0x01); + rt2800_bbp_write(rt2x00dev, 182, 0x9c); + + rt2800_bbp_write(rt2x00dev, 179, 0x00); + + rt2800_bbp_write(rt2x00dev, 142, 0x04); + rt2800_bbp_write(rt2x00dev, 143, 0x3b); + rt2800_bbp_write(rt2x00dev, 142, 0x06); + rt2800_bbp_write(rt2x00dev, 143, 0xa0); + rt2800_bbp_write(rt2x00dev, 142, 0x07); + rt2800_bbp_write(rt2x00dev, 143, 0xa1); + rt2800_bbp_write(rt2x00dev, 142, 0x08); + rt2800_bbp_write(rt2x00dev, 143, 0xa2); + rt2800_bbp_write(rt2x00dev, 148, 0xc8); + + if (eco == 5) { + rt2800_rfcsr_write(rt2x00dev, 32, 0xd8); + rt2800_rfcsr_write(rt2x00dev, 33, 0x32); + } + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 2); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_BP, 0); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); + msleep(1); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); + rfcsr |= 0xc0; + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 22); + rfcsr |= 0x20; + rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 46); + rfcsr |= 0x20; + rt2800_rfcsr_write(rt2x00dev, 46, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 20); + rfcsr &= ~0xee; + rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); +} + +static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) +{ + rt2800_rf_init_calibration(rt2x00dev, 2); + + rt2800_rfcsr_write(rt2x00dev, 1, 0x0f); + rt2800_rfcsr_write(rt2x00dev, 2, 0x80); + rt2800_rfcsr_write(rt2x00dev, 3, 0x88); + rt2800_rfcsr_write(rt2x00dev, 5, 0x10); + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) + rt2800_rfcsr_write(rt2x00dev, 6, 0xe0); + else + rt2800_rfcsr_write(rt2x00dev, 6, 0xa0); + rt2800_rfcsr_write(rt2x00dev, 7, 0x00); + rt2800_rfcsr_write(rt2x00dev, 10, 0x53); + rt2800_rfcsr_write(rt2x00dev, 11, 0x4a); + rt2800_rfcsr_write(rt2x00dev, 12, 0x46); + rt2800_rfcsr_write(rt2x00dev, 13, 0x9f); + rt2800_rfcsr_write(rt2x00dev, 14, 0x00); + rt2800_rfcsr_write(rt2x00dev, 15, 0x00); + rt2800_rfcsr_write(rt2x00dev, 16, 0x00); + rt2800_rfcsr_write(rt2x00dev, 18, 0x03); + rt2800_rfcsr_write(rt2x00dev, 19, 0x00); + + rt2800_rfcsr_write(rt2x00dev, 20, 0x00); + rt2800_rfcsr_write(rt2x00dev, 21, 0x00); + rt2800_rfcsr_write(rt2x00dev, 22, 0x20); + rt2800_rfcsr_write(rt2x00dev, 23, 0x00); + rt2800_rfcsr_write(rt2x00dev, 24, 0x00); + if (rt2x00_is_usb(rt2x00dev) && + rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) + rt2800_rfcsr_write(rt2x00dev, 25, 0x80); + else + rt2800_rfcsr_write(rt2x00dev, 25, 0xc0); + rt2800_rfcsr_write(rt2x00dev, 26, 0x00); + rt2800_rfcsr_write(rt2x00dev, 27, 0x09); + rt2800_rfcsr_write(rt2x00dev, 28, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0x10); + + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x80); + rt2800_rfcsr_write(rt2x00dev, 33, 0x00); + rt2800_rfcsr_write(rt2x00dev, 34, 0x07); + rt2800_rfcsr_write(rt2x00dev, 35, 0x12); + rt2800_rfcsr_write(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write(rt2x00dev, 37, 0x08); + rt2800_rfcsr_write(rt2x00dev, 38, 0x85); + rt2800_rfcsr_write(rt2x00dev, 39, 0x1b); + + rt2800_rfcsr_write(rt2x00dev, 40, 0x0b); + rt2800_rfcsr_write(rt2x00dev, 41, 0xbb); + rt2800_rfcsr_write(rt2x00dev, 42, 0xd2); + rt2800_rfcsr_write(rt2x00dev, 43, 0x9a); + rt2800_rfcsr_write(rt2x00dev, 44, 0x0e); + rt2800_rfcsr_write(rt2x00dev, 45, 0xa2); + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) + rt2800_rfcsr_write(rt2x00dev, 46, 0x73); + else + rt2800_rfcsr_write(rt2x00dev, 46, 0x7b); + rt2800_rfcsr_write(rt2x00dev, 47, 0x00); + rt2800_rfcsr_write(rt2x00dev, 48, 0x10); + rt2800_rfcsr_write(rt2x00dev, 49, 0x94); + + rt2800_rfcsr_write(rt2x00dev, 52, 0x38); + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) + rt2800_rfcsr_write(rt2x00dev, 53, 0x00); + else + rt2800_rfcsr_write(rt2x00dev, 53, 0x84); + rt2800_rfcsr_write(rt2x00dev, 54, 0x78); + rt2800_rfcsr_write(rt2x00dev, 55, 0x44); + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) + rt2800_rfcsr_write(rt2x00dev, 56, 0x42); + else + rt2800_rfcsr_write(rt2x00dev, 56, 0x22); + rt2800_rfcsr_write(rt2x00dev, 57, 0x80); + rt2800_rfcsr_write(rt2x00dev, 58, 0x7f); + rt2800_rfcsr_write(rt2x00dev, 59, 0x8f); + + rt2800_rfcsr_write(rt2x00dev, 60, 0x45); + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) { + if (rt2x00_is_usb(rt2x00dev)) + rt2800_rfcsr_write(rt2x00dev, 61, 0xd1); + else + rt2800_rfcsr_write(rt2x00dev, 61, 0xd5); + } else { + if (rt2x00_is_usb(rt2x00dev)) + rt2800_rfcsr_write(rt2x00dev, 61, 0xdd); + else + rt2800_rfcsr_write(rt2x00dev, 61, 0xb5); + } + rt2800_rfcsr_write(rt2x00dev, 62, 0x00); + rt2800_rfcsr_write(rt2x00dev, 63, 0x00); + + rt2800_normal_mode_setup_5xxx(rt2x00dev); + + rt2800_led_open_drain_enable(rt2x00dev); +} + +static void rt2800_init_rfcsr_5392(struct rt2x00_dev *rt2x00dev) +{ + rt2800_rf_init_calibration(rt2x00dev, 2); + + rt2800_rfcsr_write(rt2x00dev, 1, 0x17); + rt2800_rfcsr_write(rt2x00dev, 3, 0x88); + rt2800_rfcsr_write(rt2x00dev, 5, 0x10); + rt2800_rfcsr_write(rt2x00dev, 6, 0xe0); + rt2800_rfcsr_write(rt2x00dev, 7, 0x00); + rt2800_rfcsr_write(rt2x00dev, 10, 0x53); + rt2800_rfcsr_write(rt2x00dev, 11, 0x4a); + rt2800_rfcsr_write(rt2x00dev, 12, 0x46); + rt2800_rfcsr_write(rt2x00dev, 13, 0x9f); + rt2800_rfcsr_write(rt2x00dev, 14, 0x00); + rt2800_rfcsr_write(rt2x00dev, 15, 0x00); + rt2800_rfcsr_write(rt2x00dev, 16, 0x00); + rt2800_rfcsr_write(rt2x00dev, 18, 0x03); + rt2800_rfcsr_write(rt2x00dev, 19, 0x4d); + rt2800_rfcsr_write(rt2x00dev, 20, 0x00); + rt2800_rfcsr_write(rt2x00dev, 21, 0x8d); + rt2800_rfcsr_write(rt2x00dev, 22, 0x20); + rt2800_rfcsr_write(rt2x00dev, 23, 0x0b); + rt2800_rfcsr_write(rt2x00dev, 24, 0x44); + rt2800_rfcsr_write(rt2x00dev, 25, 0x80); + rt2800_rfcsr_write(rt2x00dev, 26, 0x82); + rt2800_rfcsr_write(rt2x00dev, 27, 0x09); + rt2800_rfcsr_write(rt2x00dev, 28, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0x10); + rt2800_rfcsr_write(rt2x00dev, 30, 0x10); + rt2800_rfcsr_write(rt2x00dev, 31, 0x80); + rt2800_rfcsr_write(rt2x00dev, 32, 0x20); + rt2800_rfcsr_write(rt2x00dev, 33, 0xC0); + rt2800_rfcsr_write(rt2x00dev, 34, 0x07); + rt2800_rfcsr_write(rt2x00dev, 35, 0x12); + rt2800_rfcsr_write(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write(rt2x00dev, 37, 0x08); + rt2800_rfcsr_write(rt2x00dev, 38, 0x89); + rt2800_rfcsr_write(rt2x00dev, 39, 0x1b); + rt2800_rfcsr_write(rt2x00dev, 40, 0x0f); + rt2800_rfcsr_write(rt2x00dev, 41, 0xbb); + rt2800_rfcsr_write(rt2x00dev, 42, 0xd5); + rt2800_rfcsr_write(rt2x00dev, 43, 0x9b); + rt2800_rfcsr_write(rt2x00dev, 44, 0x0e); + rt2800_rfcsr_write(rt2x00dev, 45, 0xa2); + rt2800_rfcsr_write(rt2x00dev, 46, 0x73); + rt2800_rfcsr_write(rt2x00dev, 47, 0x0c); + rt2800_rfcsr_write(rt2x00dev, 48, 0x10); + rt2800_rfcsr_write(rt2x00dev, 49, 0x94); + rt2800_rfcsr_write(rt2x00dev, 50, 0x94); + rt2800_rfcsr_write(rt2x00dev, 51, 0x3a); + rt2800_rfcsr_write(rt2x00dev, 52, 0x48); + rt2800_rfcsr_write(rt2x00dev, 53, 0x44); + rt2800_rfcsr_write(rt2x00dev, 54, 0x38); + rt2800_rfcsr_write(rt2x00dev, 55, 0x43); + rt2800_rfcsr_write(rt2x00dev, 56, 0xa1); + rt2800_rfcsr_write(rt2x00dev, 57, 0x00); + rt2800_rfcsr_write(rt2x00dev, 58, 0x39); + rt2800_rfcsr_write(rt2x00dev, 59, 0x07); + rt2800_rfcsr_write(rt2x00dev, 60, 0x45); + rt2800_rfcsr_write(rt2x00dev, 61, 0x91); + rt2800_rfcsr_write(rt2x00dev, 62, 0x39); + rt2800_rfcsr_write(rt2x00dev, 63, 0x07); + + rt2800_normal_mode_setup_5xxx(rt2x00dev); + + rt2800_led_open_drain_enable(rt2x00dev); +} + +static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev) +{ + rt2800_rf_init_calibration(rt2x00dev, 30); + + rt2800_rfcsr_write(rt2x00dev, 1, 0x3F); + rt2800_rfcsr_write(rt2x00dev, 3, 0x08); + rt2800_rfcsr_write(rt2x00dev, 5, 0x10); + rt2800_rfcsr_write(rt2x00dev, 6, 0xE4); + rt2800_rfcsr_write(rt2x00dev, 7, 0x00); + rt2800_rfcsr_write(rt2x00dev, 14, 0x00); + rt2800_rfcsr_write(rt2x00dev, 15, 0x00); + rt2800_rfcsr_write(rt2x00dev, 16, 0x00); + rt2800_rfcsr_write(rt2x00dev, 18, 0x03); + rt2800_rfcsr_write(rt2x00dev, 19, 0x4D); + rt2800_rfcsr_write(rt2x00dev, 20, 0x10); + rt2800_rfcsr_write(rt2x00dev, 21, 0x8D); + rt2800_rfcsr_write(rt2x00dev, 26, 0x82); + rt2800_rfcsr_write(rt2x00dev, 28, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0x10); + rt2800_rfcsr_write(rt2x00dev, 33, 0xC0); + rt2800_rfcsr_write(rt2x00dev, 34, 0x07); + rt2800_rfcsr_write(rt2x00dev, 35, 0x12); + rt2800_rfcsr_write(rt2x00dev, 47, 0x0C); + rt2800_rfcsr_write(rt2x00dev, 53, 0x22); + rt2800_rfcsr_write(rt2x00dev, 63, 0x07); + + rt2800_rfcsr_write(rt2x00dev, 2, 0x80); + msleep(1); + + rt2800_freq_cal_mode1(rt2x00dev); + + /* Enable DC filter */ + if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + + rt2800_normal_mode_setup_5xxx(rt2x00dev); + + if (rt2x00_rt_rev_lt(rt2x00dev, RT5592, REV_RT5592C)) + rt2800_rfcsr_write(rt2x00dev, 27, 0x03); + + rt2800_led_open_drain_enable(rt2x00dev); +} + +static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, + bool set_bw, bool is_ht40) +{ + u8 bbp_val; + + bbp_val = rt2800_bbp_read(rt2x00dev, 21); + bbp_val |= 0x1; + rt2800_bbp_write(rt2x00dev, 21, bbp_val); + usleep_range(100, 200); + + if (set_bw) { + bbp_val = rt2800_bbp_read(rt2x00dev, 4); + rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, 2 * is_ht40); + rt2800_bbp_write(rt2x00dev, 4, bbp_val); + usleep_range(100, 200); + } + + bbp_val = rt2800_bbp_read(rt2x00dev, 21); + bbp_val &= (~0x1); + rt2800_bbp_write(rt2x00dev, 21, bbp_val); + usleep_range(100, 200); +} + +static int rt2800_rf_lp_config(struct rt2x00_dev *rt2x00dev, bool btxcal) +{ + u8 rf_val; + + if (btxcal) + rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04); + else + rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x02); + + rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x06); + + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 17); + rf_val |= 0x80; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, rf_val); + + if (btxcal) { + rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xC1); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x20); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3); + rf_val &= (~0x3F); + rf_val |= 0x3F; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4); + rf_val &= (~0x3F); + rf_val |= 0x3F; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, 0x31); + } else { + rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xF1); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x18); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3); + rf_val &= (~0x3F); + rf_val |= 0x34; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4); + rf_val &= (~0x3F); + rf_val |= 0x34; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val); + } + + return 0; +} + +static char rt2800_lp_tx_filter_bw_cal(struct rt2x00_dev *rt2x00dev) +{ + unsigned int cnt; + u8 bbp_val; + char cal_val; + + rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x82); + + cnt = 0; + do { + usleep_range(500, 2000); + bbp_val = rt2800_bbp_read(rt2x00dev, 159); + if (bbp_val == 0x02 || cnt == 20) + break; + + cnt++; + } while (cnt < 20); + + bbp_val = rt2800_bbp_dcoc_read(rt2x00dev, 0x39); + cal_val = bbp_val & 0x7F; + if (cal_val >= 0x40) + cal_val -= 128; + + return cal_val; +} + +static void rt2800_bw_filter_calibration(struct rt2x00_dev *rt2x00dev, + bool btxcal) +{ + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; + u8 tx_agc_fc = 0, rx_agc_fc = 0, cmm_agc_fc; + u8 filter_target; + u8 tx_filter_target_20m = 0x09, tx_filter_target_40m = 0x02; + u8 rx_filter_target_20m = 0x27, rx_filter_target_40m = 0x31; + int loop = 0, is_ht40, cnt; + u8 bbp_val, rf_val; + char cal_r32_init, cal_r32_val, cal_diff; + u8 saverfb5r00, saverfb5r01, saverfb5r03, saverfb5r04, saverfb5r05; + u8 saverfb5r06, saverfb5r07; + u8 saverfb5r08, saverfb5r17, saverfb5r18, saverfb5r19, saverfb5r20; + u8 saverfb5r37, saverfb5r38, saverfb5r39, saverfb5r40, saverfb5r41; + u8 saverfb5r42, saverfb5r43, saverfb5r44, saverfb5r45, saverfb5r46; + u8 saverfb5r58, saverfb5r59; + u8 savebbp159r0, savebbp159r2, savebbpr23; + u32 MAC_RF_CONTROL0, MAC_RF_BYPASS0; + + /* Save MAC registers */ + MAC_RF_CONTROL0 = rt2800_register_read(rt2x00dev, RF_CONTROL0); + MAC_RF_BYPASS0 = rt2800_register_read(rt2x00dev, RF_BYPASS0); + + /* save BBP registers */ + savebbpr23 = rt2800_bbp_read(rt2x00dev, 23); + + savebbp159r0 = rt2800_bbp_dcoc_read(rt2x00dev, 0); + savebbp159r2 = rt2800_bbp_dcoc_read(rt2x00dev, 2); + + /* Save RF registers */ + saverfb5r00 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0); + saverfb5r01 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1); + saverfb5r03 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3); + saverfb5r04 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4); + saverfb5r05 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 5); + saverfb5r06 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6); + saverfb5r07 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7); + saverfb5r08 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 8); + saverfb5r17 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 17); + saverfb5r18 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 18); + saverfb5r19 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 19); + saverfb5r20 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 20); + + saverfb5r37 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 37); + saverfb5r38 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 38); + saverfb5r39 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 39); + saverfb5r40 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 40); + saverfb5r41 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 41); + saverfb5r42 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 42); + saverfb5r43 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 43); + saverfb5r44 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 44); + saverfb5r45 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 45); + saverfb5r46 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 46); + + saverfb5r58 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58); + saverfb5r59 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59); + + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0); + rf_val |= 0x3; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val); + + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1); + rf_val |= 0x1; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rf_val); + + cnt = 0; + do { + usleep_range(500, 2000); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1); + if (((rf_val & 0x1) == 0x00) || (cnt == 40)) + break; + cnt++; + } while (cnt < 40); + + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0); + rf_val &= (~0x3); + rf_val |= 0x1; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val); + + /* I-3 */ + bbp_val = rt2800_bbp_read(rt2x00dev, 23); + bbp_val &= (~0x1F); + bbp_val |= 0x10; + rt2800_bbp_write(rt2x00dev, 23, bbp_val); + + do { + /* I-4,5,6,7,8,9 */ + if (loop == 0) { + is_ht40 = false; + + if (btxcal) + filter_target = tx_filter_target_20m; + else + filter_target = rx_filter_target_20m; + } else { + is_ht40 = true; + + if (btxcal) + filter_target = tx_filter_target_40m; + else + filter_target = rx_filter_target_40m; + } + + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 8); + rf_val &= (~0x04); + if (loop == 1) + rf_val |= 0x4; + + rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, rf_val); + + rt2800_bbp_core_soft_reset(rt2x00dev, true, is_ht40); + + rt2800_rf_lp_config(rt2x00dev, btxcal); + if (btxcal) { + tx_agc_fc = 0; + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58); + rf_val &= (~0x7F); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59); + rf_val &= (~0x7F); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val); + } else { + rx_agc_fc = 0; + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6); + rf_val &= (~0x7F); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7); + rf_val &= (~0x7F); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val); + } + + usleep_range(1000, 2000); + + bbp_val = rt2800_bbp_dcoc_read(rt2x00dev, 2); + bbp_val &= (~0x6); + rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val); + + rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40); + + cal_r32_init = rt2800_lp_tx_filter_bw_cal(rt2x00dev); + + bbp_val = rt2800_bbp_dcoc_read(rt2x00dev, 2); + bbp_val |= 0x6; + rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val); +do_cal: + if (btxcal) { + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58); + rf_val &= (~0x7F); + rf_val |= tx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59); + rf_val &= (~0x7F); + rf_val |= tx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val); + } else { + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6); + rf_val &= (~0x7F); + rf_val |= rx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val); + rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7); + rf_val &= (~0x7F); + rf_val |= rx_agc_fc; + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val); + } + + usleep_range(500, 1000); + + rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40); + + cal_r32_val = rt2800_lp_tx_filter_bw_cal(rt2x00dev); + + cal_diff = cal_r32_init - cal_r32_val; + + if (btxcal) + cmm_agc_fc = tx_agc_fc; + else + cmm_agc_fc = rx_agc_fc; + + if (((cal_diff > filter_target) && (cmm_agc_fc == 0)) || + ((cal_diff < filter_target) && (cmm_agc_fc == 0x3f))) { + if (btxcal) + tx_agc_fc = 0; + else + rx_agc_fc = 0; + } else if ((cal_diff <= filter_target) && (cmm_agc_fc < 0x3f)) { + if (btxcal) + tx_agc_fc++; + else + rx_agc_fc++; + goto do_cal; + } + + if (btxcal) { + if (loop == 0) + drv_data->tx_calibration_bw20 = tx_agc_fc; + else + drv_data->tx_calibration_bw40 = tx_agc_fc; + } else { + if (loop == 0) + drv_data->rx_calibration_bw20 = rx_agc_fc; + else + drv_data->rx_calibration_bw40 = rx_agc_fc; + } + + loop++; + } while (loop <= 1); + + rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, saverfb5r00); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, saverfb5r01); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, saverfb5r03); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r04); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, saverfb5r05); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, saverfb5r06); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, saverfb5r07); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, saverfb5r08); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, saverfb5r17); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, saverfb5r18); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, saverfb5r19); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, saverfb5r20); + + rt2800_rfcsr_write_bank(rt2x00dev, 5, 37, saverfb5r37); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 38, saverfb5r38); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 39, saverfb5r39); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 40, saverfb5r40); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 41, saverfb5r41); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 42, saverfb5r42); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 43, saverfb5r43); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 44, saverfb5r44); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 45, saverfb5r45); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 46, saverfb5r46); + + rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, saverfb5r58); + rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, saverfb5r59); + + rt2800_bbp_write(rt2x00dev, 23, savebbpr23); + + rt2800_bbp_dcoc_write(rt2x00dev, 0, savebbp159r0); + rt2800_bbp_dcoc_write(rt2x00dev, 2, savebbp159r2); + + bbp_val = rt2800_bbp_read(rt2x00dev, 4); + rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, + 2 * test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)); + rt2800_bbp_write(rt2x00dev, 4, bbp_val); + + rt2800_register_write(rt2x00dev, RF_CONTROL0, MAC_RF_CONTROL0); + rt2800_register_write(rt2x00dev, RF_BYPASS0, MAC_RF_BYPASS0); +} + +static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev) +{ + /* Initialize RF central register to default value */ + rt2800_rfcsr_write(rt2x00dev, 0, 0x02); + rt2800_rfcsr_write(rt2x00dev, 1, 0x03); + rt2800_rfcsr_write(rt2x00dev, 2, 0x33); + rt2800_rfcsr_write(rt2x00dev, 3, 0xFF); + rt2800_rfcsr_write(rt2x00dev, 4, 0x0C); + rt2800_rfcsr_write(rt2x00dev, 5, 0x40); + rt2800_rfcsr_write(rt2x00dev, 6, 0x00); + rt2800_rfcsr_write(rt2x00dev, 7, 0x00); + rt2800_rfcsr_write(rt2x00dev, 8, 0x00); + rt2800_rfcsr_write(rt2x00dev, 9, 0x00); + rt2800_rfcsr_write(rt2x00dev, 10, 0x00); + rt2800_rfcsr_write(rt2x00dev, 11, 0x00); + rt2800_rfcsr_write(rt2x00dev, 12, rt2x00dev->freq_offset); + rt2800_rfcsr_write(rt2x00dev, 13, 0x00); + rt2800_rfcsr_write(rt2x00dev, 14, 0x40); + rt2800_rfcsr_write(rt2x00dev, 15, 0x22); + rt2800_rfcsr_write(rt2x00dev, 16, 0x4C); + rt2800_rfcsr_write(rt2x00dev, 17, 0x00); + rt2800_rfcsr_write(rt2x00dev, 18, 0x00); + rt2800_rfcsr_write(rt2x00dev, 19, 0x00); + rt2800_rfcsr_write(rt2x00dev, 20, 0xA0); + rt2800_rfcsr_write(rt2x00dev, 21, 0x12); + rt2800_rfcsr_write(rt2x00dev, 22, 0x07); + rt2800_rfcsr_write(rt2x00dev, 23, 0x13); + rt2800_rfcsr_write(rt2x00dev, 24, 0xFE); + rt2800_rfcsr_write(rt2x00dev, 25, 0x24); + rt2800_rfcsr_write(rt2x00dev, 26, 0x7A); + rt2800_rfcsr_write(rt2x00dev, 27, 0x00); + rt2800_rfcsr_write(rt2x00dev, 28, 0x00); + rt2800_rfcsr_write(rt2x00dev, 29, 0x05); + rt2800_rfcsr_write(rt2x00dev, 30, 0x00); + rt2800_rfcsr_write(rt2x00dev, 31, 0x00); + rt2800_rfcsr_write(rt2x00dev, 32, 0x00); + rt2800_rfcsr_write(rt2x00dev, 33, 0x00); + rt2800_rfcsr_write(rt2x00dev, 34, 0x00); + rt2800_rfcsr_write(rt2x00dev, 35, 0x00); + rt2800_rfcsr_write(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write(rt2x00dev, 37, 0x00); + rt2800_rfcsr_write(rt2x00dev, 38, 0x00); + rt2800_rfcsr_write(rt2x00dev, 39, 0x00); + rt2800_rfcsr_write(rt2x00dev, 40, 0x00); + rt2800_rfcsr_write(rt2x00dev, 41, 0xD0); + rt2800_rfcsr_write(rt2x00dev, 42, 0x5B); + rt2800_rfcsr_write(rt2x00dev, 43, 0x00); + + rt2800_rfcsr_write(rt2x00dev, 11, 0x21); + if (rt2800_clk_is_20mhz(rt2x00dev)) + rt2800_rfcsr_write(rt2x00dev, 13, 0x03); + else + rt2800_rfcsr_write(rt2x00dev, 13, 0x00); + rt2800_rfcsr_write(rt2x00dev, 14, 0x7C); + rt2800_rfcsr_write(rt2x00dev, 16, 0x80); + rt2800_rfcsr_write(rt2x00dev, 17, 0x99); + rt2800_rfcsr_write(rt2x00dev, 18, 0x99); + rt2800_rfcsr_write(rt2x00dev, 19, 0x09); + rt2800_rfcsr_write(rt2x00dev, 20, 0x50); + rt2800_rfcsr_write(rt2x00dev, 21, 0xB0); + rt2800_rfcsr_write(rt2x00dev, 22, 0x00); + rt2800_rfcsr_write(rt2x00dev, 23, 0x06); + rt2800_rfcsr_write(rt2x00dev, 24, 0x00); + rt2800_rfcsr_write(rt2x00dev, 25, 0x00); + rt2800_rfcsr_write(rt2x00dev, 26, 0x5D); + rt2800_rfcsr_write(rt2x00dev, 27, 0x00); + rt2800_rfcsr_write(rt2x00dev, 28, 0x61); + rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); + rt2800_rfcsr_write(rt2x00dev, 43, 0x02); + + rt2800_rfcsr_write(rt2x00dev, 28, 0x62); + rt2800_rfcsr_write(rt2x00dev, 29, 0xAD); + rt2800_rfcsr_write(rt2x00dev, 39, 0x80); + + /* Initialize RF channel register to default value */ + rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03); + rt2800_rfcsr_write_chanreg(rt2x00dev, 1, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 2, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 3, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 4, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 5, 0x08); + rt2800_rfcsr_write_chanreg(rt2x00dev, 6, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 7, 0x51); + rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x53); + rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x16); + rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x61); + rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); + rt2800_rfcsr_write_chanreg(rt2x00dev, 12, 0x22); + rt2800_rfcsr_write_chanreg(rt2x00dev, 13, 0x3D); + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); + rt2800_rfcsr_write_chanreg(rt2x00dev, 15, 0x13); + rt2800_rfcsr_write_chanreg(rt2x00dev, 16, 0x22); + rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x27); + rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x02); + rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); + rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x01); + rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x52); + rt2800_rfcsr_write_chanreg(rt2x00dev, 22, 0x80); + rt2800_rfcsr_write_chanreg(rt2x00dev, 23, 0xB3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 24, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 25, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 26, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 27, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x5C); + rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0x6B); + rt2800_rfcsr_write_chanreg(rt2x00dev, 30, 0x6B); + rt2800_rfcsr_write_chanreg(rt2x00dev, 31, 0x31); + rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x5D); + rt2800_rfcsr_write_chanreg(rt2x00dev, 33, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xE6); + rt2800_rfcsr_write_chanreg(rt2x00dev, 35, 0x55); + rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 37, 0xBB); + rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 39, 0xB3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 40, 0x03); + rt2800_rfcsr_write_chanreg(rt2x00dev, 41, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 42, 0x00); + rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xB3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xD3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); + rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x07); + rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x68); + rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xEF); + rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1C); + rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x07); + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xA8); + rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0x85); + rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x10); + rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x07); + rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6A); + rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0x85); + rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x10); + rt2800_rfcsr_write_chanreg(rt2x00dev, 62, 0x1C); + rt2800_rfcsr_write_chanreg(rt2x00dev, 63, 0x00); + + rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5); + + rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47); + rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71); + rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x33); + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x0E); + rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23); + rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA4); + rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x02); + rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x12); + rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x1C); + rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0xEB); + rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x7D); + rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xD6); + rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x08); + rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB4); + rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); + rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); + rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67); + rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69); + rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF); + rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); + rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20); + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); + rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); + rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); + rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20); + rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); + rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); + rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); + + rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); + rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); + rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C); + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64); + rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51); + rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); + rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); + rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); + + rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); + rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); + rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); + rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); + rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); + + /* Initialize RF channel register for DRQFN */ + rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5); + rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28); + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68); + rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7); + rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02); + rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7); + + /* Initialize RF DC calibration register to default value */ + rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47); + rt2800_rfcsr_write_dccal(rt2x00dev, 1, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 2, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10); + rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10); + rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04); + rt2800_rfcsr_write_dccal(rt2x00dev, 9, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 10, 0x07); + rt2800_rfcsr_write_dccal(rt2x00dev, 11, 0x01); + rt2800_rfcsr_write_dccal(rt2x00dev, 12, 0x07); + rt2800_rfcsr_write_dccal(rt2x00dev, 13, 0x07); + rt2800_rfcsr_write_dccal(rt2x00dev, 14, 0x07); + rt2800_rfcsr_write_dccal(rt2x00dev, 15, 0x20); + rt2800_rfcsr_write_dccal(rt2x00dev, 16, 0x22); + rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 18, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 19, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 20, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 21, 0xF1); + rt2800_rfcsr_write_dccal(rt2x00dev, 22, 0x11); + rt2800_rfcsr_write_dccal(rt2x00dev, 23, 0x02); + rt2800_rfcsr_write_dccal(rt2x00dev, 24, 0x41); + rt2800_rfcsr_write_dccal(rt2x00dev, 25, 0x20); + rt2800_rfcsr_write_dccal(rt2x00dev, 26, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 27, 0xD7); + rt2800_rfcsr_write_dccal(rt2x00dev, 28, 0xA2); + rt2800_rfcsr_write_dccal(rt2x00dev, 29, 0x20); + rt2800_rfcsr_write_dccal(rt2x00dev, 30, 0x49); + rt2800_rfcsr_write_dccal(rt2x00dev, 31, 0x20); + rt2800_rfcsr_write_dccal(rt2x00dev, 32, 0x04); + rt2800_rfcsr_write_dccal(rt2x00dev, 33, 0xF1); + rt2800_rfcsr_write_dccal(rt2x00dev, 34, 0xA1); + rt2800_rfcsr_write_dccal(rt2x00dev, 35, 0x01); + rt2800_rfcsr_write_dccal(rt2x00dev, 41, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 42, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 43, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 44, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 45, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 46, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 47, 0x3E); + rt2800_rfcsr_write_dccal(rt2x00dev, 48, 0x3D); + rt2800_rfcsr_write_dccal(rt2x00dev, 49, 0x3E); + rt2800_rfcsr_write_dccal(rt2x00dev, 50, 0x3D); + rt2800_rfcsr_write_dccal(rt2x00dev, 51, 0x3E); + rt2800_rfcsr_write_dccal(rt2x00dev, 52, 0x3D); + rt2800_rfcsr_write_dccal(rt2x00dev, 53, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 54, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 55, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 56, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 57, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10); + rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10); + rt2800_rfcsr_write_dccal(rt2x00dev, 60, 0x0A); + rt2800_rfcsr_write_dccal(rt2x00dev, 61, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00); + + rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x08); + rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x04); + rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x20); + + rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); + rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); + + rt2800_bw_filter_calibration(rt2x00dev, true); + rt2800_bw_filter_calibration(rt2x00dev, false); +} + +static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) +{ + if (rt2800_is_305x_soc(rt2x00dev)) { + rt2800_init_rfcsr_305x_soc(rt2x00dev); + return; + } + + switch (rt2x00dev->chip.rt) { + case RT3070: + case RT3071: + case RT3090: + rt2800_init_rfcsr_30xx(rt2x00dev); + break; + case RT3290: + rt2800_init_rfcsr_3290(rt2x00dev); + break; + case RT3352: + rt2800_init_rfcsr_3352(rt2x00dev); + break; + case RT3390: + rt2800_init_rfcsr_3390(rt2x00dev); + break; + case RT3883: + rt2800_init_rfcsr_3883(rt2x00dev); + break; + case RT3572: + rt2800_init_rfcsr_3572(rt2x00dev); + break; + case RT3593: + rt2800_init_rfcsr_3593(rt2x00dev); + break; + case RT5350: + rt2800_init_rfcsr_5350(rt2x00dev); + break; + case RT5390: + rt2800_init_rfcsr_5390(rt2x00dev); + break; + case RT5392: + rt2800_init_rfcsr_5392(rt2x00dev); + break; + case RT5592: + rt2800_init_rfcsr_5592(rt2x00dev); + break; + case RT6352: + rt2800_init_rfcsr_6352(rt2x00dev); + break; + } +} + +int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev) { + u32 reg; + u16 word; + + /* + * Initialize MAC registers. + */ + if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) || + rt2800_init_registers(rt2x00dev))) + return -EIO; + + /* + * Wait BBP/RF to wake up. + */ + if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev))) + return -EIO; + + /* + * Send signal during boot time to initialize firmware. + */ + rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0); + rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); + if (rt2x00_is_usb(rt2x00dev)) + rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0); + rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0); + msleep(1); + + /* + * Make sure BBP is up and running. + */ + if (unlikely(rt2800_wait_bbp_ready(rt2x00dev))) + return -EIO; + + /* + * Initialize BBP/RF registers. + */ + rt2800_init_bbp(rt2x00dev); + rt2800_init_rfcsr(rt2x00dev); + + if (rt2x00_is_usb(rt2x00dev) && + (rt2x00_rt(rt2x00dev, RT3070) || + rt2x00_rt(rt2x00dev, RT3071) || + rt2x00_rt(rt2x00dev, RT3572))) { + usleep(200); + rt2800_mcu_request(rt2x00dev, MCU_CURRENT, 0, 0, 0); + usleep(10); + } + + /* + * Enable RX. + */ + reg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_TX, 1); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 0); + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); + + usleep(50); + + reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG); + rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 1); + rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 1); + rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1); + rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_TX, 1); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 1); + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); + + /* + * Initialize LED control + */ + word = rt2800_eeprom_read(rt2x00dev, EEPROM_LED_AG_CONF); + rt2800_mcu_request(rt2x00dev, MCU_LED_AG_CONF, 0xff, + word & 0xff, (word >> 8) & 0xff); + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_LED_ACT_CONF); + rt2800_mcu_request(rt2x00dev, MCU_LED_ACT_CONF, 0xff, + word & 0xff, (word >> 8) & 0xff); + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_LED_POLARITY); + rt2800_mcu_request(rt2x00dev, MCU_LED_LED_POLARITY, 0xff, + word & 0xff, (word >> 8) & 0xff); + + return 0; +} + +void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev) { + u32 reg; + + rt2800_disable_wpdma(rt2x00dev); + + /* Wait for DMA, ignore error */ + rt2800_wait_wpdma_ready(rt2x00dev); + + reg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_TX, 0); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 0); + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); +} + +int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev) +{ + u16 word; + u8 default_lna_gain; + int retval; + + /* + * Read the EEPROM. + */ + retval = rt2800_read_eeprom(rt2x00dev); + if (retval) + return retval; + + /* + * Start validation of the data that has been read. + */ + rt2x00dev->mac = rt2800_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0); + if (word == 0xffff) { + rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2); + rt2x00_set_field16(&word, EEPROM_NIC_CONF0_TXPATH, 1); + rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820); + rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word); + rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word); + } else if (rt2x00_rt(rt2x00dev, RT2860) || + rt2x00_rt(rt2x00dev, RT2872)) { + /* + * There is a max of 2 RX streams for RT28x0 series + */ + if (rt2x00_get_field16(word, EEPROM_NIC_CONF0_RXPATH) > 2) + rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2); + rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word); + } + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + if (word == 0xffff) { + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_HW_RADIO, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_TX_ALC, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_LNA_2G, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_LNA_5G, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_CARDBUS_ACCEL, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_SB_2G, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_SB_5G, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_WPS_PBC, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_2G, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_5G, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BROADBAND_EXT_LNA, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_ANT_DIVERSITY, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_INTERNAL_TX_ALC, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BT_COEXIST, 0); + rt2x00_set_field16(&word, EEPROM_NIC_CONF1_DAC_TEST, 0); + rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF1, word); + rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word); + } + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ); + if ((word & 0x00ff) == 0x00ff) { + rt2x00_set_field16(&word, EEPROM_FREQ_OFFSET, 0); + rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word); + rt2x00_eeprom_dbg(rt2x00dev, "Freq: 0x%04x\n", word); + } + if ((word & 0xff00) == 0xff00) { + rt2x00_set_field16(&word, EEPROM_FREQ_LED_MODE, + LED_MODE_TXRX_ACTIVITY); + rt2x00_set_field16(&word, EEPROM_FREQ_LED_POLARITY, 0); + rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word); + rt2800_eeprom_write(rt2x00dev, EEPROM_LED_AG_CONF, 0x5555); + rt2800_eeprom_write(rt2x00dev, EEPROM_LED_ACT_CONF, 0x2221); + rt2800_eeprom_write(rt2x00dev, EEPROM_LED_POLARITY, 0xa9f8); + rt2x00_eeprom_dbg(rt2x00dev, "Led Mode: 0x%04x\n", word); + } + + /* + * During the LNA validation we are going to use + * lna0 as correct value. Note that EEPROM_LNA + * is never validated. + */ + word = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA); + default_lna_gain = rt2x00_get_field16(word, EEPROM_LNA_A0); + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG); + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET0)) > 10) + rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET0, 0); + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET1)) > 10) + rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0); + rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word); + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2); + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10) + rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0); + if (!rt2x00_rt(rt2x00dev, RT3593) && + !rt2x00_rt(rt2x00dev, RT3883)) { + if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 || + rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff) + rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1, + default_lna_gain); + } + rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word); + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A); + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10) + rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0); + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET1)) > 10) + rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET1, 0); + rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A, word); + + word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2); + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10) + rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0); + if (!rt2x00_rt(rt2x00dev, RT3593) && + !rt2x00_rt(rt2x00dev, RT3883)) { + if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 || + rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff) + rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2, + default_lna_gain); + } + rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word); + + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { + word = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); + if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 || + rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff) + rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1, + default_lna_gain); + if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0x00 || + rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0xff) + rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1, + default_lna_gain); + rt2800_eeprom_write(rt2x00dev, EEPROM_EXT_LNA2, word); + } + + return 0; +} + +int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) +{ + u16 value; + u16 eeprom; + u16 rf; + + /* + * Read EEPROM word for configuration. + */ + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0); + + /* + * Identify RF chipset by EEPROM value + * RT28xx/RT30xx: defined in "EEPROM_NIC_CONF0_RF_TYPE" field + * RT53xx: defined in "EEPROM_CHIP_ID" field + */ + if (rt2x00_rt(rt2x00dev, RT3290) || + rt2x00_rt(rt2x00dev, RT5390) || + rt2x00_rt(rt2x00dev, RT5392) || + rt2x00_rt(rt2x00dev, RT6352)) + rf = rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID); + else if (rt2x00_rt(rt2x00dev, RT3352)) + rf = RF3322; + else if (rt2x00_rt(rt2x00dev, RT3883)) + rf = RF3853; + else if (rt2x00_rt(rt2x00dev, RT5350)) + rf = RF5350; + else + rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE); + + switch (rf) { + case RF2820: + case RF2850: + case RF2720: + case RF2750: + case RF3020: + case RF2020: + case RF3021: + case RF3022: + case RF3052: + case RF3053: + case RF3070: + case RF3290: + case RF3320: + case RF3322: + case RF3853: + case RF5350: + case RF5360: + case RF5362: + case RF5370: + case RF5372: + case RF5390: + case RF5392: + case RF5592: + case RF7620: + rt2x00_info(rt2x00dev, "Found RF chipset 0x%04x\n", rf); + break; + default: + rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n", + rf); + return -ENODEV; + } + + rt2x00_set_rf(rt2x00dev, rf); + + /* + * Identify default antenna configuration. + */ + rt2x00dev->default_ant.tx_chain_num = + rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH); + rt2x00dev->default_ant.rx_chain_num = + rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH); + + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + + if (rt2x00_rt(rt2x00dev, RT3070) || + rt2x00_rt(rt2x00dev, RT3090) || + rt2x00_rt(rt2x00dev, RT3352) || + rt2x00_rt(rt2x00dev, RT3390)) { + value = rt2x00_get_field16(eeprom, + EEPROM_NIC_CONF1_ANT_DIVERSITY); + switch (value) { + case 0: + case 1: + case 2: + rt2x00dev->default_ant.tx = ANTENNA_A; + rt2x00dev->default_ant.rx = ANTENNA_A; + break; + case 3: + rt2x00dev->default_ant.tx = ANTENNA_A; + rt2x00dev->default_ant.rx = ANTENNA_B; + break; + } + } else { + rt2x00dev->default_ant.tx = ANTENNA_A; + rt2x00dev->default_ant.rx = ANTENNA_A; + } + + /* These chips have hardware RX antenna diversity */ + if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R) || + rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5370G)) { + rt2x00dev->default_ant.tx = ANTENNA_HW_DIVERSITY; /* Unused */ + rt2x00dev->default_ant.rx = ANTENNA_HW_DIVERSITY; /* Unused */ + } + + /* + * Determine external LNA informations. + */ + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_LNA_5G)) + __set_bit(CAPABILITY_EXTERNAL_LNA_A, &rt2x00dev->cap_flags); + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_LNA_2G)) + __set_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags); + + /* + * Detect if this device has an hardware controlled radio. + */ + if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_HW_RADIO)) + __set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags); + + /* + * Detect if this device has Bluetooth co-existence. + */ + if (!rt2x00_rt(rt2x00dev, RT3352) && + rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_BT_COEXIST)) + __set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags); + + /* + * Read frequency offset and RF programming sequence. + */ + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ); + rt2x00dev->freq_offset = rt2x00_get_field16(eeprom, EEPROM_FREQ_OFFSET); + + /* + * Store led settings, for correct led behaviour. + */ + rt2x00dev->led_mcu_reg = eeprom; + + /* + * Check if support EIRP tx power limit feature. + */ + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER); + + if (rt2x00_get_field16(eeprom, EEPROM_EIRP_MAX_TX_POWER_2GHZ) < + EIRP_MAX_TX_POWER_LIMIT) + __set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags); + + /* + * Detect if device uses internal or external PA + */ + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + + if (rt2x00_rt(rt2x00dev, RT3352)) { + if (rt2x00_get_field16(eeprom, + EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352)) + __set_bit(CAPABILITY_EXTERNAL_PA_TX0, + &rt2x00dev->cap_flags); + if (rt2x00_get_field16(eeprom, + EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352)) + __set_bit(CAPABILITY_EXTERNAL_PA_TX1, + &rt2x00dev->cap_flags); + } + + return 0; +} + +void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev) { + u32 reg; + + reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG); + rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_DMA_BUSY, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_RX_DMA_BUSY, 0); + rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1); + rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); +} + +static bool rt2800_check_firmware_crc(const u8 *data, const size_t len) { + u16 fw_crc; + u16 crc; + + /* + * The last 2 bytes in the firmware array are the crc checksum itself, + * this means that we should never pass those 2 bytes to the crc + * algorithm. + */ + fw_crc = (data[len - 2] << 8 | data[len - 1]); + + /* + * Use the crc ccitt algorithm. + * This will return the same value as the legacy driver which + * used bit ordering reversion on the both the firmware bytes + * before input input as well as on the final output. + * Obviously using crc ccitt directly is much more efficient. + */ + crc = crc_ccitt(~0, data, len - 2); + + /* + * There is a small difference between the crc-itu-t + bitrev and + * the crc-ccitt crc calculation. In the latter method the 2 bytes + * will be swapped, use swab16 to convert the crc to the correct + * value. + */ + crc = swab16(crc); + + return fw_crc == crc; +} + +int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len) { + size_t offset = 0; + size_t fw_len; + bool multiple; + + /* + * PCI(e) & SOC devices require firmware with a length + * of 8kb. USB devices require firmware files with a length + * of 4kb. Certain USB chipsets however require different firmware, + * which Ralink only provides attached to the original firmware + * file. Thus for USB devices, firmware files have a length + * which is a multiple of 4kb. The firmware for rt3290 chip also + * have a length which is a multiple of 4kb. + */ + if (rt2x00_is_usb(rt2x00dev) || rt2x00_rt(rt2x00dev, RT3290)) + fw_len = 4096; + else + fw_len = 8192; + + multiple = true; + /* + * Validate the firmware length + */ + if (len != fw_len && (!multiple || (len % fw_len) != 0)) + return FW_BAD_LENGTH; + + /* + * Check if the chipset requires one of the upper parts + * of the firmware. + */ + if (rt2x00_is_usb(rt2x00dev) && + !rt2x00_rt(rt2x00dev, RT2860) && + !rt2x00_rt(rt2x00dev, RT2872) && + !rt2x00_rt(rt2x00dev, RT3070) && + ((len / fw_len) == 1)) + return FW_BAD_VERSION; + + /* + * 8kb firmware files must be checked as if it were + * 2 separate firmware files. + */ + while (offset < len) { + if (!rt2800_check_firmware_crc(data + offset, fw_len)) + return FW_BAD_CRC; + + offset += fw_len; + } + + return FW_OK; +} + +int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len) { + unsigned int i; + u32 reg; + int retval; + + if (rt2x00_rt(rt2x00dev, RT3290)) { + retval = rt2800_enable_wlan_rt3290(rt2x00dev); + if (retval) + return -EBUSY; + } + + /* + * If driver doesn't wake up firmware here, + * rt2800_load_firmware will hang forever when interface is up again. + */ + rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0x00000000); + + /* + * Wait for stable hardware. + */ + if (rt2800_wait_csr_ready(rt2x00dev)) + return -EBUSY; + + rt2x00_info(rt2x00dev, "Got CSR ready, hw is stable for FW load\n"); + + if (rt2x00_is_pci(rt2x00dev)) { + if (rt2x00_rt(rt2x00dev, RT3290) || + rt2x00_rt(rt2x00dev, RT3572) || + rt2x00_rt(rt2x00dev, RT5390) || + rt2x00_rt(rt2x00dev, RT5392)) { + reg = rt2800_register_read(rt2x00dev, AUX_CTRL); + rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1); + rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1); + rt2800_register_write(rt2x00dev, AUX_CTRL, reg); + } + rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000002); + } + + rt2800_disable_wpdma(rt2x00dev); + + /* + * Write firmware to the device. + */ + rt2800_drv_write_firmware(rt2x00dev, data, len); + + /* + * Wait for device to stabilize. + */ + for (i = 0; i < REGISTER_BUSY_COUNT; i++) { + reg = rt2800_register_read(rt2x00dev, PBF_SYS_CTRL); + if (rt2x00_get_field32(reg, PBF_SYS_CTRL_READY)) + break; + usleep(1); + } + + if (i == REGISTER_BUSY_COUNT) { + rt2x00_err(rt2x00dev, "PBF system register not ready\n"); + return -EBUSY; + } + + /* + * Disable DMA, will be reenabled later when enabling + * the radio. + */ + rt2800_disable_wpdma(rt2x00dev); + + /* + * Initialize firmware. + */ + rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0); + rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); + if (rt2x00_is_usb(rt2x00dev)) { + rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0); + rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0); + } + usleep(1); + + return 0; +} + +void rt2800_config_filter(struct rt2x00_dev *rt2x00dev, + const unsigned int filter_flags) +{ + u32 reg; + + /* Modified to never drop packets not to me, etc */ + + reg = rt2800_register_read(rt2x00dev, RX_FILTER_CFG); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CRC_ERROR, + !(filter_flags & FIF_FCSFAIL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_PHY_ERROR, + !(filter_flags & FIF_PLCPFAIL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME, 0); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_VER_ERROR, 1); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_MULTICAST, + !(filter_flags & FIF_ALLMULTI)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BROADCAST, 0); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_DUPLICATE, 0); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CF_END_ACK, + !(filter_flags & FIF_CONTROL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CF_END, + !(filter_flags & FIF_CONTROL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_ACK, + !(filter_flags & FIF_CONTROL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CTS, + !(filter_flags & FIF_CONTROL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_RTS, + !(filter_flags & FIF_CONTROL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_PSPOLL, + !(filter_flags & FIF_PSPOLL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BA, 0); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BAR, + !(filter_flags & FIF_CONTROL)); + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CNTL, + !(filter_flags & FIF_CONTROL)); + rt2800_register_write(rt2x00dev, RX_FILTER_CFG, reg); +} + +static void rt2800_config_ht_opmode(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_erp *erp) +{ + bool any_sta_nongf = !!(erp->ht_opmode & + IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT); + u8 protection = erp->ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION; + u8 mm20_mode, mm40_mode, gf20_mode, gf40_mode; + u16 mm20_rate, mm40_rate, gf20_rate, gf40_rate; + u32 reg; + + /* default protection rate for HT20: OFDM 24M */ + mm20_rate = gf20_rate = 0x4004; + + /* default protection rate for HT40: duplicate OFDM 24M */ + mm40_rate = gf40_rate = 0x4084; + + switch (protection) { + case IEEE80211_HT_OP_MODE_PROTECTION_NONE: + /* + * All STAs in this BSS are HT20/40 but there might be + * STAs not supporting greenfield mode. + * => Disable protection for HT transmissions. + */ + mm20_mode = mm40_mode = gf20_mode = gf40_mode = 0; + + break; + case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ: + /* + * All STAs in this BSS are HT20 or HT20/40 but there + * might be STAs not supporting greenfield mode. + * => Protect all HT40 transmissions. + */ + mm20_mode = gf20_mode = 0; + mm40_mode = gf40_mode = 1; + + break; + case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER: + /* + * Nonmember protection: + * According to 802.11n we _should_ protect all + * HT transmissions (but we don't have to). + * + * But if cts_protection is enabled we _shall_ protect + * all HT transmissions using a CCK rate. + * + * And if any station is non GF we _shall_ protect + * GF transmissions. + * + * We decide to protect everything + * -> fall through to mixed mode. + */ + case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED: + /* + * Legacy STAs are present + * => Protect all HT transmissions. + */ + mm20_mode = mm40_mode = gf20_mode = gf40_mode = 1; + + /* + * If erp protection is needed we have to protect HT + * transmissions with CCK 11M long preamble. + */ + if (erp->cts_protection) { + /* don't duplicate RTS/CTS in CCK mode */ + mm20_rate = mm40_rate = 0x0003; + gf20_rate = gf40_rate = 0x0003; + } + break; + } + + /* check for STAs not supporting greenfield mode */ + if (any_sta_nongf) + gf20_mode = gf40_mode = 1; + + /* Update HT protection config */ + reg = rt2800_register_read(rt2x00dev, MM20_PROT_CFG); + rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_RATE, mm20_rate); + rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_CTRL, mm20_mode); + rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, MM40_PROT_CFG); + rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_RATE, mm40_rate); + rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_CTRL, mm40_mode); + rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, GF20_PROT_CFG); + rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_RATE, gf20_rate); + rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_CTRL, gf20_mode); + rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, GF40_PROT_CFG); + rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_RATE, gf40_rate); + rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_CTRL, gf40_mode); + rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg); +} + +void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf, + struct rt2x00intf_conf *conf, const unsigned int flags) +{ + u32 reg; + bool update_bssid = false; + + if (flags & CONFIG_UPDATE_TYPE) { + rt2x00_info(rt2x00dev, "Updating interface type\n"); + /* + * Enable synchronisation. + */ + reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG); + rt2x00_set_field32(®, BCN_TIME_CFG_TSF_SYNC, conf->sync); + rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); + + if (conf->sync == TSF_SYNC_AP_NONE) { + /* + * Tune beacon queue transmit parameters for AP mode + */ + reg = rt2800_register_read(rt2x00dev, TBTT_SYNC_CFG); + rt2x00_set_field32(®, TBTT_SYNC_CFG_BCN_CWMIN, 0); + rt2x00_set_field32(®, TBTT_SYNC_CFG_BCN_AIFSN, 1); + rt2x00_set_field32(®, TBTT_SYNC_CFG_BCN_EXP_WIN, 32); + rt2x00_set_field32(®, TBTT_SYNC_CFG_TBTT_ADJUST, 0); + rt2800_register_write(rt2x00dev, TBTT_SYNC_CFG, reg); + } else { + reg = rt2800_register_read(rt2x00dev, TBTT_SYNC_CFG); + rt2x00_set_field32(®, TBTT_SYNC_CFG_BCN_CWMIN, 4); + rt2x00_set_field32(®, TBTT_SYNC_CFG_BCN_AIFSN, 2); + rt2x00_set_field32(®, TBTT_SYNC_CFG_BCN_EXP_WIN, 32); + rt2x00_set_field32(®, TBTT_SYNC_CFG_TBTT_ADJUST, 16); + rt2800_register_write(rt2x00dev, TBTT_SYNC_CFG, reg); + } + } + + if (flags & CONFIG_UPDATE_MAC) { + if (flags & CONFIG_UPDATE_TYPE && + conf->sync == TSF_SYNC_AP_NONE) { + /* + * The BSSID register has to be set to our own mac + * address in AP mode. + */ + memcpy(conf->bssid, conf->mac, sizeof(conf->mac)); + update_bssid = true; + } + + if (!is_zero_ether_addr((const u8 *)conf->mac)) { + reg = le32_to_cpu(conf->mac[1]); + rt2x00_set_field32(®, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff); + conf->mac[1] = cpu_to_le32(reg); + } + + rt2800_register_multiwrite(rt2x00dev, MAC_ADDR_DW0, + conf->mac, sizeof(conf->mac)); + } + + if ((flags & CONFIG_UPDATE_BSSID) || update_bssid) { + if (!is_zero_ether_addr((const u8 *)conf->bssid)) { + reg = le32_to_cpu(conf->bssid[1]); + rt2x00_set_field32(®, MAC_BSSID_DW1_BSS_ID_MASK, 3); + rt2x00_set_field32(®, MAC_BSSID_DW1_BSS_BCN_NUM, 0); + conf->bssid[1] = cpu_to_le32(reg); + } + + rt2800_register_multiwrite(rt2x00dev, MAC_BSSID_DW0, + conf->bssid, sizeof(conf->bssid)); + } +} + +void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) +{ + u32 tx_pin; + u8 rfcsr; + unsigned long min_sleep = 0; + + /* + * A voltage-controlled oscillator(VCO) is an electronic oscillator + * designed to be controlled in oscillation frequency by a voltage + * input. Maybe the temperature will affect the frequency of + * oscillation to be shifted. The VCO calibration will be called + * periodically to adjust the frequency to be precision. + */ + + tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG); + tx_pin &= TX_PIN_CFG_PA_PE_DISABLE; + rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); + + switch (rt2x00dev->chip.rf) { + case RF2020: + case RF3020: + case RF3021: + case RF3022: + case RF3320: + case RF3052: + rfcsr = rt2800_rfcsr_read(rt2x00dev, 7); + rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1); + rt2800_rfcsr_write(rt2x00dev, 7, rfcsr); + break; + case RF3053: + case RF3070: + case RF3290: + case RF3853: + case RF5350: + case RF5360: + case RF5362: + case RF5370: + case RF5372: + case RF5390: + case RF5392: + case RF5592: + rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + min_sleep = 1000; + break; + case RF7620: + rt2800_rfcsr_write(rt2x00dev, 5, 0x40); + rt2800_rfcsr_write(rt2x00dev, 4, 0x0C); + rfcsr = rt2800_rfcsr_read(rt2x00dev, 4); + rt2x00_set_field8(&rfcsr, RFCSR4_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 4, rfcsr); + min_sleep = 2000; + break; + default: + WARN_ONCE(1, "Not supported RF chipset %x for VCO recalibration", + rt2x00dev->chip.rf); + return; + } + + if (min_sleep > 0) + usleep_range(min_sleep, min_sleep * 2); + + tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG); + if (rt2x00dev->rf_channel <= 14) { + switch (rt2x00dev->default_ant.tx_chain_num) { + case 3: + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, 1); + /* fall through */ + case 2: + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1); + /* fall through */ + case 1: + default: + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1); + break; + } + } else { + switch (rt2x00dev->default_ant.tx_chain_num) { + case 3: + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, 1); + /* fall through */ + case 2: + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1); + /* fall through */ + case 1: + default: + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1); + break; + } + } + rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); + + if (rt2x00_rt(rt2x00dev, RT6352)) { + if (rt2x00dev->default_ant.rx_chain_num == 1) { + rt2800_bbp_write(rt2x00dev, 91, 0x07); + rt2800_bbp_write(rt2x00dev, 95, 0x1A); + rt2800_bbp_write(rt2x00dev, 195, 128); + rt2800_bbp_write(rt2x00dev, 196, 0xA0); + rt2800_bbp_write(rt2x00dev, 195, 170); + rt2800_bbp_write(rt2x00dev, 196, 0x12); + rt2800_bbp_write(rt2x00dev, 195, 171); + rt2800_bbp_write(rt2x00dev, 196, 0x10); + } else { + rt2800_bbp_write(rt2x00dev, 91, 0x06); + rt2800_bbp_write(rt2x00dev, 95, 0x9A); + rt2800_bbp_write(rt2x00dev, 195, 128); + rt2800_bbp_write(rt2x00dev, 196, 0xE0); + rt2800_bbp_write(rt2x00dev, 195, 170); + rt2800_bbp_write(rt2x00dev, 196, 0x30); + rt2800_bbp_write(rt2x00dev, 195, 171); + rt2800_bbp_write(rt2x00dev, 196, 0x30); + } + + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { + rt2800_bbp_write(rt2x00dev, 75, 0x68); + rt2800_bbp_write(rt2x00dev, 76, 0x4C); + rt2800_bbp_write(rt2x00dev, 79, 0x1C); + rt2800_bbp_write(rt2x00dev, 80, 0x0C); + rt2800_bbp_write(rt2x00dev, 82, 0xB6); + } + + /* On 11A, We should delay and wait RF/BBP to be stable + * and the appropriate time should be 1000 micro seconds + * 2005/06/05 - On 11G, we also need this delay time. + * Otherwise it's difficult to pass the WHQL. + */ + usleep_range(1000, 1500); + } +} +EXPORT_SYMBOL_GPL(rt2800_vco_calibration); + +void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp, + u32 changed) +{ + u32 reg; + + if (changed & BSS_CHANGED_ERP_PREAMBLE) { + reg = rt2800_register_read(rt2x00dev, AUTO_RSP_CFG); + rt2x00_set_field32(®, AUTO_RSP_CFG_AR_PREAMBLE, + !!erp->short_preamble); + rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg); + } + + if (changed & BSS_CHANGED_ERP_CTS_PROT) { + reg = rt2800_register_read(rt2x00dev, OFDM_PROT_CFG); + rt2x00_set_field32(®, OFDM_PROT_CFG_PROTECT_CTRL, + erp->cts_protection ? 2 : 0); + rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg); + } + + if (changed & BSS_CHANGED_BASIC_RATES) { + rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, + 0xff0 | erp->basic_rates); + rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003); + } + + if (changed & BSS_CHANGED_ERP_SLOT) { + reg = rt2800_register_read(rt2x00dev, BKOFF_SLOT_CFG); + rt2x00_set_field32(®, BKOFF_SLOT_CFG_SLOT_TIME, + erp->slot_time); + rt2800_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg); + + reg = rt2800_register_read(rt2x00dev, XIFS_TIME_CFG); + rt2x00_set_field32(®, XIFS_TIME_CFG_EIFS, erp->eifs); + rt2800_register_write(rt2x00dev, XIFS_TIME_CFG, reg); + } + + if (changed & BSS_CHANGED_BEACON_INT) { + reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG); + rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_INTERVAL, + erp->beacon_int * 16); + rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg); + } + + if (changed & BSS_CHANGED_HT) + rt2800_config_ht_opmode(rt2x00dev, erp); +} +EXPORT_SYMBOL_GPL(rt2800_config_erp); + +static void rt2800_iq_calibrate(struct rt2x00_dev *rt2x00dev, int channel) +{ + u8 cal; + + /* TX0 IQ Gain */ + rt2800_bbp_write(rt2x00dev, 158, 0x2c); + if (channel <= 14) + cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX0_2G); + else if (channel >= 36 && channel <= 64) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5G); + else if (channel >= 100 && channel <= 138) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5G); + else if (channel >= 140 && channel <= 165) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5G); + else + cal = 0; + rt2800_bbp_write(rt2x00dev, 159, cal); + + /* TX0 IQ Phase */ + rt2800_bbp_write(rt2x00dev, 158, 0x2d); + if (channel <= 14) + cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX0_2G); + else if (channel >= 36 && channel <= 64) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5G); + else if (channel >= 100 && channel <= 138) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5G); + else if (channel >= 140 && channel <= 165) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5G); + else + cal = 0; + rt2800_bbp_write(rt2x00dev, 159, cal); + + /* TX1 IQ Gain */ + rt2800_bbp_write(rt2x00dev, 158, 0x4a); + if (channel <= 14) + cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX1_2G); + else if (channel >= 36 && channel <= 64) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5G); + else if (channel >= 100 && channel <= 138) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5G); + else if (channel >= 140 && channel <= 165) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5G); + else + cal = 0; + rt2800_bbp_write(rt2x00dev, 159, cal); + + /* TX1 IQ Phase */ + rt2800_bbp_write(rt2x00dev, 158, 0x4b); + if (channel <= 14) + cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX1_2G); + else if (channel >= 36 && channel <= 64) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5G); + else if (channel >= 100 && channel <= 138) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5G); + else if (channel >= 140 && channel <= 165) + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5G); + else + cal = 0; + rt2800_bbp_write(rt2x00dev, 159, cal); + + /* FIXME: possible RX0, RX1 callibration ? */ + + /* RF IQ compensation control */ + rt2800_bbp_write(rt2x00dev, 158, 0x04); + cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_RF_IQ_COMPENSATION_CONTROL); + rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0); + + /* RF IQ imbalance compensation control */ + rt2800_bbp_write(rt2x00dev, 158, 0x03); + cal = rt2x00_eeprom_byte(rt2x00dev, + EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CONTROL); + rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0); +} + +static void rt3883_bbp_adjust(struct rt2x00_dev *rt2x00dev, + struct rf_channel *rf) +{ + u8 bbp; + + bbp = (rf->channel > 14) ? 0x48 : 0x38; + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp); + + rt2800_bbp_write(rt2x00dev, 69, 0x12); + + if (rf->channel <= 14) { + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + } else { + /* Disable CCK packet detection */ + rt2800_bbp_write(rt2x00dev, 70, 0x00); + } + + rt2800_bbp_write(rt2x00dev, 73, 0x10); + + if (rf->channel > 14) { + rt2800_bbp_write(rt2x00dev, 62, 0x1d); + rt2800_bbp_write(rt2x00dev, 63, 0x1d); + rt2800_bbp_write(rt2x00dev, 64, 0x1d); + } else { + rt2800_bbp_write(rt2x00dev, 62, 0x2d); + rt2800_bbp_write(rt2x00dev, 63, 0x2d); + rt2800_bbp_write(rt2x00dev, 64, 0x2d); + } +} + +static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + struct rf_channel *rf, + struct channel_info *info) +{ + u32 reg; + u32 tx_pin; + u8 bbp, rfcsr; + + rt2x00_info(rt2x00dev, "Configuring channel\n"); + + /* + * Remove txpower stuff since we don't tx + */ + + switch (rt2x00dev->chip.rt) { + case RT3883: + rt3883_bbp_adjust(rt2x00dev, rf); + break; + } + + switch (rt2x00dev->chip.rf) { + case RF2020: + case RF3020: + case RF3021: + case RF3022: + case RF3320: + rt2800_config_channel_rf3xxx(rt2x00dev, conf, rf, info); + break; + case RF3052: + rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info); + break; + case RF3053: + rt2800_config_channel_rf3053(rt2x00dev, conf, rf, info); + break; + case RF3290: + rt2800_config_channel_rf3290(rt2x00dev, conf, rf, info); + break; + case RF3322: + rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info); + break; + case RF3853: + rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info); + break; + case RF3070: + case RF5350: + case RF5360: + case RF5362: + case RF5370: + case RF5372: + case RF5390: + case RF5392: + rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info); + break; + case RF5592: + rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info); + break; + case RF7620: + rt2800_config_channel_rf7620(rt2x00dev, conf, rf, info); + break; + default: + rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info); + } + + if (rt2x00_rf(rt2x00dev, RF3070) || + rt2x00_rf(rt2x00dev, RF3290) || + rt2x00_rf(rt2x00dev, RF3322) || + rt2x00_rf(rt2x00dev, RF5350) || + rt2x00_rf(rt2x00dev, RF5360) || + rt2x00_rf(rt2x00dev, RF5362) || + rt2x00_rf(rt2x00dev, RF5370) || + rt2x00_rf(rt2x00dev, RF5372) || + rt2x00_rf(rt2x00dev, RF5390) || + rt2x00_rf(rt2x00dev, RF5392)) { + rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); + if (rt2x00_rf(rt2x00dev, RF3322)) { + rt2x00_set_field8(&rfcsr, RF3322_RFCSR30_TX_H20M, + conf_is_ht40(conf)); + rt2x00_set_field8(&rfcsr, RF3322_RFCSR30_RX_H20M, + conf_is_ht40(conf)); + } else { + rt2x00_set_field8(&rfcsr, RFCSR30_TX_H20M, + conf_is_ht40(conf)); + rt2x00_set_field8(&rfcsr, RFCSR30_RX_H20M, + conf_is_ht40(conf)); + } + rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); + + rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + } + + /* + * Change BBP settings + */ + + if (rt2x00_rt(rt2x00dev, RT3352)) { + rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); + + rt2800_bbp_write(rt2x00dev, 27, 0x0); + rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 27, 0x20); + rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 86, 0x38); + rt2800_bbp_write(rt2x00dev, 83, 0x6a); + } else if (rt2x00_rt(rt2x00dev, RT3593)) { + if (rf->channel > 14) { + /* Disable CCK Packet detection on 5GHz */ + rt2800_bbp_write(rt2x00dev, 70, 0x00); + } else { + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + } + + if (conf_is_ht40(conf)) + rt2800_bbp_write(rt2x00dev, 105, 0x04); + else + rt2800_bbp_write(rt2x00dev, 105, 0x34); + + rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 77, 0x98); + } else if (rt2x00_rt(rt2x00dev, RT3883)) { + rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); + + if (rt2x00dev->default_ant.rx_chain_num > 1) + rt2800_bbp_write(rt2x00dev, 86, 0x46); + else + rt2800_bbp_write(rt2x00dev, 86, 0); + } else { + rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); + rt2800_bbp_write(rt2x00dev, 86, 0); + } + + if (rf->channel <= 14) { + if (!rt2x00_rt(rt2x00dev, RT5390) && + !rt2x00_rt(rt2x00dev, RT5392) && + !rt2x00_rt(rt2x00dev, RT6352)) { + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { + rt2800_bbp_write(rt2x00dev, 82, 0x62); + rt2800_bbp_write(rt2x00dev, 82, 0x62); + rt2800_bbp_write(rt2x00dev, 75, 0x46); + } else { + if (rt2x00_rt(rt2x00dev, RT3593)) + rt2800_bbp_write(rt2x00dev, 82, 0x62); + else + rt2800_bbp_write(rt2x00dev, 82, 0x84); + rt2800_bbp_write(rt2x00dev, 75, 0x50); + } + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) + rt2800_bbp_write(rt2x00dev, 83, 0x8a); + } + + } else { + if (rt2x00_rt(rt2x00dev, RT3572)) + rt2800_bbp_write(rt2x00dev, 82, 0x94); + else if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) + rt2800_bbp_write(rt2x00dev, 82, 0x82); + else if (!rt2x00_rt(rt2x00dev, RT6352)) + rt2800_bbp_write(rt2x00dev, 82, 0xf2); + + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) + rt2800_bbp_write(rt2x00dev, 83, 0x9a); + + if (rt2x00_has_cap_external_lna_a(rt2x00dev)) + rt2800_bbp_write(rt2x00dev, 75, 0x46); + else + rt2800_bbp_write(rt2x00dev, 75, 0x50); + } + + reg = rt2800_register_read(rt2x00dev, TX_BAND_CFG); + rt2x00_set_field32(®, TX_BAND_CFG_HT40_MINUS, conf_is_ht40_minus(conf)); + rt2x00_set_field32(®, TX_BAND_CFG_A, rf->channel > 14); + rt2x00_set_field32(®, TX_BAND_CFG_BG, rf->channel <= 14); + rt2800_register_write(rt2x00dev, TX_BAND_CFG, reg); + + if (rt2x00_rt(rt2x00dev, RT3572)) + rt2800_rfcsr_write(rt2x00dev, 8, 0); + + if (rt2x00_rt(rt2x00dev, RT6352)) { + tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); + } else { + tx_pin = 0; + } + + switch (rt2x00dev->default_ant.tx_chain_num) { + case 3: + /* Turn on tertiary PAs */ + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, + rf->channel > 14); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, + rf->channel <= 14); + /* fall-through */ + case 2: + /* Turn on secondary PAs */ + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, + rf->channel > 14); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, + rf->channel <= 14); + /* fall-through */ + case 1: + /* Turn on primary PAs */ + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, + rf->channel > 14); + if (rt2x00_has_cap_bt_coexist(rt2x00dev)) + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1); + else + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, + rf->channel <= 14); + break; + } + + switch (rt2x00dev->default_ant.rx_chain_num) { + case 3: + /* Turn on tertiary LNAs */ + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, + rf->channel > 14); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, + rf->channel <= 14); + /* fall-through */ + case 2: + /* Turn on secondary LNAs */ + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, + rf->channel > 14); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, + rf->channel <= 14); + /* fall-through */ + case 1: + /* Turn on primary LNAs */ + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, + rf->channel > 14); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, + rf->channel <= 14); + break; + } + + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1); + + rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); + + if (rt2x00_rt(rt2x00dev, RT3572)) { + rt2800_rfcsr_write(rt2x00dev, 8, 0x80); + + /* AGC init */ + if (rf->channel <= 14) + reg = 0x1c + (2 * rt2x00dev->lna_gain); + else + reg = 0x22 + ((rt2x00dev->lna_gain * 5) / 3); + + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); + } + + if (rt2x00_rt(rt2x00dev, RT3593)) { + reg = rt2800_register_read(rt2x00dev, GPIO_CTRL); + + /* Band selection */ + if (rt2x00_is_usb(rt2x00dev) || + rt2x00_is_pcie(rt2x00dev)) { + /* GPIO #8 controls all paths */ + rt2x00_set_field32(®, GPIO_CTRL_DIR8, 0); + if (rf->channel <= 14) + rt2x00_set_field32(®, GPIO_CTRL_VAL8, 1); + else + rt2x00_set_field32(®, GPIO_CTRL_VAL8, 0); + } + + /* LNA PE control. */ + if (rt2x00_is_usb(rt2x00dev)) { + /* GPIO #4 controls PE0 and PE1, + * GPIO #7 controls PE2 + */ + rt2x00_set_field32(®, GPIO_CTRL_DIR4, 0); + rt2x00_set_field32(®, GPIO_CTRL_DIR7, 0); + + rt2x00_set_field32(®, GPIO_CTRL_VAL4, 1); + rt2x00_set_field32(®, GPIO_CTRL_VAL7, 1); + } else if (rt2x00_is_pcie(rt2x00dev)) { + /* GPIO #4 controls PE0, PE1 and PE2 */ + rt2x00_set_field32(®, GPIO_CTRL_DIR4, 0); + rt2x00_set_field32(®, GPIO_CTRL_VAL4, 1); + } + + rt2800_register_write(rt2x00dev, GPIO_CTRL, reg); + + /* AGC init */ + if (rf->channel <= 14) + reg = 0x1c + 2 * rt2x00dev->lna_gain; + else + reg = 0x22 + ((rt2x00dev->lna_gain * 5) / 3); + + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); + + usleep_range(1000, 1500); + } + + if (rt2x00_rt(rt2x00dev, RT3883)) { + if (!conf_is_ht40(conf)) + rt2800_bbp_write(rt2x00dev, 105, 0x34); + else + rt2800_bbp_write(rt2x00dev, 105, 0x04); + + /* AGC init */ + if (rf->channel <= 14) + reg = 0x2e + rt2x00dev->lna_gain; + else + reg = 0x20 + ((rt2x00dev->lna_gain * 5) / 3); + + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); + + usleep_range(1000, 1500); + } + + if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { + reg = 0x10; + if (!conf_is_ht40(conf)) { + if (rt2x00_rt(rt2x00dev, RT6352) && + rt2x00_has_cap_external_lna_bg(rt2x00dev)) { + reg |= 0x5; + } else { + reg |= 0xa; + } + } + rt2800_bbp_write(rt2x00dev, 195, 141); + rt2800_bbp_write(rt2x00dev, 196, reg); + + /* AGC init. + * Despite the vendor driver using different values here for + * RT6352 chip, we use 0x1c for now. This may have to be changed + * once TSSI got implemented. + */ + reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain; + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); + + rt2800_iq_calibrate(rt2x00dev, rf->channel); + } + + bbp = rt2800_bbp_read(rt2x00dev, 4); + rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf)); + rt2800_bbp_write(rt2x00dev, 4, bbp); + + bbp = rt2800_bbp_read(rt2x00dev, 3); + rt2x00_set_field8(&bbp, BBP3_HT40_MINUS, conf_is_ht40_minus(conf)); + rt2800_bbp_write(rt2x00dev, 3, bbp); + + if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) { + if (conf_is_ht40(conf)) { + rt2800_bbp_write(rt2x00dev, 69, 0x1a); + rt2800_bbp_write(rt2x00dev, 70, 0x0a); + rt2800_bbp_write(rt2x00dev, 73, 0x16); + } else { + rt2800_bbp_write(rt2x00dev, 69, 0x16); + rt2800_bbp_write(rt2x00dev, 70, 0x08); + rt2800_bbp_write(rt2x00dev, 73, 0x11); + } + } + + usleep_range(1000, 1500); + + /* + * Clear channel statistic counters + */ + reg = rt2800_register_read(rt2x00dev, CH_IDLE_STA); + reg = rt2800_register_read(rt2x00dev, CH_BUSY_STA); + reg = rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC); + + /* + * Clear update flag + */ + if (rt2x00_rt(rt2x00dev, RT3352) || + rt2x00_rt(rt2x00dev, RT5350)) { + bbp = rt2800_bbp_read(rt2x00dev, 49); + rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0); + rt2800_bbp_write(rt2x00dev, 49, bbp); + } +} + +static void rt2800_config_ps(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_conf *libconf) +{ + enum dev_state state = + (libconf->conf->flags & IEEE80211_CONF_PS) ? + STATE_SLEEP : STATE_AWAKE; + u32 reg; + + if (state == STATE_SLEEP) { + rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0); + + reg = rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG); + rt2x00_set_field32(®, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 5); + rt2x00_set_field32(®, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE, + libconf->conf->listen_interval - 1); + rt2x00_set_field32(®, AUTOWAKEUP_CFG_AUTOWAKE, 1); + rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg); + + rt2x00dev->ops->lib->set_device_state(rt2x00dev, state); + } else { + reg = rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG); + rt2x00_set_field32(®, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 0); + rt2x00_set_field32(®, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE, 0); + rt2x00_set_field32(®, AUTOWAKEUP_CFG_AUTOWAKE, 0); + rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg); + + rt2x00dev->ops->lib->set_device_state(rt2x00dev, state); + } +} + +void rt2800_config(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_conf *libconf, + const unsigned int flags) +{ + /* Always recalculate LNA gain before changing configuration */ + rt2800_config_lna_gain(rt2x00dev, libconf); + + if (flags & IEEE80211_CONF_CHANGE_CHANNEL) { + rt2800_config_channel(rt2x00dev, libconf->conf, + &libconf->rf, &libconf->channel); + } + if (flags & IEEE80211_CONF_CHANGE_PS) + rt2800_config_ps(rt2x00dev, libconf); +} +EXPORT_SYMBOL_GPL(rt2800_config); + +/* + * Radio control handlers. + */ +int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev) +{ + int status; + + /* + * Trimmed down for userspace + */ + + /* + * Don't enable the radio twice. + * And check if the hardware button has been disabled. + */ + if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) + return 0; + + /* + * Enable radio. + */ + status = + rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_ON); + if (status) + return status; + + rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_ON); + + set_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags); + + return 0; +} + +void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) +{ + if (!test_and_clear_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) + return; + + /* + * Trim down functionality for userspace + */ + + /* + * Disable radio. + */ + rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_OFF); + rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_OFF); +} + +int rt2x00lib_start(struct rt2x00_dev *rt2x00dev) +{ + int retval; + + /* + * Severely stripped down since we don't call initialize or the 2x00 + * firmware load since we have our own + */ + + if (test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags)) + return 0; + + rt2x00dev->intf_sta_count = 0; + + /* Enable the radio */ + retval = rt2x00lib_enable_radio(rt2x00dev); + if (retval) + return retval; + + set_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags); + + return 0; +} + +void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev) +{ + if (!test_and_clear_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags)) + return; + + /* + * Perhaps we can add something smarter here, + * but for now just disabling the radio should do. + */ + rt2x00lib_disable_radio(rt2x00dev); + + rt2x00dev->intf_sta_count = 0; +} + +static void rt2x00link_antenna_reset(struct rt2x00_dev *rt2x00dev) +{ + ewma_rssi_init(&rt2x00dev->link.ant.rssi_ant); +} + +void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev) +{ + /* + * Userspace should never need this because we're only monitor + */ + + return; +} + +void rt2x00link_reset_tuner(struct rt2x00_dev *rt2x00dev, bool antenna) +{ + struct link_qual *qual = &rt2x00dev->link.qual; + u8 vgc_level = qual->vgc_level_reg; + + if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) + return; + + /* + * Reset link information. + * Both the currently active vgc level as well as + * the link tuner counter should be reset. Resetting + * the counter is important for devices where the + * device should only perform link tuning during the + * first minute after being enabled. + */ + rt2x00dev->link.count = 0; + memset(qual, 0, sizeof(*qual)); + ewma_rssi_init(&rt2x00dev->link.avg_rssi); + + /* + * Restore the VGC level as stored in the registers, + * the driver can use this to determine if the register + * must be updated during reset or not. + */ + qual->vgc_level_reg = vgc_level; + + /* + * Reset the link tuner. + */ + rt2x00dev->ops->lib->reset_tuner(rt2x00dev, qual); + + if (antenna) + rt2x00link_antenna_reset(rt2x00dev); +} + +void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, + struct antenna_setup config) +{ + /* + * Modified for userspace - ant is always the default ant + */ + + struct antenna_setup *def = &rt2x00dev->default_ant; + + config.rx = def->rx; + config.tx = def->tx; + + /* + * Antenna setup changes require the RX to be disabled, + * else the changes will be ignored by the device. + */ + if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) + rt2x00dev->ops->lib->stop_queue(rt2x00dev); + + /* + * Write new antenna setup to device and reset the link tuner. + * The latter is required since we need to recalibrate the + * noise-sensitivity ratio for the new setup. + */ + rt2x00dev->ops->lib->config_ant(rt2x00dev, &config); + + rt2x00link_reset_tuner(rt2x00dev, true); + + if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) + rt2x00dev->ops->lib->start_queue(rt2x00dev); +} + +static u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf) +{ + struct hw_mode_spec *spec = &rt2x00dev->spec; + int center_channel; + u16 i; + + /* + * Initialize center channel to current channel. + */ + center_channel = spec->channels[conf->chandef.chan->hw_value].channel; + + /* + * Adjust center channel to HT40+ and HT40- operation. + */ + if (conf_is_ht40_plus(conf)) + center_channel += 2; + else if (conf_is_ht40_minus(conf)) + center_channel -= (center_channel == 14) ? 1 : 2; + + for (i = 0; i < spec->num_channels; i++) + if (spec->channels[i].channel == center_channel) + return i; + + WARN_ON(1); + return conf->chandef.chan->hw_value; +} + +void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + unsigned int ieee80211_flags) +{ + struct rt2x00lib_conf libconf; + u16 hw_value; + + rt2x00_info(rt2x00dev, "rt2x00lib_config flags %u\n", ieee80211_flags); + + memset(&libconf, 0, sizeof(libconf)); + + libconf.conf = conf; + + if (ieee80211_flags & IEEE80211_CONF_CHANGE_CHANNEL) { + if (!conf_is_ht(conf)) + set_bit(CONFIG_HT_DISABLED, &rt2x00dev->flags); + else + clear_bit(CONFIG_HT_DISABLED, &rt2x00dev->flags); + + if (conf_is_ht40(conf)) { + set_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags); + hw_value = rt2x00ht_center_channel(rt2x00dev, conf); + } else { + clear_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags); + hw_value = conf->chandef.chan->hw_value; + } + + memcpy(&libconf.rf, + &rt2x00dev->spec.channels[hw_value], + sizeof(libconf.rf)); + + memcpy(&libconf.channel, + &rt2x00dev->spec.channels_info[hw_value], + sizeof(libconf.channel)); + + /* Used for VCO periodic calibration */ + rt2x00dev->rf_channel = libconf.rf.channel; + } + + /* + * Start configuration. + */ + rt2x00dev->ops->lib->config(rt2x00dev, &libconf, ieee80211_flags); + + clear_bit(CONFIG_POWERSAVING, &rt2x00dev->flags); + clear_bit(CONFIG_MONITORING, &rt2x00dev->flags); + + rt2x00dev->curr_band = conf->chandef.chan->band; + rt2x00dev->curr_freq = conf->chandef.chan->center_freq; + +} + +int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev) +{ + u32 reg; + u32 rt; + u32 rev; + + if (rt2x00_rt(rt2x00dev, RT3290)) + reg = rt2800_register_read(rt2x00dev, MAC_CSR0_3290); + else + reg = rt2800_register_read(rt2x00dev, MAC_CSR0); + + rt = rt2x00_get_field32(reg, MAC_CSR0_CHIPSET); + rev = rt2x00_get_field32(reg, MAC_CSR0_REVISION); + + switch (rt) { + case RT2860: + case RT2872: + case RT2883: + case RT3070: + case RT3071: + case RT3090: + case RT3290: + case RT3352: + case RT3390: + case RT3572: + case RT3593: + case RT3883: + case RT5350: + case RT5390: + case RT5392: + case RT5592: + break; + default: + rt2x00_err(rt2x00dev, "Invalid RT chipset 0x%04x, rev %04x detected\n", + rt, rev); + return -ENODEV; + } + + if (rt == RT5390 && rt2x00_is_soc(rt2x00dev)) + rt = RT6352; + + rt2x00_set_rt(rt2x00dev, rt, rev); + + return 0; +} + + diff --git a/libwifiuserspace/rt2800usb/rt2800lib.h b/libwifiuserspace/rt2800usb/rt2800lib.h new file mode 100644 index 0000000..1c6e72f --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2800lib.h @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __RT2800LIB_H__ +#define __RT2800LIB_H__ + +#include "kernel/types.h" +#include "kernel/mac80211.h" +#include "kernel/ieee80211.h" + +#include "rt2x00.h" +#include "rt2800.h" + +/* RT2800 driver data structure */ +struct rt2800_drv_data { + u8 calibration_bw20; + u8 calibration_bw40; + char rx_calibration_bw20; + char rx_calibration_bw40; + char tx_calibration_bw20; + char tx_calibration_bw40; + u8 bbp25; + u8 bbp26; + u8 txmixer_gain_24g; + u8 txmixer_gain_5g; + u8 max_psdu; + unsigned int tbtt_tick; + unsigned int ampdu_factor_cnt[4]; +}; + +struct rt2800_ops { + u32 (*register_read)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset); + u32 (*register_read_lock)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset); + void (*register_write)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, u32 value); + void (*register_write_lock)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, u32 value); + + void (*register_multiread)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + void *value, const u32 length); + void (*register_multiwrite)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + const void *value, const u32 length); + + int (*regbusy_read)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + const struct rt2x00_field32 field, u32 *reg); + + int (*read_eeprom)(struct rt2x00_dev *rt2x00dev); + bool (*hwcrypt_disabled)(struct rt2x00_dev *rt2x00dev); + + int (*drv_write_firmware)(struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len); + int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev); +}; + +static inline u32 rt2800_register_read(struct rt2x00_dev *rt2x00dev, + const unsigned int offset) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + return rt2800ops->register_read(rt2x00dev, offset); +} + +static inline u32 rt2800_register_read_lock(struct rt2x00_dev *rt2x00dev, + const unsigned int offset) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + return rt2800ops->register_read_lock(rt2x00dev, offset); +} + +static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u32 value) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + rt2800ops->register_write(rt2x00dev, offset, value); +} + +static inline void rt2800_register_write_lock(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u32 value) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + rt2800ops->register_write_lock(rt2x00dev, offset, value); +} + +static inline void rt2800_register_multiread(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + void *value, const u32 length) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + rt2800ops->register_multiread(rt2x00dev, offset, value, length); +} + +static inline void rt2800_register_multiwrite(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + const void *value, + const u32 length) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + rt2800ops->register_multiwrite(rt2x00dev, offset, value, length); +} + +static inline int rt2800_regbusy_read(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + const struct rt2x00_field32 field, + u32 *reg) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + return rt2800ops->regbusy_read(rt2x00dev, offset, field, reg); +} + +static inline int rt2800_read_eeprom(struct rt2x00_dev *rt2x00dev) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + return rt2800ops->read_eeprom(rt2x00dev); +} + +static inline bool rt2800_hwcrypt_disabled(struct rt2x00_dev *rt2x00dev) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + return rt2800ops->hwcrypt_disabled(rt2x00dev); +} + +static inline int rt2800_drv_write_firmware(struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + return rt2800ops->drv_write_firmware(rt2x00dev, data, len); +} + +static inline int rt2800_drv_init_registers(struct rt2x00_dev *rt2x00dev) { + const struct rt2800_ops *rt2800ops = (const struct rt2800_ops *) rt2x00dev->ops->drv; + + return rt2800ops->drv_init_registers(rt2x00dev); +} + +int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev); +int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev); + +int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev); +int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_crypto *crypto, + struct ieee80211_key_conf *key); +int rt2800_config_pairwise_key(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_crypto *crypto, + struct ieee80211_key_conf *key); +int rt2800_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_sta *sta); +int rt2800_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_sta *sta); +void rt2800_config_filter(struct rt2x00_dev *rt2x00dev, + const unsigned int filter_flags); +void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant); +void rt2800_config(struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_conf *libconf, + const unsigned int flags); +void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf, + struct rt2x00intf_conf *conf, const unsigned int flags); +void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp, + u32 changed); +void rt2800_link_stats(struct rt2x00_dev *rt2x00dev, struct link_qual *qual); +void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual); +void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual, + const u32 count); +void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev); +void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev); + +int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev); +void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev); + +void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev); + +void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, + const u8 command, const u8 token, + const u8 arg0, const u8 arg1); + +int rt2800_wait_csr_ready(struct rt2x00_dev *rt2x00dev); +int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev); + +int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len); +int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len); + +int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev); +int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev); + +int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev); + +int rt2800_init_registers(struct rt2x00_dev *rt2x00dev); + +static inline bool rt2800_clk_is_20mhz(struct rt2x00_dev *rt2x00dev) +{ + /* + * clk is for SOC only, and we don't want to deal with all the kernel + * stuff. We never have a SOC chip in USB. + */ + return false; +} + + +#endif /* ifndef RT2800LIB_H */ + diff --git a/libwifiuserspace/rt2800usb/rt2800usb.c b/libwifiuserspace/rt2800usb/rt2800usb.c new file mode 100644 index 0000000..5499bb5 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2800usb.c @@ -0,0 +1,2467 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#include +#include +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#else +#include +#define usleep(x) Sleep((x) < 1000 ? 1 : (x) / 1000) +#endif + +#include "kernel/cfg80211.h" +#include "kernel/endian.h" +#include "kernel/kernel.h" +#include "kernel/nl80211.h" +#include "kernel/types.h" + +#include "rt2x00.h" +#include "rt2x00lib.h" +#include "rt2x00usb.h" +#include "rt2800.h" +#include "rt2800usb.h" +#include "rt2800lib.h" + +#define CONFIG_RT2800USB_RT55XX +#define CONFIG_RT2800USB_RT33XX +#define CONFIG_RT2800USB_RT3573 +#define CONFIG_RT2800USB_RT53XX + +/* + * rt2800usb module information. + */ +static const struct usb_device_id rt2800usb_device_table[] = { + /* Abocom */ + { USB_DEVICE(0x07b8, 0x2870) }, + { USB_DEVICE(0x07b8, 0x2770) }, + { USB_DEVICE(0x07b8, 0x3070) }, + { USB_DEVICE(0x07b8, 0x3071) }, + { USB_DEVICE(0x07b8, 0x3072) }, + { USB_DEVICE(0x1482, 0x3c09) }, + /* AirTies */ + { USB_DEVICE(0x1eda, 0x2012) }, + { USB_DEVICE(0x1eda, 0x2210) }, + { USB_DEVICE(0x1eda, 0x2310) }, + /* Allwin */ + { USB_DEVICE(0x8516, 0x2070) }, + { USB_DEVICE(0x8516, 0x2770) }, + { USB_DEVICE(0x8516, 0x2870) }, + { USB_DEVICE(0x8516, 0x3070) }, + { USB_DEVICE(0x8516, 0x3071) }, + { USB_DEVICE(0x8516, 0x3072) }, + /* Alpha Networks */ + { USB_DEVICE(0x14b2, 0x3c06) }, + { USB_DEVICE(0x14b2, 0x3c07) }, + { USB_DEVICE(0x14b2, 0x3c09) }, + { USB_DEVICE(0x14b2, 0x3c12) }, + { USB_DEVICE(0x14b2, 0x3c23) }, + { USB_DEVICE(0x14b2, 0x3c25) }, + { USB_DEVICE(0x14b2, 0x3c27) }, + { USB_DEVICE(0x14b2, 0x3c28) }, + { USB_DEVICE(0x14b2, 0x3c2c) }, + /* Amit */ + { USB_DEVICE(0x15c5, 0x0008) }, + /* Askey */ + { USB_DEVICE(0x1690, 0x0740) }, + /* ASUS */ + { USB_DEVICE(0x0b05, 0x1731) }, + { USB_DEVICE(0x0b05, 0x1732) }, + { USB_DEVICE(0x0b05, 0x1742) }, + { USB_DEVICE(0x0b05, 0x1784) }, + { USB_DEVICE(0x1761, 0x0b05) }, + /* AzureWave */ + { USB_DEVICE(0x13d3, 0x3247) }, + { USB_DEVICE(0x13d3, 0x3273) }, + { USB_DEVICE(0x13d3, 0x3305) }, + { USB_DEVICE(0x13d3, 0x3307) }, + { USB_DEVICE(0x13d3, 0x3321) }, + /* Belkin */ + { USB_DEVICE(0x050d, 0x8053) }, + { USB_DEVICE(0x050d, 0x805c) }, + { USB_DEVICE(0x050d, 0x815c) }, + { USB_DEVICE(0x050d, 0x825a) }, + { USB_DEVICE(0x050d, 0x825b) }, + { USB_DEVICE(0x050d, 0x935a) }, + { USB_DEVICE(0x050d, 0x935b) }, + /* Buffalo */ + { USB_DEVICE(0x0411, 0x00e8) }, + { USB_DEVICE(0x0411, 0x0158) }, + { USB_DEVICE(0x0411, 0x015d) }, + { USB_DEVICE(0x0411, 0x016f) }, + { USB_DEVICE(0x0411, 0x01a2) }, + { USB_DEVICE(0x0411, 0x01ee) }, + { USB_DEVICE(0x0411, 0x01a8) }, + { USB_DEVICE(0x0411, 0x01fd) }, + /* Corega */ + { USB_DEVICE(0x07aa, 0x002f) }, + { USB_DEVICE(0x07aa, 0x003c) }, + { USB_DEVICE(0x07aa, 0x003f) }, + { USB_DEVICE(0x18c5, 0x0012) }, + /* D-Link */ + { USB_DEVICE(0x07d1, 0x3c09) }, + { USB_DEVICE(0x07d1, 0x3c0a) }, + { USB_DEVICE(0x07d1, 0x3c0d) }, + { USB_DEVICE(0x07d1, 0x3c0e) }, + { USB_DEVICE(0x07d1, 0x3c0f) }, + { USB_DEVICE(0x07d1, 0x3c11) }, + { USB_DEVICE(0x07d1, 0x3c13) }, + { USB_DEVICE(0x07d1, 0x3c15) }, + { USB_DEVICE(0x07d1, 0x3c16) }, + { USB_DEVICE(0x07d1, 0x3c17) }, + { USB_DEVICE(0x2001, 0x3317) }, + { USB_DEVICE(0x2001, 0x3c1b) }, + { USB_DEVICE(0x2001, 0x3c25) }, + /* Draytek */ + { USB_DEVICE(0x07fa, 0x7712) }, + /* DVICO */ + { USB_DEVICE(0x0fe9, 0xb307) }, + /* Edimax */ + { USB_DEVICE(0x7392, 0x4085) }, + { USB_DEVICE(0x7392, 0x7711) }, + { USB_DEVICE(0x7392, 0x7717) }, + { USB_DEVICE(0x7392, 0x7718) }, + { USB_DEVICE(0x7392, 0x7722) }, + /* Encore */ + { USB_DEVICE(0x203d, 0x1480) }, + { USB_DEVICE(0x203d, 0x14a9) }, + /* EnGenius */ + { USB_DEVICE(0x1740, 0x9701) }, + { USB_DEVICE(0x1740, 0x9702) }, + { USB_DEVICE(0x1740, 0x9703) }, + { USB_DEVICE(0x1740, 0x9705) }, + { USB_DEVICE(0x1740, 0x9706) }, + { USB_DEVICE(0x1740, 0x9707) }, + { USB_DEVICE(0x1740, 0x9708) }, + { USB_DEVICE(0x1740, 0x9709) }, + /* Gemtek */ + { USB_DEVICE(0x15a9, 0x0012) }, + /* Gigabyte */ + { USB_DEVICE(0x1044, 0x800b) }, + { USB_DEVICE(0x1044, 0x800d) }, + /* Hawking */ + { USB_DEVICE(0x0e66, 0x0001) }, + { USB_DEVICE(0x0e66, 0x0003) }, + { USB_DEVICE(0x0e66, 0x0009) }, + { USB_DEVICE(0x0e66, 0x000b) }, + { USB_DEVICE(0x0e66, 0x0013) }, + { USB_DEVICE(0x0e66, 0x0017) }, + { USB_DEVICE(0x0e66, 0x0018) }, + /* I-O DATA */ + { USB_DEVICE(0x04bb, 0x0945) }, + { USB_DEVICE(0x04bb, 0x0947) }, + { USB_DEVICE(0x04bb, 0x0948) }, + /* Linksys */ + { USB_DEVICE(0x13b1, 0x0031) }, + { USB_DEVICE(0x1737, 0x0070) }, + { USB_DEVICE(0x1737, 0x0071) }, + { USB_DEVICE(0x1737, 0x0077) }, + { USB_DEVICE(0x1737, 0x0078) }, + /* Logitec */ + { USB_DEVICE(0x0789, 0x0162) }, + { USB_DEVICE(0x0789, 0x0163) }, + { USB_DEVICE(0x0789, 0x0164) }, + { USB_DEVICE(0x0789, 0x0166) }, + /* Motorola */ + { USB_DEVICE(0x100d, 0x9031) }, + /* MSI */ + { USB_DEVICE(0x0db0, 0x3820) }, + { USB_DEVICE(0x0db0, 0x3821) }, + { USB_DEVICE(0x0db0, 0x3822) }, + { USB_DEVICE(0x0db0, 0x3870) }, + { USB_DEVICE(0x0db0, 0x3871) }, + { USB_DEVICE(0x0db0, 0x6899) }, + { USB_DEVICE(0x0db0, 0x821a) }, + { USB_DEVICE(0x0db0, 0x822a) }, + { USB_DEVICE(0x0db0, 0x822b) }, + { USB_DEVICE(0x0db0, 0x822c) }, + { USB_DEVICE(0x0db0, 0x870a) }, + { USB_DEVICE(0x0db0, 0x871a) }, + { USB_DEVICE(0x0db0, 0x871b) }, + { USB_DEVICE(0x0db0, 0x871c) }, + { USB_DEVICE(0x0db0, 0x899a) }, + /* Ovislink */ + { USB_DEVICE(0x1b75, 0x3070) }, + { USB_DEVICE(0x1b75, 0x3071) }, + { USB_DEVICE(0x1b75, 0x3072) }, + { USB_DEVICE(0x1b75, 0xa200) }, + /* Para */ + { USB_DEVICE(0x20b8, 0x8888) }, + /* Pegatron */ + { USB_DEVICE(0x1d4d, 0x0002) }, + { USB_DEVICE(0x1d4d, 0x000c) }, + { USB_DEVICE(0x1d4d, 0x000e) }, + { USB_DEVICE(0x1d4d, 0x0011) }, + /* Philips */ + { USB_DEVICE(0x0471, 0x200f) }, + /* Planex */ + { USB_DEVICE(0x2019, 0x5201) }, + { USB_DEVICE(0x2019, 0xab25) }, + { USB_DEVICE(0x2019, 0xed06) }, + /* Quanta */ + { USB_DEVICE(0x1a32, 0x0304) }, + /* Ralink */ + { USB_DEVICE(0x148f, 0x2070) }, + { USB_DEVICE(0x148f, 0x2770) }, + { USB_DEVICE(0x148f, 0x2870) }, + { USB_DEVICE(0x148f, 0x3070) }, + { USB_DEVICE(0x148f, 0x3071) }, + { USB_DEVICE(0x148f, 0x3072) }, + /* Samsung */ + { USB_DEVICE(0x04e8, 0x2018) }, + /* Siemens */ + { USB_DEVICE(0x129b, 0x1828) }, + /* Sitecom */ + { USB_DEVICE(0x0df6, 0x0017) }, + { USB_DEVICE(0x0df6, 0x002b) }, + { USB_DEVICE(0x0df6, 0x002c) }, + { USB_DEVICE(0x0df6, 0x002d) }, + { USB_DEVICE(0x0df6, 0x0039) }, + { USB_DEVICE(0x0df6, 0x003b) }, + { USB_DEVICE(0x0df6, 0x003d) }, + { USB_DEVICE(0x0df6, 0x003e) }, + { USB_DEVICE(0x0df6, 0x003f) }, + { USB_DEVICE(0x0df6, 0x0040) }, + { USB_DEVICE(0x0df6, 0x0042) }, + { USB_DEVICE(0x0df6, 0x0047) }, + { USB_DEVICE(0x0df6, 0x0048) }, + { USB_DEVICE(0x0df6, 0x0051) }, + { USB_DEVICE(0x0df6, 0x005f) }, + { USB_DEVICE(0x0df6, 0x0060) }, + /* SMC */ + { USB_DEVICE(0x083a, 0x6618) }, + { USB_DEVICE(0x083a, 0x7511) }, + { USB_DEVICE(0x083a, 0x7512) }, + { USB_DEVICE(0x083a, 0x7522) }, + { USB_DEVICE(0x083a, 0x8522) }, + { USB_DEVICE(0x083a, 0xa618) }, + { USB_DEVICE(0x083a, 0xa701) }, + { USB_DEVICE(0x083a, 0xa702) }, + { USB_DEVICE(0x083a, 0xa703) }, + { USB_DEVICE(0x083a, 0xb522) }, + /* Sparklan */ + { USB_DEVICE(0x15a9, 0x0006) }, + /* Sweex */ + { USB_DEVICE(0x177f, 0x0153) }, + { USB_DEVICE(0x177f, 0x0164) }, + { USB_DEVICE(0x177f, 0x0302) }, + { USB_DEVICE(0x177f, 0x0313) }, + { USB_DEVICE(0x177f, 0x0323) }, + { USB_DEVICE(0x177f, 0x0324) }, + /* U-Media */ + { USB_DEVICE(0x157e, 0x300e) }, + { USB_DEVICE(0x157e, 0x3013) }, + /* ZCOM */ + { USB_DEVICE(0x0cde, 0x0022) }, + { USB_DEVICE(0x0cde, 0x0025) }, + /* Zinwell */ + { USB_DEVICE(0x5a57, 0x0280) }, + { USB_DEVICE(0x5a57, 0x0282) }, + { USB_DEVICE(0x5a57, 0x0283) }, + { USB_DEVICE(0x5a57, 0x5257) }, + /* Zyxel */ + { USB_DEVICE(0x0586, 0x3416) }, + { USB_DEVICE(0x0586, 0x3418) }, + { USB_DEVICE(0x0586, 0x341a) }, + { USB_DEVICE(0x0586, 0x341e) }, + { USB_DEVICE(0x0586, 0x343e) }, +#ifdef CONFIG_RT2800USB_RT33XX + /* Belkin */ + { USB_DEVICE(0x050d, 0x945b) }, + /* D-Link */ + { USB_DEVICE(0x2001, 0x3c17) }, + /* Panasonic */ + { USB_DEVICE(0x083a, 0xb511) }, + /* Accton/Arcadyan/Epson */ + { USB_DEVICE(0x083a, 0xb512) }, + /* Philips */ + { USB_DEVICE(0x0471, 0x20dd) }, + /* Ralink */ + { USB_DEVICE(0x148f, 0x3370) }, + { USB_DEVICE(0x148f, 0x8070) }, + /* Sitecom */ + { USB_DEVICE(0x0df6, 0x0050) }, + /* Sweex */ + { USB_DEVICE(0x177f, 0x0163) }, + { USB_DEVICE(0x177f, 0x0165) }, +#endif +#ifdef CONFIG_RT2800USB_RT35XX + /* Allwin */ + { USB_DEVICE(0x8516, 0x3572) }, + /* Askey */ + { USB_DEVICE(0x1690, 0x0744) }, + { USB_DEVICE(0x1690, 0x0761) }, + { USB_DEVICE(0x1690, 0x0764) }, + /* ASUS */ + { USB_DEVICE(0x0b05, 0x179d) }, + /* Cisco */ + { USB_DEVICE(0x167b, 0x4001) }, + /* EnGenius */ + { USB_DEVICE(0x1740, 0x9801) }, + /* I-O DATA */ + { USB_DEVICE(0x04bb, 0x0944) }, + /* Linksys */ + { USB_DEVICE(0x13b1, 0x002f) }, + { USB_DEVICE(0x1737, 0x0079) }, + /* Logitec */ + { USB_DEVICE(0x0789, 0x0170) }, + /* Ralink */ + { USB_DEVICE(0x148f, 0x3572) }, + /* Sitecom */ + { USB_DEVICE(0x0df6, 0x0041) }, + { USB_DEVICE(0x0df6, 0x0062) }, + { USB_DEVICE(0x0df6, 0x0065) }, + { USB_DEVICE(0x0df6, 0x0066) }, + { USB_DEVICE(0x0df6, 0x0068) }, + /* Toshiba */ + { USB_DEVICE(0x0930, 0x0a07) }, + /* Zinwell */ + { USB_DEVICE(0x5a57, 0x0284) }, +#endif +#ifdef CONFIG_RT2800USB_RT3573 + /* AirLive */ + { USB_DEVICE(0x1b75, 0x7733) }, + /* ASUS */ + { USB_DEVICE(0x0b05, 0x17bc) }, + { USB_DEVICE(0x0b05, 0x17ad) }, + /* Belkin */ + { USB_DEVICE(0x050d, 0x1103) }, + /* Cameo */ + { USB_DEVICE(0x148f, 0xf301) }, + /* D-Link */ + { USB_DEVICE(0x2001, 0x3c1f) }, + /* Edimax */ + { USB_DEVICE(0x7392, 0x7733) }, + /* Hawking */ + { USB_DEVICE(0x0e66, 0x0020) }, + { USB_DEVICE(0x0e66, 0x0021) }, + /* I-O DATA */ + { USB_DEVICE(0x04bb, 0x094e) }, + /* Linksys */ + { USB_DEVICE(0x13b1, 0x003b) }, + /* Logitec */ + { USB_DEVICE(0x0789, 0x016b) }, + /* NETGEAR */ + { USB_DEVICE(0x0846, 0x9012) }, + { USB_DEVICE(0x0846, 0x9013) }, + { USB_DEVICE(0x0846, 0x9019) }, + /* Planex */ + { USB_DEVICE(0x2019, 0xed19) }, + /* Ralink */ + { USB_DEVICE(0x148f, 0x3573) }, + /* Sitecom */ + { USB_DEVICE(0x0df6, 0x0067) }, + { USB_DEVICE(0x0df6, 0x006a) }, + { USB_DEVICE(0x0df6, 0x006e) }, + /* ZyXEL */ + { USB_DEVICE(0x0586, 0x3421) }, +#endif +#ifdef CONFIG_RT2800USB_RT53XX + /* Arcadyan */ + { USB_DEVICE(0x043e, 0x7a12) }, + { USB_DEVICE(0x043e, 0x7a32) }, + /* ASUS */ + { USB_DEVICE(0x0b05, 0x17e8) }, + /* Azurewave */ + { USB_DEVICE(0x13d3, 0x3329) }, + { USB_DEVICE(0x13d3, 0x3365) }, + /* D-Link */ + { USB_DEVICE(0x2001, 0x3c15) }, + { USB_DEVICE(0x2001, 0x3c19) }, + { USB_DEVICE(0x2001, 0x3c1c) }, + { USB_DEVICE(0x2001, 0x3c1d) }, + { USB_DEVICE(0x2001, 0x3c1e) }, + { USB_DEVICE(0x2001, 0x3c20) }, + { USB_DEVICE(0x2001, 0x3c22) }, + { USB_DEVICE(0x2001, 0x3c23) }, + /* LG innotek */ + { USB_DEVICE(0x043e, 0x7a22) }, + { USB_DEVICE(0x043e, 0x7a42) }, + /* Panasonic */ + { USB_DEVICE(0x04da, 0x1801) }, + { USB_DEVICE(0x04da, 0x1800) }, + { USB_DEVICE(0x04da, 0x23f6) }, + /* Philips */ + { USB_DEVICE(0x0471, 0x2104) }, + { USB_DEVICE(0x0471, 0x2126) }, + { USB_DEVICE(0x0471, 0x2180) }, + { USB_DEVICE(0x0471, 0x2181) }, + { USB_DEVICE(0x0471, 0x2182) }, + /* Ralink */ + { USB_DEVICE(0x148f, 0x5370) }, + { USB_DEVICE(0x148f, 0x5372) }, +#endif +#ifdef CONFIG_RT2800USB_RT55XX + /* Arcadyan */ + { USB_DEVICE(0x043e, 0x7a32) }, + /* AVM GmbH */ + { USB_DEVICE(0x057c, 0x8501) }, + /* Buffalo */ + { USB_DEVICE(0x0411, 0x0241) }, + { USB_DEVICE(0x0411, 0x0253) }, + /* D-Link */ + { USB_DEVICE(0x2001, 0x3c1a) }, + { USB_DEVICE(0x2001, 0x3c21) }, + /* Proware */ + { USB_DEVICE(0x043e, 0x7a13) }, + /* Ralink */ + { USB_DEVICE(0x148f, 0x5572) }, + /* TRENDnet */ + { USB_DEVICE(0x20f4, 0x724a) }, +#endif +#ifdef CONFIG_RT2800USB_UNKNOWN + /* + * Unclear what kind of devices these are (they aren't supported by the + * vendor linux driver). + */ + /* Abocom */ + { USB_DEVICE(0x07b8, 0x3073) }, + { USB_DEVICE(0x07b8, 0x3074) }, + /* Alpha Networks */ + { USB_DEVICE(0x14b2, 0x3c08) }, + { USB_DEVICE(0x14b2, 0x3c11) }, + /* Amigo */ + { USB_DEVICE(0x0e0b, 0x9031) }, + { USB_DEVICE(0x0e0b, 0x9041) }, + /* ASUS */ + { USB_DEVICE(0x0b05, 0x166a) }, + { USB_DEVICE(0x0b05, 0x1760) }, + { USB_DEVICE(0x0b05, 0x1761) }, + { USB_DEVICE(0x0b05, 0x1790) }, + { USB_DEVICE(0x0b05, 0x17a7) }, + /* AzureWave */ + { USB_DEVICE(0x13d3, 0x3262) }, + { USB_DEVICE(0x13d3, 0x3284) }, + { USB_DEVICE(0x13d3, 0x3322) }, + { USB_DEVICE(0x13d3, 0x3340) }, + { USB_DEVICE(0x13d3, 0x3399) }, + { USB_DEVICE(0x13d3, 0x3400) }, + { USB_DEVICE(0x13d3, 0x3401) }, + /* Belkin */ + { USB_DEVICE(0x050d, 0x1003) }, + /* Buffalo */ + { USB_DEVICE(0x0411, 0x012e) }, + { USB_DEVICE(0x0411, 0x0148) }, + { USB_DEVICE(0x0411, 0x0150) }, + /* Corega */ + { USB_DEVICE(0x07aa, 0x0041) }, + { USB_DEVICE(0x07aa, 0x0042) }, + { USB_DEVICE(0x18c5, 0x0008) }, + /* D-Link */ + { USB_DEVICE(0x07d1, 0x3c0b) }, + /* Encore */ + { USB_DEVICE(0x203d, 0x14a1) }, + /* EnGenius */ + { USB_DEVICE(0x1740, 0x0600) }, + { USB_DEVICE(0x1740, 0x0602) }, + /* Gemtek */ + { USB_DEVICE(0x15a9, 0x0010) }, + /* Gigabyte */ + { USB_DEVICE(0x1044, 0x800c) }, + /* Hercules */ + { USB_DEVICE(0x06f8, 0xe036) }, + /* Huawei */ + { USB_DEVICE(0x148f, 0xf101) }, + /* I-O DATA */ + { USB_DEVICE(0x04bb, 0x094b) }, + /* LevelOne */ + { USB_DEVICE(0x1740, 0x0605) }, + { USB_DEVICE(0x1740, 0x0615) }, + /* Logitec */ + { USB_DEVICE(0x0789, 0x0168) }, + { USB_DEVICE(0x0789, 0x0169) }, + /* Motorola */ + { USB_DEVICE(0x100d, 0x9032) }, + /* Pegatron */ + { USB_DEVICE(0x05a6, 0x0101) }, + { USB_DEVICE(0x1d4d, 0x0010) }, + /* Planex */ + { USB_DEVICE(0x2019, 0xab24) }, + { USB_DEVICE(0x2019, 0xab29) }, + /* Qcom */ + { USB_DEVICE(0x18e8, 0x6259) }, + /* RadioShack */ + { USB_DEVICE(0x08b9, 0x1197) }, + /* Sitecom */ + { USB_DEVICE(0x0df6, 0x003c) }, + { USB_DEVICE(0x0df6, 0x004a) }, + { USB_DEVICE(0x0df6, 0x004d) }, + { USB_DEVICE(0x0df6, 0x0053) }, + { USB_DEVICE(0x0df6, 0x0069) }, + { USB_DEVICE(0x0df6, 0x006f) }, + { USB_DEVICE(0x0df6, 0x0078) }, + /* SMC */ + { USB_DEVICE(0x083a, 0xa512) }, + { USB_DEVICE(0x083a, 0xc522) }, + { USB_DEVICE(0x083a, 0xd522) }, + { USB_DEVICE(0x083a, 0xf511) }, + /* Sweex */ + { USB_DEVICE(0x177f, 0x0254) }, + /* TP-LINK */ + { USB_DEVICE(0xf201, 0x5370) }, +#endif +}; + +/* + * Firmware functions + */ +int rt2800usb_autorun_detect(struct rt2x00_dev *rt2x00dev) { + __le32 *reg; + u32 fw_mode; + int ret; + + reg = (__le32 *) malloc(sizeof(__le32)); + if (reg == NULL) + return -ENOMEM; + + /* cannot use rt2x00usb_register_read here as it uses different + * mode (MULTI_READ vs. DEVICE_MODE) and does not pass the + * magic value USB_MODE_AUTORUN (0x11) to the device, thus the + * returned value would be invalid. + */ + ret = rt2x00usb_vendor_request(rt2x00dev, USB_DEVICE_MODE, + USB_VENDOR_REQUEST_IN, 0, + USB_MODE_AUTORUN, reg, sizeof(__le32), + REGISTER_TIMEOUT_FIRMWARE); + fw_mode = le32_to_cpu(*reg); + + free(reg); + + if (ret < 0) + return ret; + + if ((fw_mode & 0x00000003) == 2) + return 1; + + return 0; +} + +static char *rt2800usb_get_firmware_name(struct rt2x00_dev *rt2x00dev) { + return FIRMWARE_RT2870; +} + +static int rt2800usb_write_firmware(struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len) { + int status; + u32 offset; + u32 length; + int retval; + + /* + * Check which section of the firmware we need. + */ + if (rt2x00_rt(rt2x00dev, RT2860) || + rt2x00_rt(rt2x00dev, RT2872) || + rt2x00_rt(rt2x00dev, RT3070)) { + offset = 0; + length = 4096; + } else { + offset = 4096; + length = 4096; + } + + /* + * Write firmware to device. + */ + retval = rt2800usb_autorun_detect(rt2x00dev); + if (retval < 0) + return retval; + if (retval) { + rt2x00_info(rt2x00dev, + "Firmware loading not required - NIC in AutoRun mode\n"); + __clear_bit(REQUIRE_FIRMWARE, &rt2x00dev->cap_flags); + } else { + rt2x00_info(rt2x00dev, "Starting register_multiwrite for FIRMWARE_IMAGE_BASE at offset %d len %d sz %lu\n", offset, length, len); + rt2x00usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE, + data + offset, length); + } + + rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); + rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0); + + /* + * Send firmware request to device to load firmware, + * we need to specify a long timeout time. + */ + status = rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, + 0, USB_MODE_FIRMWARE, + REGISTER_TIMEOUT_FIRMWARE); + if (status < 0) { + rt2x00_err(rt2x00dev, "Failed to write Firmware to device\n"); + return status; + } + + usleep(10); + rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0); + + return 0; +} + +/* + * Userspace modified start queue to only deal with triggering + * the rx registers and dropping the queue changes and linkages, + * modifying the device signature + */ +static void rt2800usb_start_queue(struct rt2x00_dev *rt2x00dev) +{ + u32 reg; + + rt2x00_info(rt2x00dev, "Starting RX queue\n"); + + reg = rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 1); + rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg); +} + +/* + * Userspace modified stop queue to only deal with rx and + * registers, removing the rest and changing the function signature + */ +static void rt2800usb_stop_queue(struct rt2x00_dev *rt2x00dev) +{ + u32 reg; + + rt2x00_info(rt2x00dev, "Stopping RX queue\n"); + + reg = rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL); + rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 0); + rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg); +} + +/* + * Device state switch handlers. + */ +static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev) { + u32 reg; + + rt2x00_info(rt2x00dev, "rt2800usb_init_registers\n"); + + /* + * Wait until BBP and RF are ready. + */ + if (rt2800_wait_csr_ready(rt2x00dev)) + return -EBUSY; + + reg = rt2x00usb_register_read(rt2x00dev, PBF_SYS_CTRL); + rt2x00usb_register_write(rt2x00dev, PBF_SYS_CTRL, reg & ~0x00002000); + + reg = 0; + rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_CSR, 1); + rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1); + rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg); + + rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0, + USB_MODE_RESET, REGISTER_TIMEOUT); + + rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); + + return 0; +} + +static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) { + u32 reg = 0; + + if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev))) + return -EIO; + + rt2x00_set_field32(®, USB_DMA_CFG_PHY_CLEAR, 0); + rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_EN, 0); + rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_TIMEOUT, 128); + /* + * Total room for RX frames in kilobytes, PBF might still exceed + * this limit so reduce the number to prevent errors. + */ + + /* + * We don't implement real skb and queues and such in userspace + * so hardcode the rt2x00dev->rx->limit queue to 128 + */ + rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_LIMIT, + ((128 * DATA_FRAME_SIZE) + / 1024) - 3); + rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_EN, 1); + rt2x00_set_field32(®, USB_DMA_CFG_TX_BULK_EN, 1); + rt2x00usb_register_write(rt2x00dev, USB_DMA_CFG, reg); + + return rt2800_enable_radio(rt2x00dev); +} + +static void rt2800usb_disable_radio(struct rt2x00_dev *rt2x00dev) { + rt2800_disable_radio(rt2x00dev); +} + +static int rt2800usb_set_state(struct rt2x00_dev *rt2x00dev, + enum dev_state state) { + if (state == STATE_AWAKE) + rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 2); + else + rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0xff, 2); + + return 0; +} + +static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev, + enum dev_state state) { + int retval = 0; + + switch (state) { + case STATE_RADIO_ON: + rt2x00_info(rt2x00dev, "Setting radio on\n"); + /* + * Before the radio can be enabled, the device first has + * to be woken up. After that it needs a bit of time + * to be fully awake and then the radio can be enabled. + */ + rt2800usb_set_state(rt2x00dev, STATE_AWAKE); + msleep(1); + retval = rt2800usb_enable_radio(rt2x00dev); + break; + case STATE_RADIO_OFF: + rt2x00_info(rt2x00dev, "Setting radio off\n"); + /* + * After the radio has been disabled, the device should + * be put to sleep for powersaving. + */ + rt2800usb_disable_radio(rt2x00dev); + rt2800usb_set_state(rt2x00dev, STATE_SLEEP); + break; + case STATE_RADIO_IRQ_ON: + case STATE_RADIO_IRQ_OFF: + /* No support, but no error either */ + break; + case STATE_DEEP_SLEEP: + case STATE_SLEEP: + case STATE_STANDBY: + case STATE_AWAKE: + rt2x00_info(rt2x00dev, "Setting state awake/standby/sleep\n"); + retval = rt2800usb_set_state(rt2x00dev, state); + break; + default: + retval = -ENOTSUPP; + break; + } + + if (unlikely(retval)) + rt2x00_err(rt2x00dev, "Device failed to enter state %d (%d)\n", + state, retval); + + return retval; +} + +/* + * Device probe functions. + */ +static int rt2800usb_efuse_detect(struct rt2x00_dev *rt2x00dev) { + int retval; + + retval = rt2800usb_autorun_detect(rt2x00dev); + if (retval < 0) + return retval; + if (retval) + return 1; + return rt2800_efuse_detect(rt2x00dev); +} + +static int rt2800usb_read_eeprom(struct rt2x00_dev *rt2x00dev) { + int retval; + + retval = rt2800usb_efuse_detect(rt2x00dev); + if (retval < 0) + return retval; + if (retval) + retval = rt2800_read_eeprom_efuse(rt2x00dev); + else + retval = rt2x00usb_eeprom_read(rt2x00dev, rt2x00dev->eeprom, + EEPROM_SIZE); + + return retval; +} + +static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = { + [EEPROM_CHIP_ID] = 0x0000, + [EEPROM_VERSION] = 0x0001, + [EEPROM_MAC_ADDR_0] = 0x0002, + [EEPROM_MAC_ADDR_1] = 0x0003, + [EEPROM_MAC_ADDR_2] = 0x0004, + [EEPROM_NIC_CONF0] = 0x001a, + [EEPROM_NIC_CONF1] = 0x001b, + [EEPROM_FREQ] = 0x001d, + [EEPROM_LED_AG_CONF] = 0x001e, + [EEPROM_LED_ACT_CONF] = 0x001f, + [EEPROM_LED_POLARITY] = 0x0020, + [EEPROM_NIC_CONF2] = 0x0021, + [EEPROM_LNA] = 0x0022, + [EEPROM_RSSI_BG] = 0x0023, + [EEPROM_RSSI_BG2] = 0x0024, + [EEPROM_TXMIXER_GAIN_BG] = 0x0024, /* overlaps with RSSI_BG2 */ + [EEPROM_RSSI_A] = 0x0025, + [EEPROM_RSSI_A2] = 0x0026, + [EEPROM_TXMIXER_GAIN_A] = 0x0026, /* overlaps with RSSI_A2 */ + [EEPROM_EIRP_MAX_TX_POWER] = 0x0027, + [EEPROM_TXPOWER_DELTA] = 0x0028, + [EEPROM_TXPOWER_BG1] = 0x0029, + [EEPROM_TXPOWER_BG2] = 0x0030, + [EEPROM_TSSI_BOUND_BG1] = 0x0037, + [EEPROM_TSSI_BOUND_BG2] = 0x0038, + [EEPROM_TSSI_BOUND_BG3] = 0x0039, + [EEPROM_TSSI_BOUND_BG4] = 0x003a, + [EEPROM_TSSI_BOUND_BG5] = 0x003b, + [EEPROM_TXPOWER_A1] = 0x003c, + [EEPROM_TXPOWER_A2] = 0x0053, + [EEPROM_TXPOWER_INIT] = 0x0068, + [EEPROM_TSSI_BOUND_A1] = 0x006a, + [EEPROM_TSSI_BOUND_A2] = 0x006b, + [EEPROM_TSSI_BOUND_A3] = 0x006c, + [EEPROM_TSSI_BOUND_A4] = 0x006d, + [EEPROM_TSSI_BOUND_A5] = 0x006e, + [EEPROM_TXPOWER_BYRATE] = 0x006f, + [EEPROM_BBP_START] = 0x0078, +}; + +static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = { + [EEPROM_CHIP_ID] = 0x0000, + [EEPROM_VERSION] = 0x0001, + [EEPROM_MAC_ADDR_0] = 0x0002, + [EEPROM_MAC_ADDR_1] = 0x0003, + [EEPROM_MAC_ADDR_2] = 0x0004, + [EEPROM_NIC_CONF0] = 0x001a, + [EEPROM_NIC_CONF1] = 0x001b, + [EEPROM_NIC_CONF2] = 0x001c, + [EEPROM_EIRP_MAX_TX_POWER] = 0x0020, + [EEPROM_FREQ] = 0x0022, + [EEPROM_LED_AG_CONF] = 0x0023, + [EEPROM_LED_ACT_CONF] = 0x0024, + [EEPROM_LED_POLARITY] = 0x0025, + [EEPROM_LNA] = 0x0026, + [EEPROM_EXT_LNA2] = 0x0027, + [EEPROM_RSSI_BG] = 0x0028, + [EEPROM_RSSI_BG2] = 0x0029, + [EEPROM_RSSI_A] = 0x002a, + [EEPROM_RSSI_A2] = 0x002b, + [EEPROM_TXPOWER_BG1] = 0x0030, + [EEPROM_TXPOWER_BG2] = 0x0037, + [EEPROM_EXT_TXPOWER_BG3] = 0x003e, + [EEPROM_TSSI_BOUND_BG1] = 0x0045, + [EEPROM_TSSI_BOUND_BG2] = 0x0046, + [EEPROM_TSSI_BOUND_BG3] = 0x0047, + [EEPROM_TSSI_BOUND_BG4] = 0x0048, + [EEPROM_TSSI_BOUND_BG5] = 0x0049, + [EEPROM_TXPOWER_A1] = 0x004b, + [EEPROM_TXPOWER_A2] = 0x0065, + [EEPROM_EXT_TXPOWER_A3] = 0x007f, + [EEPROM_TSSI_BOUND_A1] = 0x009a, + [EEPROM_TSSI_BOUND_A2] = 0x009b, + [EEPROM_TSSI_BOUND_A3] = 0x009c, + [EEPROM_TSSI_BOUND_A4] = 0x009d, + [EEPROM_TSSI_BOUND_A5] = 0x009e, + [EEPROM_TXPOWER_BYRATE] = 0x00a0, +}; + +static unsigned int rt2800_eeprom_word_index(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word) +{ + const unsigned int *map; + unsigned int index; + + if (word >= EEPROM_WORD_COUNT) { + rt2x00_info(rt2x00dev, "invalid EEPROM word %d\n", word); + return 0; + } + + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) + map = rt2800_eeprom_map_ext; + else + map = rt2800_eeprom_map; + + index = map[word]; + + /* Index 0 is valid only for EEPROM_CHIP_ID. + * Otherwise it means that the offset of the + * given word is not initialized in the map, + * or that the field is not usable on the + * actual chipset. + */ + WARN_ONCE(word != EEPROM_CHIP_ID && index == 0, + "invalid access of EEPROM word %d\n", word); + + return index; +} + +#if 0 +static void *rt2800_eeprom_addr(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word) +{ + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, word); + return rt2x00_eeprom_addr(rt2x00dev, index); +} +#endif + +static u16 rt2800_eeprom_read(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word) +{ + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, word); + return rt2x00_eeprom_read(rt2x00dev, index); +} + +#if 0 +static void rt2800_eeprom_write(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word word, u16 data) +{ + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, word); + rt2x00_eeprom_write(rt2x00dev, index, data); +} + +static u16 rt2800_eeprom_read_from_array(struct rt2x00_dev *rt2x00dev, + const enum rt2800_eeprom_word array, + unsigned int offset) +{ + unsigned int index; + + index = rt2800_eeprom_word_index(rt2x00dev, array); + return rt2x00_eeprom_read(rt2x00dev, index + offset); +} +#endif + +/* + * Driver initialization handlers. + */ +const struct rt2x00_rate rt2x00_supported_rates[12] = { + { + .flags = DEV_RATE_CCK, + .bitrate = 10, + .ratemask = BIT(0), + .plcp = 0x00, + .mcs = RATE_MCS(RATE_MODE_CCK, 0), + }, + { + .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE, + .bitrate = 20, + .ratemask = BIT(1), + .plcp = 0x01, + .mcs = RATE_MCS(RATE_MODE_CCK, 1), + }, + { + .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE, + .bitrate = 55, + .ratemask = BIT(2), + .plcp = 0x02, + .mcs = RATE_MCS(RATE_MODE_CCK, 2), + }, + { + .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE, + .bitrate = 110, + .ratemask = BIT(3), + .plcp = 0x03, + .mcs = RATE_MCS(RATE_MODE_CCK, 3), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 60, + .ratemask = BIT(4), + .plcp = 0x0b, + .mcs = RATE_MCS(RATE_MODE_OFDM, 0), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 90, + .ratemask = BIT(5), + .plcp = 0x0f, + .mcs = RATE_MCS(RATE_MODE_OFDM, 1), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 120, + .ratemask = BIT(6), + .plcp = 0x0a, + .mcs = RATE_MCS(RATE_MODE_OFDM, 2), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 180, + .ratemask = BIT(7), + .plcp = 0x0e, + .mcs = RATE_MCS(RATE_MODE_OFDM, 3), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 240, + .ratemask = BIT(8), + .plcp = 0x09, + .mcs = RATE_MCS(RATE_MODE_OFDM, 4), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 360, + .ratemask = BIT(9), + .plcp = 0x0d, + .mcs = RATE_MCS(RATE_MODE_OFDM, 5), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 480, + .ratemask = BIT(10), + .plcp = 0x08, + .mcs = RATE_MCS(RATE_MODE_OFDM, 6), + }, + { + .flags = DEV_RATE_OFDM, + .bitrate = 540, + .ratemask = BIT(11), + .plcp = 0x0c, + .mcs = RATE_MCS(RATE_MODE_OFDM, 7), + }, +}; + +static void rt2x00lib_channel(struct ieee80211_channel *entry, + const int channel, const int tx_power, + const int value) +{ + /* XXX: this assumption about the band is wrong for 802.11j */ + entry->band = channel <= 14 ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ; + entry->center_freq = ieee80211_channel_to_frequency(channel, + entry->band); + entry->hw_value = value; + entry->max_power = tx_power; + entry->max_antenna_gain = 0xff; +} + +static void rt2x00lib_rate(struct ieee80211_rate *entry, + const u16 index, const struct rt2x00_rate *rate) +{ + entry->flags = 0; + entry->bitrate = rate->bitrate; + entry->hw_value = index; + entry->hw_value_short = index; + + if (rate->flags & DEV_RATE_SHORT_PREAMBLE) + entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE; +} + + +static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev, + struct hw_mode_spec *spec) +{ + struct ieee80211_channel *channels; + struct ieee80211_rate *rates; + unsigned int num_rates; + unsigned int i; + + /* + * Modified to set the local copy of the bands but not populate an ieeehw + * record since we don't talk to the hw stack + */ + + num_rates = 0; + if (spec->supported_rates & SUPPORT_RATE_CCK) + num_rates += 4; + if (spec->supported_rates & SUPPORT_RATE_OFDM) + num_rates += 8; + + channels = (struct ieee80211_channel *) kcalloc(spec->num_channels, sizeof(struct ieee80211_channel), GFP_KERNEL); + if (!channels) + return -ENOMEM; + + rates = (struct ieee80211_rate *) kcalloc(num_rates, sizeof(struct ieee80211_rate), GFP_KERNEL); + if (!rates) + goto exit_free_channels; + + /* + * Initialize Rate list. + */ + for (i = 0; i < num_rates; i++) + rt2x00lib_rate(&rates[i], i, rt2x00_get_rate(i)); + + /* + * Initialize Channel list. + */ + for (i = 0; i < spec->num_channels; i++) { + rt2x00lib_channel(&channels[i], + spec->channels[i].channel, + spec->channels_info[i].max_power, i); + } + + /* + * Intitialize 802.11b, 802.11g + * Rates: CCK, OFDM. + * Channels: 2.4 GHz + */ + if (spec->supported_bands & SUPPORT_BAND_2GHZ) { + rt2x00dev->bands[NL80211_BAND_2GHZ].n_channels = 14; + rt2x00dev->bands[NL80211_BAND_2GHZ].n_bitrates = num_rates; + rt2x00dev->bands[NL80211_BAND_2GHZ].channels = channels; + rt2x00dev->bands[NL80211_BAND_2GHZ].bitrates = rates; + } + + /* + * Intitialize 802.11a + * Rates: OFDM. + * Channels: OFDM, UNII, HiperLAN2. + */ + if (spec->supported_bands & SUPPORT_BAND_5GHZ) { + rt2x00dev->bands[NL80211_BAND_5GHZ].n_channels = + spec->num_channels - 14; + rt2x00dev->bands[NL80211_BAND_5GHZ].n_bitrates = + num_rates - 4; + rt2x00dev->bands[NL80211_BAND_5GHZ].channels = &channels[14]; + rt2x00dev->bands[NL80211_BAND_5GHZ].bitrates = &rates[4]; + } + + return 0; + + exit_free_channels: + kfree(channels); + rt2x00_err(rt2x00dev, "Allocation ieee80211 modes failed\n"); + return -ENOMEM; +} + +/* + * RF value list for rt28xx + * Supports: 2.4 GHz (all) & 5.2 GHz (RF2850 & RF2750) + */ +static const struct rf_channel rf_vals[] = { + { 1, 0x18402ecc, 0x184c0786, 0x1816b455, 0x1800510b }, + { 2, 0x18402ecc, 0x184c0786, 0x18168a55, 0x1800519f }, + { 3, 0x18402ecc, 0x184c078a, 0x18168a55, 0x1800518b }, + { 4, 0x18402ecc, 0x184c078a, 0x18168a55, 0x1800519f }, + { 5, 0x18402ecc, 0x184c078e, 0x18168a55, 0x1800518b }, + { 6, 0x18402ecc, 0x184c078e, 0x18168a55, 0x1800519f }, + { 7, 0x18402ecc, 0x184c0792, 0x18168a55, 0x1800518b }, + { 8, 0x18402ecc, 0x184c0792, 0x18168a55, 0x1800519f }, + { 9, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800518b }, + { 10, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800519f }, + { 11, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800518b }, + { 12, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800519f }, + { 13, 0x18402ecc, 0x184c079e, 0x18168a55, 0x1800518b }, + { 14, 0x18402ecc, 0x184c07a2, 0x18168a55, 0x18005193 }, + + /* 802.11 UNI / HyperLan 2 */ + { 36, 0x18402ecc, 0x184c099a, 0x18158a55, 0x180ed1a3 }, + { 38, 0x18402ecc, 0x184c099e, 0x18158a55, 0x180ed193 }, + { 40, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed183 }, + { 44, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed1a3 }, + { 46, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed18b }, + { 48, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed19b }, + { 52, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed193 }, + { 54, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed1a3 }, + { 56, 0x18402ec8, 0x184c068e, 0x18158a55, 0x180ed18b }, + { 60, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed183 }, + { 62, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed193 }, + { 64, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed1a3 }, + + /* 802.11 HyperLan 2 */ + { 100, 0x18402ec8, 0x184c06b2, 0x18178a55, 0x180ed783 }, + { 102, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed793 }, + { 104, 0x18402ec8, 0x185c06b2, 0x18578a55, 0x180ed1a3 }, + { 108, 0x18402ecc, 0x185c0a32, 0x18578a55, 0x180ed193 }, + { 110, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed183 }, + { 112, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed19b }, + { 116, 0x18402ecc, 0x184c0a3a, 0x18178a55, 0x180ed1a3 }, + { 118, 0x18402ecc, 0x184c0a3e, 0x18178a55, 0x180ed193 }, + { 120, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed183 }, + { 124, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed193 }, + { 126, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed15b }, + { 128, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed1a3 }, + { 132, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed18b }, + { 134, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed193 }, + { 136, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed19b }, + { 140, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed183 }, + + /* 802.11 UNII */ + { 149, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed1a7 }, + { 151, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed187 }, + { 153, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed18f }, + { 157, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed19f }, + { 159, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed1a7 }, + { 161, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed187 }, + { 165, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed197 }, + { 167, 0x18402ec4, 0x184c03d2, 0x18179855, 0x1815531f }, + { 169, 0x18402ec4, 0x184c03d2, 0x18179855, 0x18155327 }, + { 171, 0x18402ec4, 0x184c03d6, 0x18179855, 0x18155307 }, + { 173, 0x18402ec4, 0x184c03d6, 0x18179855, 0x1815530f }, + + /* 802.11 Japan */ + { 184, 0x15002ccc, 0x1500491e, 0x1509be55, 0x150c0a0b }, + { 188, 0x15002ccc, 0x15004922, 0x1509be55, 0x150c0a13 }, + { 192, 0x15002ccc, 0x15004926, 0x1509be55, 0x150c0a1b }, + { 196, 0x15002ccc, 0x1500492a, 0x1509be55, 0x150c0a23 }, + { 208, 0x15002ccc, 0x1500493a, 0x1509be55, 0x150c0a13 }, + { 212, 0x15002ccc, 0x1500493e, 0x1509be55, 0x150c0a1b }, + { 216, 0x15002ccc, 0x15004982, 0x1509be55, 0x150c0a23 }, +}; + +/* + * RF value list for rt3xxx + * Supports: 2.4 GHz (all) & 5.2 GHz (RF3052 & RF3053) + */ +static const struct rf_channel rf_vals_3x[] = { + {1, 241, 2, 2 }, + {2, 241, 2, 7 }, + {3, 242, 2, 2 }, + {4, 242, 2, 7 }, + {5, 243, 2, 2 }, + {6, 243, 2, 7 }, + {7, 244, 2, 2 }, + {8, 244, 2, 7 }, + {9, 245, 2, 2 }, + {10, 245, 2, 7 }, + {11, 246, 2, 2 }, + {12, 246, 2, 7 }, + {13, 247, 2, 2 }, + {14, 248, 2, 4 }, + + /* 802.11 UNI / HyperLan 2 */ + {36, 0x56, 0, 4}, + {38, 0x56, 0, 6}, + {40, 0x56, 0, 8}, + {44, 0x57, 0, 0}, + {46, 0x57, 0, 2}, + {48, 0x57, 0, 4}, + {52, 0x57, 0, 8}, + {54, 0x57, 0, 10}, + {56, 0x58, 0, 0}, + {60, 0x58, 0, 4}, + {62, 0x58, 0, 6}, + {64, 0x58, 0, 8}, + + /* 802.11 HyperLan 2 */ + {100, 0x5b, 0, 8}, + {102, 0x5b, 0, 10}, + {104, 0x5c, 0, 0}, + {108, 0x5c, 0, 4}, + {110, 0x5c, 0, 6}, + {112, 0x5c, 0, 8}, + {116, 0x5d, 0, 0}, + {118, 0x5d, 0, 2}, + {120, 0x5d, 0, 4}, + {124, 0x5d, 0, 8}, + {126, 0x5d, 0, 10}, + {128, 0x5e, 0, 0}, + {132, 0x5e, 0, 4}, + {134, 0x5e, 0, 6}, + {136, 0x5e, 0, 8}, + {140, 0x5f, 0, 0}, + + /* 802.11 UNII */ + {149, 0x5f, 0, 9}, + {151, 0x5f, 0, 11}, + {153, 0x60, 0, 1}, + {157, 0x60, 0, 5}, + {159, 0x60, 0, 7}, + {161, 0x60, 0, 9}, + {165, 0x61, 0, 1}, + {167, 0x61, 0, 3}, + {169, 0x61, 0, 5}, + {171, 0x61, 0, 7}, + {173, 0x61, 0, 9}, +}; + +/* + * RF value list for rt3xxx with Xtal20MHz + * Supports: 2.4 GHz (all) (RF3322) + */ +static const struct rf_channel rf_vals_3x_xtal20[] = { + {1, 0xE2, 2, 0x14}, + {2, 0xE3, 2, 0x14}, + {3, 0xE4, 2, 0x14}, + {4, 0xE5, 2, 0x14}, + {5, 0xE6, 2, 0x14}, + {6, 0xE7, 2, 0x14}, + {7, 0xE8, 2, 0x14}, + {8, 0xE9, 2, 0x14}, + {9, 0xEA, 2, 0x14}, + {10, 0xEB, 2, 0x14}, + {11, 0xEC, 2, 0x14}, + {12, 0xED, 2, 0x14}, + {13, 0xEE, 2, 0x14}, + {14, 0xF0, 2, 0x18}, +}; + +static const struct rf_channel rf_vals_3853[] = { + {1, 241, 6, 2}, + {2, 241, 6, 7}, + {3, 242, 6, 2}, + {4, 242, 6, 7}, + {5, 243, 6, 2}, + {6, 243, 6, 7}, + {7, 244, 6, 2}, + {8, 244, 6, 7}, + {9, 245, 6, 2}, + {10, 245, 6, 7}, + {11, 246, 6, 2}, + {12, 246, 6, 7}, + {13, 247, 6, 2}, + {14, 248, 6, 4}, + + {36, 0x56, 8, 4}, + {38, 0x56, 8, 6}, + {40, 0x56, 8, 8}, + {44, 0x57, 8, 0}, + {46, 0x57, 8, 2}, + {48, 0x57, 8, 4}, + {52, 0x57, 8, 8}, + {54, 0x57, 8, 10}, + {56, 0x58, 8, 0}, + {60, 0x58, 8, 4}, + {62, 0x58, 8, 6}, + {64, 0x58, 8, 8}, + + {100, 0x5b, 8, 8}, + {102, 0x5b, 8, 10}, + {104, 0x5c, 8, 0}, + {108, 0x5c, 8, 4}, + {110, 0x5c, 8, 6}, + {112, 0x5c, 8, 8}, + {114, 0x5c, 8, 10}, + {116, 0x5d, 8, 0}, + {118, 0x5d, 8, 2}, + {120, 0x5d, 8, 4}, + {124, 0x5d, 8, 8}, + {126, 0x5d, 8, 10}, + {128, 0x5e, 8, 0}, + {132, 0x5e, 8, 4}, + {134, 0x5e, 8, 6}, + {136, 0x5e, 8, 8}, + {140, 0x5f, 8, 0}, + + {149, 0x5f, 8, 9}, + {151, 0x5f, 8, 11}, + {153, 0x60, 8, 1}, + {157, 0x60, 8, 5}, + {159, 0x60, 8, 7}, + {161, 0x60, 8, 9}, + {165, 0x61, 8, 1}, + {167, 0x61, 8, 3}, + {169, 0x61, 8, 5}, + {171, 0x61, 8, 7}, + {173, 0x61, 8, 9}, +}; + +static const struct rf_channel rf_vals_5592_xtal20[] = { + /* Channel, N, K, mod, R */ + {1, 482, 4, 10, 3}, + {2, 483, 4, 10, 3}, + {3, 484, 4, 10, 3}, + {4, 485, 4, 10, 3}, + {5, 486, 4, 10, 3}, + {6, 487, 4, 10, 3}, + {7, 488, 4, 10, 3}, + {8, 489, 4, 10, 3}, + {9, 490, 4, 10, 3}, + {10, 491, 4, 10, 3}, + {11, 492, 4, 10, 3}, + {12, 493, 4, 10, 3}, + {13, 494, 4, 10, 3}, + {14, 496, 8, 10, 3}, + {36, 172, 8, 12, 1}, + {38, 173, 0, 12, 1}, + {40, 173, 4, 12, 1}, + {42, 173, 8, 12, 1}, + {44, 174, 0, 12, 1}, + {46, 174, 4, 12, 1}, + {48, 174, 8, 12, 1}, + {50, 175, 0, 12, 1}, + {52, 175, 4, 12, 1}, + {54, 175, 8, 12, 1}, + {56, 176, 0, 12, 1}, + {58, 176, 4, 12, 1}, + {60, 176, 8, 12, 1}, + {62, 177, 0, 12, 1}, + {64, 177, 4, 12, 1}, + {100, 183, 4, 12, 1}, + {102, 183, 8, 12, 1}, + {104, 184, 0, 12, 1}, + {106, 184, 4, 12, 1}, + {108, 184, 8, 12, 1}, + {110, 185, 0, 12, 1}, + {112, 185, 4, 12, 1}, + {114, 185, 8, 12, 1}, + {116, 186, 0, 12, 1}, + {118, 186, 4, 12, 1}, + {120, 186, 8, 12, 1}, + {122, 187, 0, 12, 1}, + {124, 187, 4, 12, 1}, + {126, 187, 8, 12, 1}, + {128, 188, 0, 12, 1}, + {130, 188, 4, 12, 1}, + {132, 188, 8, 12, 1}, + {134, 189, 0, 12, 1}, + {136, 189, 4, 12, 1}, + {138, 189, 8, 12, 1}, + {140, 190, 0, 12, 1}, + {149, 191, 6, 12, 1}, + {151, 191, 10, 12, 1}, + {153, 192, 2, 12, 1}, + {155, 192, 6, 12, 1}, + {157, 192, 10, 12, 1}, + {159, 193, 2, 12, 1}, + {161, 193, 6, 12, 1}, + {165, 194, 2, 12, 1}, + {184, 164, 0, 12, 1}, + {188, 164, 4, 12, 1}, + {192, 165, 8, 12, 1}, + {196, 166, 0, 12, 1}, +}; + +static const struct rf_channel rf_vals_5592_xtal40[] = { + /* Channel, N, K, mod, R */ + {1, 241, 2, 10, 3}, + {2, 241, 7, 10, 3}, + {3, 242, 2, 10, 3}, + {4, 242, 7, 10, 3}, + {5, 243, 2, 10, 3}, + {6, 243, 7, 10, 3}, + {7, 244, 2, 10, 3}, + {8, 244, 7, 10, 3}, + {9, 245, 2, 10, 3}, + {10, 245, 7, 10, 3}, + {11, 246, 2, 10, 3}, + {12, 246, 7, 10, 3}, + {13, 247, 2, 10, 3}, + {14, 248, 4, 10, 3}, + {36, 86, 4, 12, 1}, + {38, 86, 6, 12, 1}, + {40, 86, 8, 12, 1}, + {42, 86, 10, 12, 1}, + {44, 87, 0, 12, 1}, + {46, 87, 2, 12, 1}, + {48, 87, 4, 12, 1}, + {50, 87, 6, 12, 1}, + {52, 87, 8, 12, 1}, + {54, 87, 10, 12, 1}, + {56, 88, 0, 12, 1}, + {58, 88, 2, 12, 1}, + {60, 88, 4, 12, 1}, + {62, 88, 6, 12, 1}, + {64, 88, 8, 12, 1}, + {100, 91, 8, 12, 1}, + {102, 91, 10, 12, 1}, + {104, 92, 0, 12, 1}, + {106, 92, 2, 12, 1}, + {108, 92, 4, 12, 1}, + {110, 92, 6, 12, 1}, + {112, 92, 8, 12, 1}, + {114, 92, 10, 12, 1}, + {116, 93, 0, 12, 1}, + {118, 93, 2, 12, 1}, + {120, 93, 4, 12, 1}, + {122, 93, 6, 12, 1}, + {124, 93, 8, 12, 1}, + {126, 93, 10, 12, 1}, + {128, 94, 0, 12, 1}, + {130, 94, 2, 12, 1}, + {132, 94, 4, 12, 1}, + {134, 94, 6, 12, 1}, + {136, 94, 8, 12, 1}, + {138, 94, 10, 12, 1}, + {140, 95, 0, 12, 1}, + {149, 95, 9, 12, 1}, + {151, 95, 11, 12, 1}, + {153, 96, 1, 12, 1}, + {155, 96, 3, 12, 1}, + {157, 96, 5, 12, 1}, + {159, 96, 7, 12, 1}, + {161, 96, 9, 12, 1}, + {165, 97, 1, 12, 1}, + {184, 82, 0, 12, 1}, + {188, 82, 4, 12, 1}, + {192, 82, 8, 12, 1}, + {196, 83, 0, 12, 1}, +}; + +static const struct rf_channel rf_vals_7620[] = { + {1, 0x50, 0x99, 0x99, 1}, + {2, 0x50, 0x44, 0x44, 2}, + {3, 0x50, 0xEE, 0xEE, 2}, + {4, 0x50, 0x99, 0x99, 3}, + {5, 0x51, 0x44, 0x44, 0}, + {6, 0x51, 0xEE, 0xEE, 0}, + {7, 0x51, 0x99, 0x99, 1}, + {8, 0x51, 0x44, 0x44, 2}, + {9, 0x51, 0xEE, 0xEE, 2}, + {10, 0x51, 0x99, 0x99, 3}, + {11, 0x52, 0x44, 0x44, 0}, + {12, 0x52, 0xEE, 0xEE, 0}, + {13, 0x52, 0x99, 0x99, 1}, + {14, 0x52, 0x33, 0x33, 3}, +}; + +static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) +{ + struct hw_mode_spec *spec = &rt2x00dev->spec; + struct channel_info *info; + unsigned int tx_chains, rx_chains; + u32 reg; + + /* + * Gutted for userspace mode + * */ + + /* + * Initialize hw_mode information. + */ + spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM; + + switch (rt2x00dev->chip.rf) { + case RF2720: + case RF2820: + spec->num_channels = 14; + spec->channels = rf_vals; + break; + + case RF2750: + case RF2850: + spec->num_channels = ARRAY_SIZE(rf_vals); + spec->channels = rf_vals; + break; + + case RF2020: + case RF3020: + case RF3021: + case RF3022: + case RF3070: + case RF3290: + case RF3320: + case RF3322: + case RF5350: + case RF5360: + case RF5362: + case RF5370: + case RF5372: + case RF5390: + case RF5392: + spec->num_channels = 14; + if (rt2800_clk_is_20mhz(rt2x00dev)) + spec->channels = rf_vals_3x_xtal20; + else + spec->channels = rf_vals_3x; + break; + + case RF7620: + spec->num_channels = ARRAY_SIZE(rf_vals_7620); + spec->channels = rf_vals_7620; + break; + + case RF3052: + case RF3053: + spec->num_channels = ARRAY_SIZE(rf_vals_3x); + spec->channels = rf_vals_3x; + break; + + case RF3853: + spec->num_channels = ARRAY_SIZE(rf_vals_3853); + spec->channels = rf_vals_3853; + break; + + case RF5592: + reg = rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX); + if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) { + spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal40); + spec->channels = rf_vals_5592_xtal40; + } else { + spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal20); + spec->channels = rf_vals_5592_xtal20; + } + break; + } + + if (WARN_ON_ONCE(!spec->channels)) + return -ENODEV; + + spec->supported_bands = SUPPORT_BAND_2GHZ; + if (spec->num_channels > 14) + spec->supported_bands |= SUPPORT_BAND_5GHZ; + + /* + * Initialize HT information. + */ + if (!rt2x00_rf(rt2x00dev, RF2020)) + spec->ht.ht_supported = true; + else + spec->ht.ht_supported = false; + + spec->ht.cap = + IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_GRN_FLD | + IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_SGI_40; + + tx_chains = rt2x00dev->default_ant.tx_chain_num; + rx_chains = rt2x00dev->default_ant.rx_chain_num; + + if (tx_chains >= 2) + spec->ht.cap |= IEEE80211_HT_CAP_TX_STBC; + + spec->ht.cap |= rx_chains << IEEE80211_HT_CAP_RX_STBC_SHIFT; + + spec->ht.ampdu_factor = (rx_chains > 1) ? 3 : 2; + spec->ht.ampdu_density = 4; + spec->ht.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; + if (tx_chains != rx_chains) { + spec->ht.mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF; + spec->ht.mcs.tx_params |= + (tx_chains - 1) << IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT; + } + + switch (rx_chains) { + case 3: + spec->ht.mcs.rx_mask[2] = 0xff; + /* fall through */ + case 2: + spec->ht.mcs.rx_mask[1] = 0xff; + /* fall through */ + case 1: + spec->ht.mcs.rx_mask[0] = 0xff; + spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */ + break; + } + + /* + * Create channel information array + */ + info = kcalloc(spec->num_channels, sizeof(struct channel_info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + spec->channels_info = info; + + switch (rt2x00dev->chip.rf) { + case RF2020: + case RF3020: + case RF3021: + case RF3022: + case RF3320: + case RF3052: + case RF3053: + case RF3070: + case RF3290: + case RF3853: + case RF5350: + case RF5360: + case RF5362: + case RF5370: + case RF5372: + case RF5390: + case RF5392: + case RF5592: + case RF7620: + __set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags); + break; + } + + return 0; +} + +struct rt2800usb_userspace_firmware { + uint8_t *data; + size_t size; +}; + +int rt2800usb_userspace_load_firmware(struct rt2x00_dev *rt2x00dev, + struct rt2800usb_userspace_firmware **fw) { + struct userspace_wifi_context *userspace_context = + (struct userspace_wifi_context *) rt2x00dev->userspace_context; + + int retval; + + *fw = (struct rt2800usb_userspace_firmware *) malloc(sizeof(struct rt2800usb_userspace_firmware)); + + if (*fw == NULL) { + rt2x00_err(rt2x00dev, "Unable to allocate memory to read firmware file."); + return -ENOMEM; + } + + retval = (*userspace_context->load_firmware_file)(userspace_context, + FIRMWARE_RT2870, + NULL, 0, + &(*fw)->data, &(*fw)->size); + + if (retval != 0) { + rt2x00_err(rt2x00dev, "Could not load firmware %s, cannot continue.", FIRMWARE_RT2870); + return -1; + } + + rt2x00_info(rt2x00dev, "Firmware detected - version: %d.%d\n", + (*fw)->data[(*fw)->size - 4], (*fw)->data[(*fw)->size - 3]); + + retval = rt2x00dev->ops->lib->check_firmware(rt2x00dev, (*fw)->data, (*fw)->size); + switch (retval) { + case FW_OK: + break; + case FW_BAD_CRC: + rt2x00_err(rt2x00dev, "Firmware checksum error\n"); + goto exit; + case FW_BAD_LENGTH: + rt2x00_err(rt2x00dev, "Invalid firmware file length (len=%zu)\n", + (*fw)->size); + goto exit; + case FW_BAD_VERSION: + rt2x00_err(rt2x00dev, "Current firmware does not support detected chipset\n"); + goto exit; + } + + return (*fw)->size; + +exit: + free((*fw)->data); + free(*fw); + *fw = NULL; + return -EINVAL; +} + +void rt2800usb_userspace_free_firmware(struct rt2800usb_userspace_firmware *fw) { + if (!fw) + return; + + if (fw->data) + free(fw->data); + + free(fw); +} + + +static const struct rt2800_ops rt2800usb_rt2800_ops = { + .register_read = rt2x00usb_register_read, + .register_read_lock = rt2x00usb_register_read_lock, + .register_write = rt2x00usb_register_write, + .register_write_lock = rt2x00usb_register_write_lock, + .register_multiread = rt2x00usb_register_multiread, + .register_multiwrite = rt2x00usb_register_multiwrite, + .regbusy_read = rt2x00usb_regbusy_read, + .read_eeprom = rt2800usb_read_eeprom, + .drv_write_firmware = rt2800usb_write_firmware, + .drv_init_registers = rt2800usb_init_registers, +}; + +static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { + .get_firmware_name = rt2800usb_get_firmware_name, + .check_firmware = rt2800_check_firmware, + .load_firmware = rt2800_load_firmware, + .initialize = rt2x00usb_initialize, + .set_device_state = rt2800usb_set_device_state, + .rfkill_poll = rt2800_rfkill_poll, + .link_stats = rt2800_link_stats, + .reset_tuner = rt2800_reset_tuner, + .link_tuner = rt2800_link_tuner, + .vco_calibration = rt2800_vco_calibration, + .config_filter = rt2800_config_filter, + .config_intf = rt2800_config_intf, + .config_erp = rt2800_config_erp, + .config_ant = rt2800_config_ant, + .config = rt2800_config, + .start_queue = rt2800usb_start_queue, + .stop_queue = rt2800usb_stop_queue +}; + +static const struct rt2x00_ops rt2800usb_ops = { + .drv_data_size = sizeof(struct rt2800_drv_data), + .max_ap_intf = 8, + .eeprom_size = EEPROM_SIZE, + .rf_size = RF_SIZE, + .tx_queues = NUM_TX_QUEUES, + .lib = &rt2800usb_rt2x00_ops, + .drv = &rt2800usb_rt2800_ops, +#ifdef CONFIG_RT2X00_LIB_DEBUGFS + .debugfs = &rt2800_rt2x00debug, +#endif /* CONFIG_RT2X00_LIB_DEBUGFS */ +}; + +/* + * Userspace channel set function + */ +int rt2800usb_userspace_set_channel(struct userspace_wifi_dev *dev, int channel, enum nl80211_chan_width width) { + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) dev->dev_data; + struct ieee80211_conf dot11conf; + enum nl80211_band band; + + memset(&dot11conf, 0, sizeof(struct ieee80211_conf)); + dot11conf.chandef.width = width; + + /* + * TODO handle 5ghz + */ + if (channel >= 1 && channel <= 14) { + dot11conf.chandef.chan = &rt2x00dev->bands[NL80211_BAND_2GHZ].channels[channel - 1]; + band = NL80211_BAND_2GHZ; + } else { + return -EINVAL; + } + + /* Queue must be stopped to set the channel state */ + rt2800usb_stop_queue(rt2x00dev); + + /* Try to set the channel */ + rt2x00lib_config(rt2x00dev, &dot11conf, IEEE80211_CONF_CHANGE_CHANNEL | IEEE80211_CONF_CHANGE_MONITOR); + rt2x00lib_config_antenna(rt2x00dev, rt2x00dev->default_ant); + + /* Set the channel copy */ + rt2x00dev->rf_channel = channel; + rt2x00dev->rf_band = band; + + /* Try to start the RX engine */ + rt2800usb_start_queue(rt2x00dev); + + return 0; +} + +/* + * Userspace LED control function + */ +int rt2800usb_userspace_set_led(struct userspace_wifi_dev *dev, bool enable) { + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) dev->dev_data; + + unsigned int ledmode = + rt2x00_get_field16(rt2x00dev->led_mcu_reg, + EEPROM_FREQ_LED_MODE); + rt2800_mcu_request(rt2x00dev, MCU_LED, 0xff, ledmode, enable ? 0x60 : 0x20); + + return 1; +} + +/* + * From rt2800lib + */ +void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev, + unsigned short *txwi_size, + unsigned short *rxwi_size) +{ + switch (rt2x00dev->chip.rt) { + case RT3593: + case RT3883: + *txwi_size = TXWI_DESC_SIZE_4WORDS; + *rxwi_size = RXWI_DESC_SIZE_5WORDS; + break; + + case RT5592: + case RT6352: + *txwi_size = TXWI_DESC_SIZE_5WORDS; + *rxwi_size = RXWI_DESC_SIZE_6WORDS; + break; + + default: + *txwi_size = TXWI_DESC_SIZE_4WORDS; + *rxwi_size = RXWI_DESC_SIZE_4WORDS; + break; + } +} + +/** + * _rt2x00_desc_read - Read a word from the hardware descriptor. + * @desc: Base descriptor address + * @word: Word index from where the descriptor should be read. + */ +static inline __le32 _rt2x00_desc_read(__le32 *desc, const u8 word) +{ + return desc[word]; +} + +/** + * rt2x00_desc_read - Read a word from the hardware descriptor, this + * function will take care of the byte ordering. + * @desc: Base descriptor address + * @word: Word index from where the descriptor should be read. + */ +static inline u32 rt2x00_desc_read(__le32 *desc, const u8 word) +{ + return le32_to_cpu(_rt2x00_desc_read(desc, word)); +} + +static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, u32 rxwi_w2) +{ + s8 rssi0 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI0); + s8 rssi1 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI1); + s8 rssi2 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI2); + u16 eeprom; + u8 offset0; + u8 offset1; + u8 offset2; + + if (rt2x00dev->curr_band == NL80211_BAND_2GHZ) { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG); + offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET0); + offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET1); + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2); + offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_OFFSET2); + } else { + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A); + offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET0); + offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET1); + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2); + offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_OFFSET2); + } + + /* + * Convert the value from the descriptor into the RSSI value + * If the value in the descriptor is 0, it is considered invalid + * and the default (extremely low) rssi value is assumed + */ + rssi0 = (rssi0) ? (-12 - offset0 - rt2x00dev->lna_gain - rssi0) : -128; + rssi1 = (rssi1) ? (-12 - offset1 - rt2x00dev->lna_gain - rssi1) : -128; + rssi2 = (rssi2) ? (-12 - offset2 - rt2x00dev->lna_gain - rssi2) : -128; + + /* + * mac80211 only accepts a single RSSI value. Calculating the + * average doesn't deliver a fair answer either since -60:-60 would + * be considered equally good as -50:-70 while the second is the one + * which gives less energy... + */ + rssi0 = max(rssi0, rssi1); + return (int)max(rssi0, rssi2); +} + + +/* + * LibUSB usb transfer completion + * RXI parsing extracted from rt2800usb_fill_rxdone and rt2800_process_rxwi + */ +void rt2800usb_libusb_transfer_fn(struct libusb_transfer *transfer) { + struct userspace_wifi_dev *dev = (struct userspace_wifi_dev *) transfer->user_data; + struct rt2x00_dev * rt2x00dev = (struct rt2x00_dev *) (dev)->dev_data; + + /* + * Working buffer ptr we move around while emulating skb_trim and skb_pull + */ + unsigned char *workbuf = transfer->buffer; + unsigned int workbuf_len = transfer->actual_length; + + __le32 *rxi = (__le32 *) workbuf; + __le32 *rxd; + u32 word; + + unsigned int rx_pkt_len; + + struct userspace_wifi_rx_signal rx_signal; + + unsigned int mpdu_sz; + + unsigned int pad = 0; + + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + /* Timeout errors get re-submitted, other errors get bounced up */ + + if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) { + rt2x00_err(rt2x00dev, "Radio request failed: %d %s - device no longer available", + transfer->status, libusb_error_name(transfer->status)); + } else if (transfer->status != LIBUSB_TRANSFER_TIMED_OUT) { + rt2x00_err(rt2x00dev, "Radio request failed: %d %s", + transfer->status, libusb_error_name(transfer->status)); + } + + userspace_wifi_lock(dev->context); + if (dev->usb_transfer_active) + libusb_submit_transfer(transfer); + userspace_wifi_unlock(dev->context); + return; + } + + /* + * RX frame format is : + * | RXINFO | RXWI | header | L2 pad | payload | pad | RXD | USB pad | + * |<------------ rx_pkt_len -------------->| + */ + + if (transfer->actual_length < RXINFO_DESC_SIZE + rt2x00dev->rxwi_size) { + /* + * Silently ignore and re-queue on runt transfers + */ + + userspace_wifi_lock(dev->context); + if (dev->usb_transfer_active) + libusb_submit_transfer(transfer); + userspace_wifi_unlock(dev->context); + return; + } + + memset(&rx_signal, 0, sizeof(struct userspace_wifi_rx_signal)); + + rx_signal.channel = rt2x00dev->rf_channel; + rx_signal.band = rt2x00dev->rf_band; + + /* + * Get packet length of RXWI + payload + pad from the header of the packet + */ + word = rt2x00_desc_read(rxi, 0); + rx_pkt_len = rt2x00_get_field32(word, RXINFO_W0_USB_DMA_RX_PKT_LEN); + + if (rx_pkt_len == 0 || rx_pkt_len > (transfer->actual_length - RXINFO_DESC_SIZE)) { + /* + * Ignore errors in packet size and re-queue + */ + + userspace_wifi_lock(dev->context); + if (dev->usb_transfer_active) + libusb_submit_transfer(transfer); + userspace_wifi_unlock(dev->context); + return; + } + + workbuf = workbuf + RXINFO_DESC_SIZE; + workbuf_len -= RXINFO_DESC_SIZE; + + rxd = (__le32 *)(workbuf + rx_pkt_len); + + /* + * It is now safe to read the descriptor on all architectures. + */ + word = rt2x00_desc_read((__le32 *) rxd, 0); + + if (rt2x00_get_field32(word, RXD_W0_L2PAD)) + pad = 2; + + if (rt2x00_get_field32(word, RXD_W0_CRC_ERROR)) + rx_signal.crc_valid = false; + else + rx_signal.crc_valid = true; + + /* + * Remove RXD descriptor from end of buffer. + */ + workbuf_len = rx_pkt_len; + + /* + * Remove the padding from the end of the buffer + */ + workbuf_len -= pad; + + rxi = (__le32 *) workbuf; + + word = rt2x00_desc_read(rxi, 0); + mpdu_sz = rt2x00_get_field32(word, RXWI_W0_MPDU_TOTAL_BYTE_COUNT); + + word = rt2x00_desc_read(rxi, 1); + + if (rt2x00_get_field32(word, RXWI_W1_SHORT_GI)) { + rx_signal.short_gi = true; + } + + if (rt2x00_get_field32(word, RXWI_W1_BW)) { + rx_signal.chan_width = NL80211_CHAN_WIDTH_40; + } else { + rx_signal.chan_width = NL80211_CHAN_WIDTH_20_NOHT; + } + + /* + * Detect RX rate, always use MCS as signal type. + */ + rx_signal.mcs = rt2x00_get_field32(word, RXWI_W1_MCS); + + /* + * Mask of 0x8 bit to remove the short preamble flag. + */ + if (rt2x00_get_field32(word, RXWI_W1_PHYMODE) == RATE_MODE_CCK) + rx_signal.mcs &= ~0x8; + + word = rt2x00_desc_read(rxi, 2); + + /* + * Convert descriptor AGC value to RSSI value. + */ + rx_signal.signal = rt2800_agc_to_rssi(rt2x00dev, word); + + /* + * Remove the rxwi header + */ + workbuf = workbuf + rt2x00dev->rxwi_size; + workbuf_len -= rt2x00dev->rxwi_size; + + if (mpdu_sz > workbuf_len) { + /* + * If we get a mpdu that can't fit in our rx, throw it out and re-queue a command + */ + userspace_wifi_lock(dev->context); + if (dev->usb_transfer_active) + libusb_submit_transfer(transfer); + userspace_wifi_unlock(dev->context); + } + + /* + * Pass the data on to a callback. We use a stack-allocated signal because this + * is all iterative. + */ + if (dev->context->handle_packet_rx) { + dev->context->handle_packet_rx(dev->context, dev, &rx_signal, workbuf, mpdu_sz); + } + + /* + * Resubmit the request + */ + userspace_wifi_lock(dev->context); + if (dev->usb_transfer_active) + libusb_submit_transfer(transfer); + userspace_wifi_unlock(dev->context); +} + +int rt2800usb_userspace_start_capture(struct userspace_wifi_dev *dev) { + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) (dev)->dev_data; + + /* Set up the bulk transfer */ + if (dev->usb_transfer_buffer == NULL) { + dev->usb_transfer_buffer = (unsigned char *) malloc(4000); + if (dev->usb_transfer_buffer == NULL) + return -ENOMEM; + } + + if (dev->usb_transfer == NULL) { + dev->usb_transfer = libusb_alloc_transfer(0); + } + + libusb_fill_bulk_transfer(dev->usb_transfer, + rt2x00dev->dev, + rt2x00dev->usb_bulk_in_endp, + dev->usb_transfer_buffer, + 4000, + &rt2800usb_libusb_transfer_fn, + dev, + 500); + + rt2800usb_start_queue(rt2x00dev); + + userspace_wifi_lock(dev->context); + dev->usb_transfer_active = true; + libusb_submit_transfer(dev->usb_transfer); + userspace_wifi_unlock(dev->context); + + return 0; +} + +void rt2800usb_userspace_stop_capture(struct userspace_wifi_dev *dev) { + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) (dev)->dev_data; + + userspace_wifi_lock(dev->context); + + rt2800usb_stop_queue(rt2x00dev); + + dev->usb_transfer_active = false; + libusb_cancel_transfer(dev->usb_transfer); + + userspace_wifi_unlock(dev->context); +} + +int rt2800usb_open_device(struct userspace_wifi_probe_dev *dev, + struct userspace_wifi_dev **udev) { + + struct rt2x00_dev *rt2x00dev; + int r; + struct rt2800usb_userspace_firmware *firmware; + + *udev = (struct userspace_wifi_dev *) malloc(sizeof(struct userspace_wifi_dev)); + + if (*udev == NULL) + return -ENOMEM; + + memset(*udev, 0, sizeof(struct userspace_wifi_dev)); + + (*udev)->context = dev->context; + + (*udev)->dev_data = malloc(sizeof(struct rt2x00_dev)); + + if ((*udev)->dev_data == NULL) { + free(*udev); + return -ENOMEM; + } + + (*udev)->set_channel = rt2800usb_userspace_set_channel; + (*udev)->set_led = rt2800usb_userspace_set_led; + (*udev)->start_capture = rt2800usb_userspace_start_capture; + (*udev)->stop_capture = rt2800usb_userspace_stop_capture; + + /* + * Populate the 2x00dev record w/ ops, copies of pointers to + * structures we need to pull in on deeper levels like usb and + * userspace context, etc + */ + rt2x00dev = (struct rt2x00_dev *) (*udev)->dev_data; + + memset(rt2x00dev, 0, sizeof(struct rt2x00_dev)); + + rt2x00dev->userspace_dev = udev; + + rt2x00dev->libusb_context = dev->context->libusb_context; + rt2x00dev->userspace_context = dev->context; + pthread_mutex_init(&rt2x00dev->usb_control_mutex, NULL); + pthread_cond_init(&rt2x00dev->usb_control_cond, NULL); + rt2x00dev->ops = &rt2800usb_ops; + rt2x00dev->base_dev = dev->dev; + + rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_USB); + + /* + * Allocate the low level cache ops + */ + r = rt2x00usb_alloc_reg(rt2x00dev); + + if (r != 0) { + free(rt2x00dev); + free(*udev); + return r; + } + + /* + * Open the usb device, disconnecting any kernel drivers and other attachments + */ + r = libusb_open(rt2x00dev->base_dev, &rt2x00dev->dev); + + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to open device: %s\n", + libusb_error_name(r)); + rt2x00usb_free(rt2x00dev); + free(*udev); + return -EPIPE; + } + + libusb_set_auto_detach_kernel_driver(rt2x00dev->dev, 1); + r = libusb_claim_interface(rt2x00dev->dev, 0); + + if (r != LIBUSB_SUCCESS) { + rt2x00_err(rt2x00dev, "Failed to claim device: %s\n", + libusb_error_name(r)); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return -EPIPE; + } + + /* + * initialize the lowlevel 2x00 and find the endpoints + */ + r = rt2x00usb_initialize(rt2x00dev); + + if (r != 0) { + rt2x00_err(rt2x00dev, "Failed to initialize rt2x00 layer\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } + + /* + * flag the device as present + */ + set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); + + r = rt2800_probe_rt(rt2x00dev); + if (r != 0) { + rt2x00_err(rt2x00dev, "Failed to probe rt info\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } + + /* + * Check if we're in autorun mode + */ + r = rt2800usb_autorun_detect(rt2x00dev); + + /* + * Allocate eeprom data. + */ + memset(rt2x00dev->eeprom, 0, EEPROM_SIZE); + r = rt2800_validate_eeprom(rt2x00dev); + if (r) { + rt2x00_err(rt2x00dev, "Failed to validate eeprom\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } + + r = rt2800_init_eeprom(rt2x00dev); + if (r) { + rt2x00_err(rt2x00dev, "Failed to init eeprom\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } + + /* Propogate the mac up */ + memcpy((*udev)->dev_mac, rt2x00dev->mac, 6); + + /* Propogate the serial from the probe device to the final */ + memcpy((*udev)->usb_serial, dev->usb_serial, 64); + +#if 0 + for (unsigned int x = 0; x < EEPROM_SIZE; x++) + printf("%02x ", ((uint8_t *) rt2x00dev->eeprom) [x] & 0xFF); + printf("\n"); + + printf("Radio MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n", + rt2x00dev->mac[0], rt2x00dev->mac[1], rt2x00dev->mac[2], + rt2x00dev->mac[3], rt2x00dev->mac[4], rt2x00dev->mac[5]); +#endif + + /* + * Load and check our firmware file + */ + r = rt2800usb_userspace_load_firmware(rt2x00dev, &firmware); + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to load firmware file on host\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } + + /* + * Load it into the device + */ + r = rt2800_load_firmware(rt2x00dev, firmware->data, firmware->size); + if (r < 0) { + rt2x00_err(rt2x00dev, "Firmware load failed: %d %s\n", r, strerror(r)); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } else { + rt2x00_info(rt2x00dev, "Firmware load succeeded!\n"); + } + + /* + * Power on the MCU + */ + r = rt2800usb_set_device_state(rt2x00dev, STATE_AWAKE); + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to awaken radio\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } else { + rt2x00_info(rt2x00dev, "Radio woken up!\n"); + } + + /* + * Startup the device + */ + r = rt2x00lib_start(rt2x00dev); + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to start device\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } else { + rt2x00_info(rt2x00dev, "Device started!\n"); + } + + /* + * Enable the radio + */ + r = rt2800usb_enable_radio(rt2x00dev); + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to enable the radio\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } else { + rt2x00_info(rt2x00dev, "Radio enabled!\n"); + } + + rt2800_get_txwi_rxwi_size(rt2x00dev, &rt2x00dev->txwi_size, &rt2x00dev->rxwi_size); + + /* + * probe hw modes + */ + r = rt2800_probe_hw_mode(rt2x00dev); + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to probe 2800_hw_mode\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } else { + rt2x00_info(rt2x00dev, "RT2800 Hw modes probed!\n"); + } + + r = rt2x00lib_probe_hw_modes(rt2x00dev, &rt2x00dev->spec); + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to probe 2x00_hw_modes\n"); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } else { + rt2x00_info(rt2x00dev, "RT2x00 Hw modes probed!\n"); + } + + /* Radio must be enabled, but rx disabled, to set the channel and antenna values */ + rt2800usb_stop_queue(rt2x00dev); + + struct ieee80211_hw hw; + memset(&hw, 0, sizeof(struct ieee80211_hw)); + + hw.priv = rt2x00dev; + + struct ieee80211_vif vif; + memset(&vif, 0, sizeof(struct ieee80211_vif)); + vif.type = NL80211_IFTYPE_MONITOR; + memcpy(vif.addr, rt2x00dev->mac, 6); + + r = rt2x00mac_add_interface(&hw, &vif); + + if (r < 0) { + rt2x00_err(rt2x00dev, "Failed to add vif... %s\n", strerror(errno)); + libusb_close(rt2x00dev->dev); + rt2x00usb_free(rt2x00dev); + free(*udev); + return r; + } else { + rt2x00_info(rt2x00dev, "We think we added a vif...!\n"); + } + + /* + rt2800usb_userspace_set_channel(*udev, 1, NL80211_CHAN_WIDTH_20_NOHT); + */ + + return 0; +} + + +int rt2800usb_probe_device(struct libusb_device_descriptor *desc, + struct userspace_wifi_probe_dev **probe_dev) { + unsigned int x; + + for (x = 0; x < sizeof(rt2800usb_device_table) / sizeof(struct usb_device_id); x++) { + if (rt2800usb_device_table[x].match_flags != USB_DEVICE_ID_MATCH_DEVICE) + continue; + + if (rt2800usb_device_table[x].idVendor == desc->idVendor && + rt2800usb_device_table[x].idProduct == desc->idProduct) { + *probe_dev = (struct userspace_wifi_probe_dev *) malloc(sizeof(struct userspace_wifi_probe_dev)); + + (*probe_dev)->device_id_match = &(rt2800usb_device_table[x]); + + (*probe_dev)->driver_name = strdup("rt2800usb"); + (*probe_dev)->device_type = strdup("rt2800usb"); + + (*probe_dev)->open_device = &rt2800usb_open_device; + + return 1; + } + + } + + return 0; +} + diff --git a/libwifiuserspace/rt2800usb/rt2800usb.h b/libwifiuserspace/rt2800usb/rt2800usb.h new file mode 100644 index 0000000..f3bdcc5 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2800usb.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __RT2800USB_H__ +#define __RT2800USB_H__ + +#include "rt2x00.h" + +/* + * 8051 firmware image. + */ +#define FIRMWARE_RT2870 "rt2870.bin" +#define FIRMWARE_IMAGE_BASE 0x3000 + +/* + * DMA descriptor defines. + */ +#define TXINFO_DESC_SIZE (1 * sizeof(__le32)) +#define RXINFO_DESC_SIZE (1 * sizeof(__le32)) + +/* + * TX Info structure + */ + +/* + * Word0 + * WIV: Wireless Info Valid. 1: Driver filled WI, 0: DMA needs to copy WI + * QSEL: Select on-chip FIFO ID for 2nd-stage output scheduler. + * 0:MGMT, 1:HCCA 2:EDCA + * USB_DMA_NEXT_VALID: Used ONLY in USB bulk Aggregation, NextValid + * DMA_TX_BURST: used ONLY in USB bulk Aggregation. + * Force USB DMA transmit frame from current selected endpoint + */ +#define TXINFO_W0_USB_DMA_TX_PKT_LEN FIELD32(0x0000ffff) +#define TXINFO_W0_WIV FIELD32(0x01000000) +#define TXINFO_W0_QSEL FIELD32(0x06000000) +#define TXINFO_W0_SW_USE_LAST_ROUND FIELD32(0x08000000) +#define TXINFO_W0_USB_DMA_NEXT_VALID FIELD32(0x40000000) +#define TXINFO_W0_USB_DMA_TX_BURST FIELD32(0x80000000) + +/* + * RX Info structure + */ + +/* + * Word 0 + */ + +#define RXINFO_W0_USB_DMA_RX_PKT_LEN FIELD32(0x0000ffff) + +/* + * RX descriptor format for RX Ring. + */ + +/* + * Word0 + * UNICAST_TO_ME: This RX frame is unicast to me. + * MULTICAST: This is a multicast frame. + * BROADCAST: This is a broadcast frame. + * MY_BSS: this frame belongs to the same BSSID. + * CRC_ERROR: CRC error. + * CIPHER_ERROR: 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid. + * AMSDU: rx with 802.3 header, not 802.11 header. + */ + +#define RXD_W0_BA FIELD32(0x00000001) +#define RXD_W0_DATA FIELD32(0x00000002) +#define RXD_W0_NULLDATA FIELD32(0x00000004) +#define RXD_W0_FRAG FIELD32(0x00000008) +#define RXD_W0_UNICAST_TO_ME FIELD32(0x00000010) +#define RXD_W0_MULTICAST FIELD32(0x00000020) +#define RXD_W0_BROADCAST FIELD32(0x00000040) +#define RXD_W0_MY_BSS FIELD32(0x00000080) +#define RXD_W0_CRC_ERROR FIELD32(0x00000100) +#define RXD_W0_CIPHER_ERROR FIELD32(0x00000600) +#define RXD_W0_AMSDU FIELD32(0x00000800) +#define RXD_W0_HTC FIELD32(0x00001000) +#define RXD_W0_RSSI FIELD32(0x00002000) +#define RXD_W0_L2PAD FIELD32(0x00004000) +#define RXD_W0_AMPDU FIELD32(0x00008000) +#define RXD_W0_DECRYPTED FIELD32(0x00010000) +#define RXD_W0_PLCP_RSSI FIELD32(0x00020000) +#define RXD_W0_CIPHER_ALG FIELD32(0x00040000) +#define RXD_W0_LAST_AMSDU FIELD32(0x00080000) +#define RXD_W0_PLCP_SIGNAL FIELD32(0xfff00000) + +/* + * Firmware functions + */ +int rt2800usb_autorun_detect(struct rt2x00_dev *rt2x00dev); +/* + * Probe a usb device to determine if it's a viable rt2800 device; + * returns 1 on success and populates **probe_dev, + * returns 0 on no match + * returns negative on error + */ +int rt2800usb_probe_device(struct libusb_device_descriptor *desc, + struct userspace_wifi_probe_dev **probe_dev); + + +#endif /* ifndef RT2800USB_H */ diff --git a/libwifiuserspace/rt2800usb/rt2x00.c b/libwifiuserspace/rt2800usb/rt2x00.c new file mode 100644 index 0000000..58d729b --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00.c @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +/* + * This is a user-space port of components of the rt2x00usb library, + * implementing generic usb device routines. + */ + +#include +#include +#include +#include + +#include "kernel/bits.h" +#include "kernel/endian.h" +#include "kernel/kernel.h" + +#include "rt2800usb/rt2x00.h" +#include "rt2800usb/rt2x00usb.h" + diff --git a/libwifiuserspace/rt2800usb/rt2x00.h b/libwifiuserspace/rt2800usb/rt2x00.h new file mode 100644 index 0000000..ef26080 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00.h @@ -0,0 +1,1010 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __RT2X00_H__ +#define __RT2X00_H__ + +#include +#include + +#include + +#include "kernel/average.h" +#include "kernel/types.h" +#include "kernel/kernel.h" +#include "kernel/mac80211.h" +#include "kernel/usb.h" + +#include "rt2800usb/rt2x00queue.h" +#include "rt2800usb/rt2x00reg.h" + +#include "userspace/userspace.h" + +#define rt2x00_err(dev, fmt, ...) \ + userspace_wifi_error(dev->userspace_context, dev->userspace_dev, \ + 0, fmt, ##__VA_ARGS__) + +#ifdef RT2800_USERSPACE_DEBUG +#define rt2x00_warn(dev, fmt, ...) \ + fprintf(stderr, "%s: Warning - " fmt, \ + __func__, ##__VA_ARGS__) +#define rt2x00_info(dev, fmt, ...) \ + fprintf(stderr, "%s: Info - " fmt, \ + __func__, ##__VA_ARGS__) + +/* Various debug levels */ +#define rt2x00_dbg(dev, fmt, ...) \ + fprintf(stderr, "%s: Debug - " fmt, \ + __func__, ##__VA_ARGS__) +#define rt2x00_eeprom_dbg(dev, fmt, ...) \ + fprintf(stderr, "%s: EEPROM recovery - " fmt, \ + __func__, ##__VA_ARGS__) +#else +#define rt2x00_warn(dev, fmt, ...) +#define rt2x00_info(dev, fmt, ...) +#define rt2x00_dbg(dev, fmt, ...) +#define rt2x00_eeprom_dbg(dev, fmt, ...) +#endif + +/* + * rt2x00 state flags + */ +enum rt2x00_state_flags { + /* + * Device flags + */ + DEVICE_STATE_PRESENT, + DEVICE_STATE_REGISTERED_HW, + DEVICE_STATE_INITIALIZED, + DEVICE_STATE_STARTED, + DEVICE_STATE_ENABLED_RADIO, + DEVICE_STATE_SCANNING, + DEVICE_STATE_FLUSHING, + + /* + * Driver configuration + */ + CONFIG_CHANNEL_HT40, + CONFIG_POWERSAVING, + CONFIG_HT_DISABLED, + CONFIG_MONITORING, + + /* + * Mark we currently are sequentially reading TX_STA_FIFO register + * FIXME: this is for only rt2800usb, should go to private data + */ + TX_STATUS_READING, +}; + +/* + * rt2x00 capability flags + */ +enum rt2x00_capability_flags { + /* + * Requirements + */ + REQUIRE_FIRMWARE, + REQUIRE_BEACON_GUARD, + REQUIRE_ATIM_QUEUE, + REQUIRE_DMA, + REQUIRE_COPY_IV, + REQUIRE_L2PAD, + REQUIRE_TXSTATUS_FIFO, + REQUIRE_TASKLET_CONTEXT, + REQUIRE_SW_SEQNO, + REQUIRE_HT_TX_DESC, + REQUIRE_PS_AUTOWAKE, + REQUIRE_DELAYED_RFKILL, + + /* + * Capabilities + */ + CAPABILITY_HW_BUTTON, + CAPABILITY_HW_CRYPTO, + CAPABILITY_POWER_LIMIT, + CAPABILITY_CONTROL_FILTERS, + CAPABILITY_CONTROL_FILTER_PSPOLL, + CAPABILITY_PRE_TBTT_INTERRUPT, + CAPABILITY_LINK_TUNING, + CAPABILITY_FRAME_TYPE, + CAPABILITY_RF_SEQUENCE, + CAPABILITY_EXTERNAL_LNA_A, + CAPABILITY_EXTERNAL_LNA_BG, + CAPABILITY_DOUBLE_ANTENNA, + CAPABILITY_BT_COEXIST, + CAPABILITY_VCO_RECALIBRATION, + CAPABILITY_EXTERNAL_PA_TX0, + CAPABILITY_EXTERNAL_PA_TX1, +}; + +/* + * For USB vendor requests we need to pass a timeout time in ms, for this we + * use the REGISTER_TIMEOUT, however when loading firmware or read EEPROM + * a higher value is required. In that case we use the REGISTER_TIMEOUT_FIRMWARE + * and EEPROM_TIMEOUT. + */ +#define REGISTER_TIMEOUT 100 +#define REGISTER_TIMEOUT_FIRMWARE 1000 +#define EEPROM_TIMEOUT 2000 + +/* + * Cache size + */ +#define CSR_CACHE_SIZE 64 + +/* + * USB request types. + */ +#define USB_VENDOR_REQUEST ( USB_TYPE_VENDOR | USB_RECIP_DEVICE ) +#define USB_VENDOR_REQUEST_IN ( USB_DIR_IN | USB_VENDOR_REQUEST ) +#define USB_VENDOR_REQUEST_OUT ( USB_DIR_OUT | USB_VENDOR_REQUEST ) + +enum rt2x00_chip_intf { + RT2X00_CHIP_INTF_PCI, + RT2X00_CHIP_INTF_PCIE, + RT2X00_CHIP_INTF_USB, + RT2X00_CHIP_INTF_SOC, +}; + +/* + * Chipset identification + * The chipset on the device is composed of a RT and RF chip. + * The chipset combination is important for determining device capabilities. + */ +struct rt2x00_chip { + u16 rt; +#define RT2460 0x2460 +#define RT2560 0x2560 +#define RT2570 0x2570 +#define RT2661 0x2661 +#define RT2573 0x2573 +#define RT2860 0x2860 /* 2.4GHz */ +#define RT2872 0x2872 /* WSOC */ +#define RT2883 0x2883 /* WSOC */ +#define RT3070 0x3070 +#define RT3071 0x3071 +#define RT3090 0x3090 /* 2.4GHz PCIe */ +#define RT3290 0x3290 +#define RT3352 0x3352 /* WSOC */ +#define RT3390 0x3390 +#define RT3572 0x3572 +#define RT3593 0x3593 +#define RT3883 0x3883 /* WSOC */ +#define RT5350 0x5350 /* WSOC 2.4GHz */ +#define RT5390 0x5390 /* 2.4GHz */ +#define RT5392 0x5392 /* 2.4GHz */ +#define RT5592 0x5592 +#define RT6352 0x6352 /* WSOC 2.4GHz */ + + u16 rf; + u16 rev; + + enum rt2x00_chip_intf intf; +}; + +/* + * RF register values that belong to a particular channel. + */ +struct rf_channel { + int channel; + u32 rf1; + u32 rf2; + u32 rf3; + u32 rf4; +}; + +/* + * Channel information structure + */ +struct channel_info { + unsigned int flags; +#define GEOGRAPHY_ALLOWED 0x00000001 + + short max_power; + short default_power1; + short default_power2; + short default_power3; +}; + +/* + * Antenna setup values. + */ +struct antenna_setup { + enum antenna rx; + enum antenna tx; + u8 rx_chain_num; + u8 tx_chain_num; +}; + +/* + * Quality statistics about the currently active link. + */ +struct link_qual { + /* + * Statistics required for Link tuning by driver + * The rssi value is provided by rt2x00lib during the + * link_tuner() callback function. + * The false_cca field is filled during the link_stats() + * callback function and could be used during the + * link_tuner() callback function. + */ + int rssi; + int false_cca; + + /* + * VGC levels + * Hardware driver will tune the VGC level during each call + * to the link_tuner() callback function. This vgc_level is + * is determined based on the link quality statistics like + * average RSSI and the false CCA count. + * + * In some cases the drivers need to differentiate between + * the currently "desired" VGC level and the level configured + * in the hardware. The latter is important to reduce the + * number of BBP register reads to reduce register access + * overhead. For this reason we store both values here. + */ + u8 vgc_level; + u8 vgc_level_reg; + + /* + * Statistics required for Signal quality calculation. + * These fields might be changed during the link_stats() + * callback function. + */ + int rx_success; + int rx_failed; + int tx_success; + int tx_failed; +}; + +enum rt2x00_delayed_flags { + DELAYED_UPDATE_BEACON, +}; + +/* + * Interface structure + * Per interface configuration details, this structure + * is allocated as the private data for ieee80211_vif. + */ +struct rt2x00_intf { + /* + * Entry in the beacon queue which belongs to + * this interface. Each interface has its own + * dedicated beacon entry. + */ + struct queue_entry *beacon; + bool enable_beacon; + + /* + * Actions that needed rescheduling. + */ + unsigned long delayed_flags; + + /* + * Software sequence counter, this is only required + * for hardware which doesn't support hardware + * sequence counting. + */ + atomic_t seqno; + +}; + +static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif) +{ + return (struct rt2x00_intf *)vif->drv_priv; +} + +/** + * struct hw_mode_spec: Hardware specifications structure + * + * Details about the supported modes, rates and channels + * of a particular chipset. This is used by rt2x00lib + * to build the ieee80211_hw_mode array for mac80211. + * + * @supported_bands: Bitmask contained the supported bands (2.4GHz, 5.2GHz). + * @supported_rates: Rate types which are supported (CCK, OFDM). + * @num_channels: Number of supported channels. This is used as array size + * for @tx_power_a, @tx_power_bg and @channels. + * @channels: Device/chipset specific channel values (See &struct rf_channel). + * @channels_info: Additional information for channels (See &struct channel_info). + * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap). + */ +struct hw_mode_spec { + unsigned int supported_bands; +#define SUPPORT_BAND_2GHZ 0x00000001 +#define SUPPORT_BAND_5GHZ 0x00000002 + + unsigned int supported_rates; +#define SUPPORT_RATE_CCK 0x00000001 +#define SUPPORT_RATE_OFDM 0x00000002 + + unsigned int num_channels; + const struct rf_channel *channels; + const struct channel_info *channels_info; + + struct ieee80211_sta_ht_cap ht; +}; + +/* + * Configuration structure wrapper around the + * mac80211 configuration structure. + * When mac80211 configures the driver, rt2x00lib + * can precalculate values which are equal for all + * rt2x00 drivers. Those values can be stored in here. + */ +struct rt2x00lib_conf { + struct ieee80211_conf *conf; + + struct rf_channel rf; + struct channel_info channel; +}; + +/* + * Configuration structure for hardware encryption. + */ +struct rt2x00lib_crypto { + enum cipher cipher; + + enum set_key_cmd cmd; + const u8 *address; + + u32 bssidx; + + u8 key[16]; + u8 tx_mic[8]; + u8 rx_mic[8]; + + int wcid; +}; + +/* + * Configuration structure wrapper around the + * rt2x00 interface configuration handler. + */ +struct rt2x00intf_conf { + /* + * Interface type + */ + enum nl80211_iftype type; + + /* + * TSF sync value, this is dependent on the operation type. + */ + enum tsf_sync sync; + + /* + * The MAC and BSSID addresses are simple array of bytes, + * these arrays are little endian, so when sending the addresses + * to the drivers, copy the it into a endian-signed variable. + * + * Note that all devices (except rt2500usb) have 32 bits + * register word sizes. This means that whatever variable we + * pass _must_ be a multiple of 32 bits. Otherwise the device + * might not accept what we are sending to it. + * This will also make it easier for the driver to write + * the data to the device. + */ + __le32 mac[2]; + __le32 bssid[2]; +}; + +/* + * Configuration structure for erp settings. + */ +struct rt2x00lib_erp { + int short_preamble; + int cts_protection; + + u32 basic_rates; + + int slot_time; + + short sifs; + short pifs; + short difs; + short eifs; + + u16 beacon_int; + u16 ht_opmode; +}; + +DECLARE_EWMA(rssi, 10, 8) + +/* + * Antenna settings about the currently active link. + */ +struct link_ant { + /* + * Antenna flags + */ + unsigned int flags; +#define ANTENNA_RX_DIVERSITY 0x00000001 +#define ANTENNA_TX_DIVERSITY 0x00000002 +#define ANTENNA_MODE_SAMPLE 0x00000004 + + /* + * Currently active TX/RX antenna setup. + * When software diversity is used, this will indicate + * which antenna is actually used at this time. + */ + struct antenna_setup active; + + /* + * RSSI history information for the antenna. + * Used to determine when to switch antenna + * when using software diversity. + */ + int rssi_history; + + /* + * Current RSSI average of the currently active antenna. + * Similar to the avg_rssi in the link_qual structure + * this value is updated by using the walking average. + */ + struct ewma_rssi rssi_ant; +}; + +/* + * To optimize the quality of the link we need to store + * the quality of received frames and periodically + * optimize the link. + */ +struct link { + /* + * Link tuner counter + * The number of times the link has been tuned + * since the radio has been switched on. + */ + u32 count; + + /* + * Quality measurement values. + */ + struct link_qual qual; + + /* + * TX/RX antenna setup. + */ + struct link_ant ant; + + /* + * Currently active average RSSI value + */ + struct ewma_rssi avg_rssi; +}; + + +struct rt2x00_dev { + /* + * Libusb device handle; this replaces the kernel pci/usb/etc combo + * device structure + */ + struct libusb_device_handle *dev; + + /* + * Base libusb device, used to open the handle and query the endpoints, + * etc. + */ + struct libusb_device *base_dev; + + /* + * Libusb context + */ + struct libusb_context *libusb_context; + + /* + * control synchronizer + */ + pthread_mutex_t usb_control_mutex; + pthread_cond_t usb_control_cond; + bool usb_command_complete; + + /* + * userspace usb context + */ + void *userspace_context; + + /* + * Reverse map to userspace wifi device + */ + void *userspace_dev; + + /* + * USB interface and endpoints + */ + unsigned int usb_interface_num; + unsigned int usb_bulk_in_endp; + unsigned int usb_bulk_out_endp; + + /* + * Device state flags. + * In these flags the current status is stored. + * Access to these flags should occur atomically. + */ + unsigned long flags; + + /* + * Device capabiltiy flags. + * In these flags the device/driver capabilities are stored. + * Access to these flags should occur non-atomically. + */ + unsigned long cap_flags; + + unsigned int num_proto_errs; + + /* + * Options pointer + */ + const struct rt2x00_ops *ops; + + /* + * Chipset identification. + */ + struct rt2x00_chip chip; + + /* + * hw capability specifications. + */ + struct hw_mode_spec spec; + + /* + * This is the default TX/RX antenna setup as indicated + * by the device's EEPROM. + */ + struct antenna_setup default_ant; + + /* + * Register pointers + * csr.cache: CSR cache for usb_control_msg. (USB) + */ + union csr { + void *cache; + } csr; + + pthread_mutex_t csr_mutex; + + /* + * EEPROM data. + */ + __le16 *eeprom; + + /* + * Active RF register values. + * These are stored here so we don't need + * to read the rf registers and can directly + * use this value instead. + * This field should be accessed by using + * rt2x00_rf_read() and rt2x00_rf_write(). + */ + u32 *rf; + + /* + * Last set channel data + */ + int rf_channel; + enum nl80211_band rf_band; + + /* + * Driver data. + */ + void *drv_data; + + /* + * IEEE80211 control structure. + */ + struct ieee80211_supported_band bands[NUM_NL80211_BANDS]; + enum nl80211_band curr_band; + int curr_freq; + + /* + * LNA gain + */ + short lna_gain; + + /* + * Current TX power value. + */ + u16 tx_power; + + /* + * Rssi <-> Dbm offset + */ + u8 rssi_offset; + + /* + * Frequency offset. + */ + u8 freq_offset; + + /* + * LED reg cache + */ + u16 led_mcu_reg; + + /* + * MAC address + */ + u8 *mac; + + /* + * station count (should just be 1) + */ + int intf_sta_count; + + /* + * Link quality + */ + struct link link; + + /* + * Rehomed from the queue definition, the tx and rx header sizes + */ + short unsigned int rxwi_size; + short unsigned int txwi_size; + + /* + * Control transfer and buffer cache + */ + struct libusb_transfer *control_transfer; + unsigned char *control_transfer_buffer; + size_t control_transfer_buffer_sz; +}; + +static inline void rt2x00dev_control_cb(struct libusb_transfer *transfer) { + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) transfer->user_data; + + pthread_mutex_lock(&rt2x00dev->usb_control_mutex); + rt2x00dev->usb_command_complete = true; + pthread_cond_signal(&rt2x00dev->usb_control_cond); + pthread_mutex_unlock(&rt2x00dev->usb_control_mutex); +} + +/* + * rt2x00lib callback functions. + */ +struct rt2x00lib_ops { + /* + * TX status tasklet handler. + */ + void (*txstatus_tasklet) (unsigned long data); + void (*pretbtt_tasklet) (unsigned long data); + void (*tbtt_tasklet) (unsigned long data); + void (*rxdone_tasklet) (unsigned long data); + void (*autowake_tasklet) (unsigned long data); + + /* + * Device init handlers. + */ + int (*probe_hw) (struct rt2x00_dev *rt2x00dev); + char *(*get_firmware_name) (struct rt2x00_dev *rt2x00dev); + int (*check_firmware) (struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len); + int (*load_firmware) (struct rt2x00_dev *rt2x00dev, + const u8 *data, const size_t len); + + /* + * Device initialization/deinitialization handlers. + */ + int (*initialize) (struct rt2x00_dev *rt2x00dev); + void (*uninitialize) (struct rt2x00_dev *rt2x00dev); + + /* + * Modified queue commands for userspace; take a device + * not a queue and only set the rx registers + */ + void (*start_queue) (struct rt2x00_dev *rt2x00dev); + void (*stop_queue) (struct rt2x00_dev *rt2x00dev); + + /* + * Radio control handlers. + */ + int (*set_device_state) (struct rt2x00_dev *rt2x00dev, + enum dev_state state); + int (*rfkill_poll) (struct rt2x00_dev *rt2x00dev); + void (*link_stats) (struct rt2x00_dev *rt2x00dev, + struct link_qual *qual); + void (*reset_tuner) (struct rt2x00_dev *rt2x00dev, + struct link_qual *qual); + void (*link_tuner) (struct rt2x00_dev *rt2x00dev, + struct link_qual *qual, const u32 count); + void (*gain_calibration) (struct rt2x00_dev *rt2x00dev); + void (*vco_calibration) (struct rt2x00_dev *rt2x00dev); + + /* + * RX control handlers + */ + void (*fill_rxdone) (struct queue_entry *entry, + struct rxdone_entry_desc *rxdesc); + + /* + * Configuration handlers. + */ + int (*config_shared_key) (struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_crypto *crypto, + struct ieee80211_key_conf *key); + int (*config_pairwise_key) (struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_crypto *crypto, + struct ieee80211_key_conf *key); + void (*config_filter) (struct rt2x00_dev *rt2x00dev, + const unsigned int filter_flags); + void (*config_intf) (struct rt2x00_dev *rt2x00dev, + struct rt2x00_intf *intf, + struct rt2x00intf_conf *conf, + const unsigned int flags); +#define CONFIG_UPDATE_TYPE ( 1 << 1 ) +#define CONFIG_UPDATE_MAC ( 1 << 2 ) +#define CONFIG_UPDATE_BSSID ( 1 << 3 ) + + void (*config_erp) (struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_erp *erp, + u32 changed); + void (*config_ant) (struct rt2x00_dev *rt2x00dev, + struct antenna_setup *ant); + void (*config) (struct rt2x00_dev *rt2x00dev, + struct rt2x00lib_conf *libconf, + const unsigned int changed_flags); + int (*sta_add) (struct rt2x00_dev *rt2x00dev, + struct ieee80211_vif *vif, + struct ieee80211_sta *sta); + int (*sta_remove) (struct rt2x00_dev *rt2x00dev, + struct ieee80211_sta *sta); +}; + +/* + * rt2x00 driver callback operation structure. + */ +/* + * Modified to remove 80211 ops and queues since we don't use them + * in the userspace implementation + */ +struct rt2x00_ops { + const char *name; + const unsigned int drv_data_size; + const unsigned int max_ap_intf; + const unsigned int eeprom_size; + const unsigned int rf_size; + const unsigned int tx_queues; + const struct rt2x00lib_ops *lib; + const void *drv; +#ifdef CONFIG_RT2X00_LIB_DEBUGFS + const struct rt2x00debug *debugfs; +#endif /* CONFIG_RT2X00_LIB_DEBUGFS */ +}; + +/* + * Register defines. + * Some registers require multiple attempts before success, + * in those cases REGISTER_BUSY_COUNT attempts should be + * taken with a REGISTER_BUSY_DELAY interval. Due to USB + * bus delays, we do not have to loop so many times to wait + * for valid register value on that bus. + */ +#define REGISTER_BUSY_COUNT 100 +#define REGISTER_USB_BUSY_COUNT 20 +#define REGISTER_BUSY_DELAY 100 + +/* + * Chipset handlers + */ +static inline void rt2x00_set_chip(struct rt2x00_dev *rt2x00dev, + const u16 rt, const u16 rf, const u16 rev) { + rt2x00dev->chip.rt = rt; + rt2x00dev->chip.rf = rf; + rt2x00dev->chip.rev = rev; + + rt2x00_info(rt2x00dev, "Chipset detected - rt: %04x, rf: %04x, rev: %04x\n", + rt2x00dev->chip.rt, rt2x00dev->chip.rf, + rt2x00dev->chip.rev); +} + +static inline void rt2x00_set_rt(struct rt2x00_dev *rt2x00dev, + const u16 rt, const u16 rev) { + rt2x00dev->chip.rt = rt; + rt2x00dev->chip.rev = rev; + + rt2x00_info(rt2x00dev, "RT chipset %04x, rev %04x detected\n", + rt2x00dev->chip.rt, rt2x00dev->chip.rev); +} + +static inline void rt2x00_set_rf(struct rt2x00_dev *rt2x00dev, const u16 rf) { + rt2x00dev->chip.rf = rf; + + rt2x00_info(rt2x00dev, "RF chipset %04x detected\n", + rt2x00dev->chip.rf); +} + +static inline bool rt2x00_rt(struct rt2x00_dev *rt2x00dev, const u16 rt) { + return (rt2x00dev->chip.rt == rt); +} + +static inline bool rt2x00_rf(struct rt2x00_dev *rt2x00dev, const u16 rf) { + return (rt2x00dev->chip.rf == rf); +} + +static inline u16 rt2x00_rev(struct rt2x00_dev *rt2x00dev) { + return rt2x00dev->chip.rev; +} + +static inline bool rt2x00_rt_rev(struct rt2x00_dev *rt2x00dev, + const u16 rt, const u16 rev) { + return (rt2x00_rt(rt2x00dev, rt) && rt2x00_rev(rt2x00dev) == rev); +} + +static inline bool rt2x00_rt_rev_lt(struct rt2x00_dev *rt2x00dev, + const u16 rt, const u16 rev) { + return (rt2x00_rt(rt2x00dev, rt) && rt2x00_rev(rt2x00dev) < rev); +} + +static inline bool rt2x00_rt_rev_gte(struct rt2x00_dev *rt2x00dev, + const u16 rt, const u16 rev) { + return (rt2x00_rt(rt2x00dev, rt) && rt2x00_rev(rt2x00dev) >= rev); +} + +static inline void rt2x00_set_chip_intf(struct rt2x00_dev *rt2x00dev, + enum rt2x00_chip_intf intf) { + rt2x00dev->chip.intf = intf; +} + +static inline bool rt2x00_intf(struct rt2x00_dev *rt2x00dev, + enum rt2x00_chip_intf intf) { + return (rt2x00dev->chip.intf == intf); +} + +static inline bool rt2x00_is_pci(struct rt2x00_dev *rt2x00dev) { + return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_PCI) || + rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_PCIE); +} + +static inline bool rt2x00_is_pcie(struct rt2x00_dev *rt2x00dev) { + return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_PCIE); +} + +static inline bool rt2x00_is_usb(struct rt2x00_dev *rt2x00dev) { + return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_USB); +} + +static inline bool rt2x00_is_soc(struct rt2x00_dev *rt2x00dev) { + return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC); +} + +/* Helpers for capability flags */ + +static inline bool +rt2x00_has_cap_flag(struct rt2x00_dev *rt2x00dev, + enum rt2x00_capability_flags cap_flag) +{ + return test_bit(cap_flag, &rt2x00dev->cap_flags); +} + +static inline bool +rt2x00_has_cap_hw_crypto(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_HW_CRYPTO); +} + +static inline bool +rt2x00_has_cap_power_limit(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_POWER_LIMIT); +} + +static inline bool +rt2x00_has_cap_control_filters(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_CONTROL_FILTERS); +} + +static inline bool +rt2x00_has_cap_control_filter_pspoll(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_CONTROL_FILTER_PSPOLL); +} + +static inline bool +rt2x00_has_cap_pre_tbtt_interrupt(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_PRE_TBTT_INTERRUPT); +} + +static inline bool +rt2x00_has_cap_link_tuning(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_LINK_TUNING); +} + +static inline bool +rt2x00_has_cap_frame_type(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_FRAME_TYPE); +} + +static inline bool +rt2x00_has_cap_rf_sequence(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_RF_SEQUENCE); +} + +static inline bool +rt2x00_has_cap_external_lna_a(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_EXTERNAL_LNA_A); +} + +static inline bool +rt2x00_has_cap_external_lna_bg(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_EXTERNAL_LNA_BG); +} + +static inline bool +rt2x00_has_cap_double_antenna(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_DOUBLE_ANTENNA); +} + +static inline bool +rt2x00_has_cap_bt_coexist(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_BT_COEXIST); +} + +static inline bool +rt2x00_has_cap_vco_recalibration(struct rt2x00_dev *rt2x00dev) +{ + return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_VCO_RECALIBRATION); +} + +/* + * Generic EEPROM access. The EEPROM is being accessed by word or byte index. + */ +static inline void *rt2x00_eeprom_addr(struct rt2x00_dev *rt2x00dev, + const unsigned int word) { + return (void *)&rt2x00dev->eeprom[word]; +} + +static inline u16 rt2x00_eeprom_read(struct rt2x00_dev *rt2x00dev, + const unsigned int word) { + return le16_to_cpu(rt2x00dev->eeprom[word]); +} + +static inline void rt2x00_eeprom_write(struct rt2x00_dev *rt2x00dev, + const unsigned int word, u16 data) { + rt2x00dev->eeprom[word] = cpu_to_le16(data); +} + +static inline u8 rt2x00_eeprom_byte(struct rt2x00_dev *rt2x00dev, + const unsigned int byte) { + return *(((u8 *)rt2x00dev->eeprom) + byte); +} + +/* + * Generic RF access. + * The RF is being accessed by word index. + */ +static inline u32 rt2x00_rf_read(struct rt2x00_dev *rt2x00dev, + const unsigned int word) +{ + BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32)); + return rt2x00dev->rf[word - 1]; +} + +static inline void rt2x00_rf_write(struct rt2x00_dev *rt2x00dev, + const unsigned int word, u32 data) +{ + BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32)); + rt2x00dev->rf[word - 1] = data; +} + +#define DATA_FRAME_SIZE 2432 + +#endif /* ifndef RT2X00_H */ + diff --git a/libwifiuserspace/rt2800usb/rt2x00lib.h b/libwifiuserspace/rt2800usb/rt2x00lib.h new file mode 100644 index 0000000..67e11ba --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00lib.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + Copyright (C) 2004 - 2009 Ivo van Doorn + Copyright (C) 2004 - 2009 Gertjan van Wingerde + + + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +/* + Module: rt2x00lib + Abstract: Data structures and definitions for the rt2x00lib module. + */ + +#ifndef __RT2x00LIB_H__ +#define __RT2x00LIB_H__ + +#include "kernel/nl80211.h" +#include "kernel/types.h" + +/* + * rt2x00_rate: Per rate device information + */ +struct rt2x00_rate { + unsigned short flags; +#define DEV_RATE_CCK 0x0001 +#define DEV_RATE_OFDM 0x0002 +#define DEV_RATE_SHORT_PREAMBLE 0x0004 + + unsigned short bitrate; /* In 100kbit/s */ + unsigned short ratemask; + + unsigned short plcp; + unsigned short mcs; +}; + +extern const struct rt2x00_rate rt2x00_supported_rates[12]; + +static inline const struct rt2x00_rate *rt2x00_get_rate(const u16 hw_value) +{ + return &rt2x00_supported_rates[hw_value & 0xff]; +} + +#define RATE_MCS(__mode, __mcs) \ + ((((__mode) & 0x00ff) << 8) | ((__mcs) & 0x00ff)) + +static inline int rt2x00_get_rate_mcs(const u16 mcs_value) +{ + return (mcs_value & 0x00ff); +} + +/* + * Initialization handlers. + */ +int rt2x00lib_start(struct rt2x00_dev *rt2x00dev); +void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev); + +/* + * Configuration handlers. + */ +int rt2x00mac_add_interface(struct ieee80211_hw *hw, + struct ieee80211_vif *vif); +void rt2x00lib_config_intf(struct rt2x00_dev *rt2x00dev, + struct rt2x00_intf *intf, + enum nl80211_iftype type, + const u8 *mac, const u8 *bssid); +void rt2x00lib_config_erp(struct rt2x00_dev *rt2x00dev, + struct rt2x00_intf *intf, + struct ieee80211_bss_conf *conf, + u32 changed); +void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, + struct antenna_setup ant); +void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, + struct ieee80211_conf *conf, + const unsigned int changed_flags); + +#endif /* ifndef RT2x00LIB_H */ diff --git a/libwifiuserspace/rt2800usb/rt2x00mac.c b/libwifiuserspace/rt2800usb/rt2x00mac.c new file mode 100644 index 0000000..057c99c --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00mac.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + Copyright (C) 2004 - 2009 Ivo van Doorn + + + */ + +/* + * Userspace port (c) 2019 Hak5 + */ + +/* + Module: rt2x00mac + Abstract: rt2x00 generic mac80211 routines. + */ + +#include + +#include "kernel/ieee80211.h" +#include "kernel/kernel.h" + +#include "rt2800usb/rt2x00.h" +#include "rt2800usb/rt2x00lib.h" + +int rt2x00mac_start(struct ieee80211_hw *hw) +{ + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) hw->priv; + + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) + return 0; + + return rt2x00lib_start(rt2x00dev); +} +EXPORT_SYMBOL_GPL(rt2x00mac_start); + +void rt2x00mac_stop(struct ieee80211_hw *hw) +{ + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) hw->priv; + + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) + return; + + rt2x00lib_stop(rt2x00dev); +} +EXPORT_SYMBOL_GPL(rt2x00mac_stop); + +int rt2x00mac_add_interface(struct ieee80211_hw *hw, + struct ieee80211_vif *vif) +{ + struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *) hw->priv; + struct rt2x00_intf *intf = vif_to_intf(vif); + + /* + * Don't allow interfaces to be added + * the device has disappeared. + */ + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) || + !test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags)) { + rt2x00_err(rt2x00dev, "Device not started before adding vif\n"); + return -ENODEV; + } + + /* + * We are now absolutely sure the interface can be created, + * increase interface count and start initialization. + */ + + /* + * The MAC address must be configured after the device + * has been initialized. Otherwise the device can reset + * the MAC registers. + * The BSSID address must only be configured in AP mode, + * however we should not send an empty BSSID address for + * STA interfaces at this time, since this can cause + * invalid behavior in the device. + */ + rt2x00lib_config_intf(rt2x00dev, intf, vif->type, + vif->addr, NULL); + + return 0; +} +EXPORT_SYMBOL_GPL(rt2x00mac_add_interface); + +void rt2x00lib_config_intf(struct rt2x00_dev *rt2x00dev, + struct rt2x00_intf *intf, + enum nl80211_iftype type, + const u8 *mac, const u8 *bssid) +{ + + /* + * Trimmed down for userspace + */ + + struct rt2x00intf_conf conf; + unsigned int flags = 0; + + conf.type = type; + + switch (type) { + case NL80211_IFTYPE_ADHOC: + conf.sync = TSF_SYNC_ADHOC; + break; + case NL80211_IFTYPE_AP: + case NL80211_IFTYPE_MESH_POINT: + case NL80211_IFTYPE_WDS: + conf.sync = TSF_SYNC_AP_NONE; + break; + case NL80211_IFTYPE_STATION: + conf.sync = TSF_SYNC_INFRA; + break; + default: + conf.sync = TSF_SYNC_NONE; + break; + } + + flags = CONFIG_UPDATE_TYPE | CONFIG_UPDATE_MAC | CONFIG_UPDATE_BSSID; + + rt2x00dev->ops->lib->config_intf(rt2x00dev, intf, &conf, flags); +} + diff --git a/libwifiuserspace/rt2800usb/rt2x00queue.h b/libwifiuserspace/rt2800usb/rt2x00queue.h new file mode 100644 index 0000000..50e04d3 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00queue.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __RT2X00QUEUE_H__ +#define __RT2X00QUEUE_H__ + +#include "kernel/bits.h" +#include "kernel/mac80211.h" +#include "kernel/types.h" + +/** + * DOC: Entry frame size + * + * Ralink PCI devices demand the Frame size to be a multiple of 128 bytes, + * for USB devices this restriction does not apply, but the value of + * 2432 makes sense since it is big enough to contain the maximum fragment + * size according to the ieee802.11 specs. + * The aggregation size depends on support from the driver, but should + * be something around 3840 bytes. + */ +#define DATA_FRAME_SIZE 2432 +#define MGMT_FRAME_SIZE 256 +#define AGGREGATION_SIZE 3840 + +/** + * enum rxdone_entry_desc_flags: Flags for &struct rxdone_entry_desc + * + * @RXDONE_SIGNAL_PLCP: Signal field contains the plcp value. + * @RXDONE_SIGNAL_BITRATE: Signal field contains the bitrate value. + * @RXDONE_SIGNAL_MCS: Signal field contains the mcs value. + * @RXDONE_MY_BSS: Does this frame originate from device's BSS. + * @RXDONE_CRYPTO_IV: Driver provided IV/EIV data. + * @RXDONE_CRYPTO_ICV: Driver provided ICV data. + * @RXDONE_L2PAD: 802.11 payload has been padded to 4-byte boundary. + */ +enum rxdone_entry_desc_flags { + RXDONE_SIGNAL_PLCP = BIT(0), + RXDONE_SIGNAL_BITRATE = BIT(1), + RXDONE_SIGNAL_MCS = BIT(2), + RXDONE_MY_BSS = BIT(3), + RXDONE_CRYPTO_IV = BIT(4), + RXDONE_CRYPTO_ICV = BIT(5), + RXDONE_L2PAD = BIT(6), +}; + +/** + * RXDONE_SIGNAL_MASK - Define to mask off all &rxdone_entry_desc_flags flags + * except for the RXDONE_SIGNAL_* flags. This is useful to convert the dev_flags + * from &rxdone_entry_desc to a signal value type. + */ +#define RXDONE_SIGNAL_MASK \ + ( RXDONE_SIGNAL_PLCP | RXDONE_SIGNAL_BITRATE | RXDONE_SIGNAL_MCS ) + +/** + * struct rxdone_entry_desc: RX Entry descriptor + * + * Summary of information that has been read from the RX frame descriptor. + * + * @timestamp: RX Timestamp + * @signal: Signal of the received frame. + * @rssi: RSSI of the received frame. + * @size: Data size of the received frame. + * @flags: MAC80211 receive flags (See &enum mac80211_rx_flags). + * @dev_flags: Ralink receive flags (See &enum rxdone_entry_desc_flags). + * @rate_mode: Rate mode (See @enum rate_modulation). + * @cipher: Cipher type used during decryption. + * @cipher_status: Decryption status. + * @iv: IV/EIV data used during decryption. + * @icv: ICV data used during decryption. + */ +struct rxdone_entry_desc { + u64 timestamp; + int signal; + int rssi; + int size; + int flags; + int dev_flags; + u16 rate_mode; + u16 enc_flags; + enum mac80211_rx_encoding encoding; + enum rate_info_bw bw; + u8 cipher; + u8 cipher_status; + + __le32 iv[2]; + __le32 icv; +}; + +#endif /* ifndef RT2X00QUEUE_H */ + diff --git a/libwifiuserspace/rt2800usb/rt2x00reg.h b/libwifiuserspace/rt2800usb/rt2x00reg.h new file mode 100644 index 0000000..3584d60 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00reg.h @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __RT2X00REG_H__ +#define __RT2X00REG_H__ + +#include "kernel/bits.h" +#include "kernel/endian.h" +#include "kernel/kernel.h" +#include "kernel/types.h" + +/* + * RX crypto status + */ +enum rx_crypto { + RX_CRYPTO_SUCCESS = 0, + RX_CRYPTO_FAIL_ICV = 1, + RX_CRYPTO_FAIL_MIC = 2, + RX_CRYPTO_FAIL_KEY = 3, +}; + +/* + * Antenna values + */ +enum antenna { + ANTENNA_SW_DIVERSITY = 0, + ANTENNA_A = 1, + ANTENNA_B = 2, + ANTENNA_HW_DIVERSITY = 3, +}; + +/* + * Led mode values. + */ +enum led_mode { + LED_MODE_DEFAULT = 0, + LED_MODE_TXRX_ACTIVITY = 1, + LED_MODE_SIGNAL_STRENGTH = 2, + LED_MODE_ASUS = 3, + LED_MODE_ALPHA = 4, +}; + +/* + * TSF sync values + */ +enum tsf_sync { + TSF_SYNC_NONE = 0, + TSF_SYNC_INFRA = 1, + TSF_SYNC_ADHOC = 2, + TSF_SYNC_AP_NONE = 3, +}; + +/* + * Device states + */ +enum dev_state { + STATE_DEEP_SLEEP = 0, + STATE_SLEEP = 1, + STATE_STANDBY = 2, + STATE_AWAKE = 3, + +/* + * Additional device states, these values are + * not strict since they are not directly passed + * into the device. + */ + STATE_RADIO_ON, + STATE_RADIO_OFF, + STATE_RADIO_IRQ_ON, + STATE_RADIO_IRQ_OFF, +}; + +/* + * IFS backoff values + */ +enum ifs { + IFS_BACKOFF = 0, + IFS_SIFS = 1, + IFS_NEW_BACKOFF = 2, + IFS_NONE = 3, +}; + +/* + * IFS backoff values for HT devices + */ +enum txop { + TXOP_HTTXOP = 0, + TXOP_PIFS = 1, + TXOP_SIFS = 2, + TXOP_BACKOFF = 3, +}; + +/* + * Cipher types for hardware encryption + */ +enum cipher { + CIPHER_NONE = 0, + CIPHER_WEP64 = 1, + CIPHER_WEP128 = 2, + CIPHER_TKIP = 3, + CIPHER_AES = 4, +/* + * The following fields were added by rt61pci and rt73usb. + */ + CIPHER_CKIP64 = 5, + CIPHER_CKIP128 = 6, + CIPHER_TKIP_NO_MIC = 7, /* Don't send to device */ + +/* + * Max cipher type. + * Note that CIPHER_NONE isn't counted, and CKIP64 and CKIP128 + * are excluded due to limitations in mac80211. + */ + CIPHER_MAX = 4, +}; + +/* + * Rate modulations + */ +enum rate_modulation { + RATE_MODE_CCK = 0, + RATE_MODE_OFDM = 1, + RATE_MODE_HT_MIX = 2, + RATE_MODE_HT_GREENFIELD = 3, +}; + +/* + * Firmware validation error codes + */ +enum firmware_errors { + FW_OK, + FW_BAD_CRC, + FW_BAD_LENGTH, + FW_BAD_VERSION, +}; + +/* + * Register handlers. + * We store the position of a register field inside a field structure, + * This will simplify the process of setting and reading a certain field + * inside the register while making sure the process remains byte order safe. + */ +struct rt2x00_field8 { + u8 bit_offset; + u8 bit_mask; +}; + +struct rt2x00_field16 { + u16 bit_offset; + u16 bit_mask; +}; + +struct rt2x00_field32 { + u32 bit_offset; + u32 bit_mask; +}; + +/* + * Power of two check, this will check + * if the mask that has been given contains and contiguous set of bits. + * Note that we cannot use the is_power_of_2() function since this + * check must be done at compile-time. + */ +#define is_power_of_two(x) ( !((x) & ((x)-1)) ) +#define low_bit_mask(x) ( ((x)-1) & ~(x) ) +#define is_valid_mask(x) is_power_of_two(1LU + (x) + low_bit_mask(x)) + +/* + * Macros to find first set bit in a variable. + * These macros behave the same as the __ffs() functions but + * the most important difference that this is done during + * compile-time rather then run-time. + */ +#define compile_ffs2(__x) \ + __builtin_choose_expr(((__x) & 0x1), 0, 1) + +#define compile_ffs4(__x) \ + __builtin_choose_expr(((__x) & 0x3), \ + (compile_ffs2((__x))), \ + (compile_ffs2((__x) >> 2) + 2)) + +#define compile_ffs8(__x) \ + __builtin_choose_expr(((__x) & 0xf), \ + (compile_ffs4((__x))), \ + (compile_ffs4((__x) >> 4) + 4)) + +#define compile_ffs16(__x) \ + __builtin_choose_expr(((__x) & 0xff), \ + (compile_ffs8((__x))), \ + (compile_ffs8((__x) >> 8) + 8)) + +#define compile_ffs32(__x) \ + __builtin_choose_expr(((__x) & 0xffff), \ + (compile_ffs16((__x))), \ + (compile_ffs16((__x) >> 16) + 16)) + +/* + * This macro will check the requirements for the FIELD{8,16,32} macros + * The mask should be a constant non-zero contiguous set of bits which + * does not exceed the given typelimit. + */ +#define FIELD_CHECK(__mask, __type) \ + BUILD_BUG_ON(!(__mask) || \ + !is_valid_mask(__mask) || \ + (__mask) != (__type)(__mask)) \ + +/* Modified for MSVC happiness */ +#define FIELD8(__mask) \ +((struct rt2x00_field8){ \ + compile_ffs8(__mask), (__mask) \ +}) + +#define FIELD16(__mask) \ +((struct rt2x00_field16) { \ + compile_ffs16(__mask), (__mask) \ +}) + +#define FIELD32(__mask) \ +((struct rt2x00_field32) { \ + compile_ffs32(__mask), (__mask) \ +}) + +#define SET_FIELD(__reg, __type, __field, __value) \ +*(__reg) = \ + (*(__reg) & ~((__field).bit_mask)) | \ + ( ((__value) << ((__field).bit_offset)) & ((__field).bit_mask) ) + +#define GET_FIELD(__reg, __type, __field) \ + (((__reg) & ((__field).bit_mask)) >> ((__field).bit_offset)) + +#define rt2x00_set_field32(__reg, __field, __value) \ + SET_FIELD(__reg, struct rt2x00_field32, __field, __value) +#define rt2x00_get_field32(__reg, __field) \ + GET_FIELD(__reg, struct rt2x00_field32, __field) + +#define rt2x00_set_field16(__reg, __field, __value) \ + SET_FIELD(__reg, struct rt2x00_field16, __field, __value) +#define rt2x00_get_field16(__reg, __field) \ + GET_FIELD(__reg, struct rt2x00_field16, __field) + +#define rt2x00_set_field8(__reg, __field, __value) \ + SET_FIELD(__reg, struct rt2x00_field8, __field, __value) +#define rt2x00_get_field8(__reg, __field) \ + GET_FIELD(__reg, struct rt2x00_field8, __field) + + +#endif /* ifndef RT2X00REG_H */ diff --git a/libwifiuserspace/rt2800usb/rt2x00usb.c b/libwifiuserspace/rt2800usb/rt2x00usb.c new file mode 100644 index 0000000..cf63bc1 --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00usb.c @@ -0,0 +1,410 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#include +#include + +#ifndef _WIN32 +#include +#else +#include +#define usleep(x) Sleep((x) < 1000 ? 1 : (x) / 1000) +#endif + +#include + +#include "kernel/kernel.h" + +#include "rt2800usb/rt2x00usb.h" +#include "rt2800usb/rt2x00reg.h" + +#include "userspace/userspace.h" + +/* + * Interfacing with the HW. + */ +int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, const u16 value, + void *buffer, const u16 buffer_length, + const int timeout) { + + struct libusb_device_handle *usb_dev = rt2x00dev->dev; + + int fail_count = 0; + + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) { + rt2x00_err(rt2x00dev, "No device present\n"); + return -ENODEV; + } + + /* + * we use a simplified failure count instead of measuring time, so that + * we don't introduce timeout errors on multi-platform builds; we don't + * want to depend on linux (or posix) high-precision timespec + */ + + if (rt2x00dev->control_transfer_buffer_sz < LIBUSB_CONTROL_SETUP_SIZE + buffer_length) { + if (rt2x00dev->control_transfer_buffer != NULL) + free(rt2x00dev->control_transfer_buffer); + + rt2x00dev->control_transfer_buffer = + (unsigned char *) malloc(LIBUSB_CONTROL_SETUP_SIZE + buffer_length); + + if (rt2x00dev->control_transfer_buffer == NULL) { + rt2x00_err(rt2x00dev, "No memory"); + return -ENOMEM; + } + + rt2x00dev->control_transfer_buffer_sz = LIBUSB_CONTROL_SETUP_SIZE + buffer_length; + } + + /* + * We have to tie into the async io system with libusb here, we use a conditional + * variable to determine when our command completes + */ + + if (rt2x00dev->control_transfer == NULL) + rt2x00dev->control_transfer = libusb_alloc_transfer(0); + + libusb_fill_control_setup(rt2x00dev->control_transfer_buffer, requesttype, request, value, offset, buffer_length); + memcpy(rt2x00dev->control_transfer_buffer + LIBUSB_CONTROL_SETUP_SIZE, buffer, buffer_length); + libusb_fill_control_transfer(rt2x00dev->control_transfer, usb_dev, rt2x00dev->control_transfer_buffer, + rt2x00dev_control_cb, rt2x00dev, timeout / 2); + + do { + rt2x00dev->usb_command_complete = false; + libusb_submit_transfer(rt2x00dev->control_transfer); + + /* Wait for the cond to unlock */ + while (1) { + pthread_mutex_lock(&rt2x00dev->usb_control_mutex); + pthread_cond_wait(&rt2x00dev->usb_control_cond, &rt2x00dev->usb_control_mutex); + + if (!rt2x00dev->usb_command_complete) + continue; + + pthread_mutex_unlock(&rt2x00dev->usb_control_mutex); + break; + } + + if (rt2x00dev->control_transfer->status == LIBUSB_TRANSFER_COMPLETED) { + memcpy(buffer, rt2x00dev->control_transfer_buffer + LIBUSB_CONTROL_SETUP_SIZE, buffer_length); + pthread_mutex_unlock(&rt2x00dev->usb_control_mutex); + return 0; + } + + if (rt2x00dev->control_transfer->status == LIBUSB_TRANSFER_NO_DEVICE) { + clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); + pthread_mutex_unlock(&rt2x00dev->usb_control_mutex); + rt2x00_err(rt2x00dev, "Device no longer available"); + return -ENODEV; + } + + if (rt2x00dev->control_transfer->status == LIBUSB_TRANSFER_TIMED_OUT) + fail_count++; + + } while (fail_count < 3); + + rt2x00_err(rt2x00dev, + "Vendor Request 0x%02x failed for offset 0x%04x with error %d\n", + request, offset, rt2x00dev->control_transfer->status); + + return -1; +} + +int rt2x00usb_vendor_request_buff(struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, void *buffer, + const u16 buffer_length) +{ + int status = 0; + unsigned char *tb; + u16 off, len, bsize; + + mutex_lock(&rt2x00dev->csr_mutex); + + tb = (unsigned char *)buffer; + off = offset; + len = buffer_length; + while (len && !status) { + bsize = min_t(u16, CSR_CACHE_SIZE, len); + status = rt2x00usb_vendor_req_buff_lock(rt2x00dev, request, + requesttype, off, tb, + bsize, REGISTER_TIMEOUT); + + tb += bsize; + len -= bsize; + off += bsize; + } + + mutex_unlock(&rt2x00dev->csr_mutex); + + if (status != 0) + rt2x00_err(rt2x00dev, "Radio USB request failed: %s", libusb_error_name(status)); + + return status; +} + +/* + * Userspace buff_lock doesn't do any locking + */ +int rt2x00usb_vendor_req_buff_lock(struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, void *buffer, + const u16 buffer_length, const int timeout) +{ + int status; + + /* + * Check for Cache availability. + */ + if (unlikely(!rt2x00dev->csr.cache || buffer_length > CSR_CACHE_SIZE)) { + rt2x00_err(rt2x00dev, "CSR cache not available\n"); + return -ENOMEM; + } + + if (requesttype == USB_VENDOR_REQUEST_OUT) + memcpy(rt2x00dev->csr.cache, buffer, buffer_length); + + status = rt2x00usb_vendor_request(rt2x00dev, request, requesttype, + offset, 0, rt2x00dev->csr.cache, + buffer_length, timeout); + + if (!status && requesttype == USB_VENDOR_REQUEST_IN) + memcpy(buffer, rt2x00dev->csr.cache, buffer_length); + + if (status != 0) + rt2x00_err(rt2x00dev, "Radio CSR USB request failed: %s", libusb_error_name(status)); + + return status; +} + +int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + const struct rt2x00_field32 field, + u32 *reg) { + unsigned int i; + + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) + return -ENODEV; + + for (i = 0; i < REGISTER_USB_BUSY_COUNT; i++) { + *reg = rt2x00usb_register_read_lock(rt2x00dev, offset); + if (!rt2x00_get_field32(*reg, field)) + return 1; + usleep(REGISTER_BUSY_DELAY); + } + + rt2x00_err(rt2x00dev, "Indirect register access failed: offset=0x%.08x, value=0x%.08x\n", + offset, *reg); + *reg = ~0; + + return 0; +} + +struct rt2x00_async_read_data { + __le32 reg; + struct rt2x00_dev *rt2x00dev; + bool (*callback)(struct rt2x00_dev *, int, u32); +}; + +/* + * In the userspace port, async actually blocks and then calls the + * cb; we'll find out if this causes problems + */ +void rt2x00usb_register_read_async(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + bool (*callback)(struct rt2x00_dev*, int, u32)) { + struct libusb_device_handle *usb_dev = rt2x00dev->dev; + struct rt2x00_async_read_data *rd; + int status; + + rd = (struct rt2x00_async_read_data *) malloc(sizeof(*rd)); + if (!rd) + return; + + rd->rt2x00dev = rt2x00dev; + rd->callback = callback; + + /* + * Implement the equivalent to rt2x00usb_register_read_async_cb and call + * the provided cb directly; if the callback says to resubmit the request, + * do so + */ + do { + status = libusb_control_transfer(usb_dev, USB_VENDOR_REQUEST_IN, USB_MULTI_READ, + 0, cpu_to_le16(offset), (unsigned char *) &rd->reg, cpu_to_le16(sizeof(u32)), REGISTER_TIMEOUT); + + if (rd->callback(rd->rt2x00dev, status, le32_to_cpu(rd->reg))) + continue; + + break; + } while (1); +} + +static int rt2x00usb_find_endpoints(struct rt2x00_dev *rt2x00dev) { + struct libusb_config_descriptor *config = NULL; + struct libusb_device_descriptor desc; + int ret; + + /* + * interface, config, endpoint, and altsetting iterators + */ + unsigned int i, c, e; + int a; + + bool found_in, found_out; + + + ret = libusb_get_device_descriptor(rt2x00dev->base_dev, &desc); + if (ret != LIBUSB_SUCCESS) { + clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); + return -EPIPE; + } + + /* + * Walk through all available endpoints to search for "bulk in" + * and "bulk out" endpoints. When we find such endpoints collect + * the information we need from the descriptor and confirm they + * exist. + * + * We don't get to use kernel queues so for now we just confirm + * the device looks like we expect it to. + */ + for (c = 0; c < desc.bNumConfigurations; c++) { + ret = libusb_get_config_descriptor(rt2x00dev->base_dev, c, &config); + + if (ret != LIBUSB_SUCCESS) { + clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); + rt2x00_err(rt2x00dev, "unable to retrieve device descriptors"); + return -EPIPE; + } + + for (i = 0; i < config->bNumInterfaces; i++) { + /* + * We expect both out and in to be on the same interface + */ + found_in = false; + found_out = false; + + for (a = 0; a < config->interface[i].num_altsetting; a++) { + for (e = 0; e < config->interface[i].altsetting[a].bNumEndpoints; e++) { + if ((config->interface[i].altsetting[a].endpoint[e].bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) != + LIBUSB_TRANSFER_TYPE_BULK) + continue; + + if (!found_in && + (config->interface[i].altsetting[a].endpoint[e].bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == + LIBUSB_ENDPOINT_IN) { + rt2x00dev->usb_interface_num = i; + rt2x00dev->usb_bulk_in_endp = config->interface[i].altsetting[a].endpoint[e].bEndpointAddress; + found_in = true; + } + + if (!found_out && + (config->interface[i].altsetting[a].endpoint[e].bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == + LIBUSB_ENDPOINT_OUT) { + rt2x00dev->usb_interface_num = i; + rt2x00dev->usb_bulk_out_endp = config->interface[i].altsetting[a].endpoint[e].bEndpointAddress; + found_out = true; + } + + if (found_in && found_out) + break; + } + + if (found_in && found_out) + break; + } + + if (found_in && found_out) + break; + } + + libusb_free_config_descriptor(config); + } + + /* + * At least 1 endpoint for RX and 1 endpoint for TX must be available. + */ + if (!found_in || !found_out) { + rt2x00_err(rt2x00dev, "Bulk-in/Bulk-out endpoints not found\n"); + return -EPIPE; + } + + return 0; +} + +int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev) { + int status; + + /* + * Allocate the driver data memory, if necessary. + */ + if (rt2x00dev->ops->drv_data_size > 0) { + rt2x00dev->drv_data = malloc(rt2x00dev->ops->drv_data_size); + if (!rt2x00dev->drv_data) { + return -ENOMEM; + } + memset(rt2x00dev->drv_data, 0, rt2x00dev->ops->drv_data_size); + } + + /* + * Find endpoints for each queue + */ + status = rt2x00usb_find_endpoints(rt2x00dev); + if (status) + return status; + + return 0; +} + +int rt2x00usb_alloc_reg(struct rt2x00_dev *rt2x00dev) { + rt2x00dev->csr.cache = malloc(CSR_CACHE_SIZE); + if (!rt2x00dev->csr.cache) { + return -ENOMEM; + } + + rt2x00dev->eeprom = (__le16*) malloc(rt2x00dev->ops->eeprom_size); + if (!rt2x00dev->eeprom) { + free(rt2x00dev->csr.cache); + return -ENOMEM; + } + + rt2x00dev->rf = (u32 *) malloc(rt2x00dev->ops->rf_size); + if (!rt2x00dev->rf) { + free(rt2x00dev->csr.cache); + free(rt2x00dev->eeprom); + return -ENOMEM; + } + + return 0; +} + +void rt2x00usb_free(struct rt2x00_dev *rt2x00dev) { + if (rt2x00dev == NULL) + return; + + if (rt2x00dev->csr.cache) + free(rt2x00dev->csr.cache); + + if (rt2x00dev->eeprom) + free(rt2x00dev->eeprom); + + if (rt2x00dev->rf) + free(rt2x00dev->rf); + + free(rt2x00dev); + + return; +} + diff --git a/libwifiuserspace/rt2800usb/rt2x00usb.h b/libwifiuserspace/rt2800usb/rt2x00usb.h new file mode 100644 index 0000000..f25a93d --- /dev/null +++ b/libwifiuserspace/rt2800usb/rt2x00usb.h @@ -0,0 +1,296 @@ +/* + * Copyright (C) 2010 Willow Garage + * Copyright (C) 2004 - 2010 Ivo van Doorn + * + * + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#ifndef __RT2x00USB_H__ +#define __RT2x00USB_H__ + +#include "kernel/types.h" + +#include "rt2800usb/rt2x00.h" + +/** + * enum rt2x00usb_vendor_request: USB vendor commands. + */ +enum rt2x00usb_vendor_request { + USB_DEVICE_MODE = 1, + USB_SINGLE_WRITE = 2, + USB_SINGLE_READ = 3, + USB_MULTI_WRITE = 6, + USB_MULTI_READ = 7, + USB_EEPROM_WRITE = 8, + USB_EEPROM_READ = 9, + USB_LED_CONTROL = 10, /* RT73USB */ + USB_RX_CONTROL = 12, +}; + +/** + * enum rt2x00usb_mode_offset: Device modes offset. + */ +enum rt2x00usb_mode_offset { + USB_MODE_RESET = 1, + USB_MODE_UNPLUG = 2, + USB_MODE_FUNCTION = 3, + USB_MODE_TEST = 4, + USB_MODE_SLEEP = 7, /* RT73USB */ + USB_MODE_FIRMWARE = 8, /* RT73USB */ + USB_MODE_WAKEUP = 9, /* RT73USB */ + USB_MODE_AUTORUN = 17, /* RT2800USB */ +}; + +/** + * rt2x00usb_vendor_request - Send register command to device + * @rt2x00dev: Pointer to &struct rt2x00_dev + * @request: USB vendor command (See &enum rt2x00usb_vendor_request) + * @requesttype: Request type &USB_VENDOR_REQUEST_* + * @offset: Register offset to perform action on + * @value: Value to write to device + * @buffer: Buffer where information will be read/written to by device + * @buffer_length: Size of &buffer + * @timeout: Operation timeout + * + * This is the main function to communicate with the device, + * the &buffer argument _must_ either be NULL or point to + * a buffer allocated by malloc. Failure to do so can lead + * to unexpected behavior depending on the architecture. + */ +int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, const u16 value, + void *buffer, const u16 buffer_length, + const int timeout); + +/** + * rt2x00usb_vendor_request_buff - Send register command to device (buffered) + * @rt2x00dev: Pointer to &struct rt2x00_dev + * @request: USB vendor command (See &enum rt2x00usb_vendor_request) + * @requesttype: Request type &USB_VENDOR_REQUEST_* + * @offset: Register offset to perform action on + * @buffer: Buffer where information will be read/written to by device + * @buffer_length: Size of &buffer + * + * This function will use a previously with malloc allocated cache + * to communicate with the device. The contents of the buffer pointer + * will be copied to this cache when writing, or read from the cache + * when reading. + * Buffers send to &rt2x00usb_vendor_request _must_ be allocated with + * kmalloc. Hence the reason for using a previously allocated cache + * which has been allocated properly. + */ +int rt2x00usb_vendor_request_buff(struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, void *buffer, + const u16 buffer_length); + +/** + * rt2x00usb_vendor_request_buff - Send register command to device (buffered) + * @rt2x00dev: Pointer to &struct rt2x00_dev + * @request: USB vendor command (See &enum rt2x00usb_vendor_request) + * @requesttype: Request type &USB_VENDOR_REQUEST_* + * @offset: Register offset to perform action on + * @buffer: Buffer where information will be read/written to by device + * @buffer_length: Size of &buffer + * @timeout: Operation timeout + * + * A version of &rt2x00usb_vendor_request_buff which must be called + * if the usb_cache_mutex is already held. + */ +int rt2x00usb_vendor_req_buff_lock(struct rt2x00_dev *rt2x00dev, + const u8 request, const u8 requesttype, + const u16 offset, void *buffer, + const u16 buffer_length, const int timeout); + +/** + * rt2x00usb_vendor_request_sw - Send single register command to device + * @rt2x00dev: Pointer to &struct rt2x00_dev + * @request: USB vendor command (See &enum rt2x00usb_vendor_request) + * @offset: Register offset to perform action on + * @value: Value to write to device + * @timeout: Operation timeout + * + * Simple wrapper around rt2x00usb_vendor_request to write a single + * command to the device. Since we don't use the buffer argument we + * don't have to worry about kmalloc here. + */ +static inline int rt2x00usb_vendor_request_sw(struct rt2x00_dev *rt2x00dev, + const u8 request, + const u16 offset, + const u16 value, + const int timeout) { + return rt2x00usb_vendor_request(rt2x00dev, request, + USB_VENDOR_REQUEST_OUT, offset, + value, NULL, 0, timeout); +} + +/** + * rt2x00usb_eeprom_read - Read eeprom from device + * @rt2x00dev: Pointer to &struct rt2x00_dev + * @eeprom: Pointer to eeprom array to store the information in + * @length: Number of bytes to read from the eeprom + * + * Simple wrapper around rt2x00usb_vendor_request to read the eeprom + * from the device. Note that the eeprom argument _must_ be allocated using + * kmalloc for correct handling inside the kernel USB layer. + */ +static inline int rt2x00usb_eeprom_read(struct rt2x00_dev *rt2x00dev, + __le16 *eeprom, const u16 length) { + return rt2x00usb_vendor_request(rt2x00dev, USB_EEPROM_READ, + USB_VENDOR_REQUEST_IN, 0, 0, + eeprom, length, EEPROM_TIMEOUT); +} + +/** + * rt2x00usb_register_read - Read 32bit register word + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * + * This function is a simple wrapper for 32bit register access + * through rt2x00usb_vendor_request_buff(). + */ +static inline u32 rt2x00usb_register_read(struct rt2x00_dev *rt2x00dev, + const unsigned int offset) { + __le32 reg = 0; + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, + USB_VENDOR_REQUEST_IN, offset, + ®, sizeof(reg)); + return le32_to_cpu(reg); +} + +/** + * rt2x00usb_register_read_lock - Read 32bit register word + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * + * This function is a simple wrapper for 32bit register access + * through rt2x00usb_vendor_req_buff_lock(). + */ +static inline u32 rt2x00usb_register_read_lock(struct rt2x00_dev *rt2x00dev, + const unsigned int offset) { + __le32 reg = 0; + rt2x00usb_vendor_req_buff_lock(rt2x00dev, USB_MULTI_READ, + USB_VENDOR_REQUEST_IN, offset, + ®, sizeof(reg), REGISTER_TIMEOUT); + return le32_to_cpu(reg); +} + +/** + * rt2x00usb_register_multiread - Read 32bit register words + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * @value: Pointer to where register contents should be stored + * @length: Length of the data + * + * This function is a simple wrapper for 32bit register access + * through rt2x00usb_vendor_request_buff(). + */ +static inline void rt2x00usb_register_multiread(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + void *value, const u32 length) { + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, + USB_VENDOR_REQUEST_IN, offset, + value, length); +} + +/** + * rt2x00usb_register_write - Write 32bit register word + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * @value: Data which should be written + * + * This function is a simple wrapper for 32bit register access + * through rt2x00usb_vendor_request_buff(). + */ +static inline void rt2x00usb_register_write(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u32 value) { + __le32 reg = cpu_to_le32(value); + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE, + USB_VENDOR_REQUEST_OUT, offset, + ®, sizeof(reg)); +} + +/** + * rt2x00usb_register_write_lock - Write 32bit register word + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * @value: Data which should be written + * + * This function is a simple wrapper for 32bit register access + * through rt2x00usb_vendor_req_buff_lock(). + */ +static inline void rt2x00usb_register_write_lock(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u32 value) { + __le32 reg = cpu_to_le32(value); + rt2x00usb_vendor_req_buff_lock(rt2x00dev, USB_MULTI_WRITE, + USB_VENDOR_REQUEST_OUT, offset, + ®, sizeof(reg), REGISTER_TIMEOUT); +} + +/** + * rt2x00usb_register_multiwrite - Write 32bit register words + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * @value: Data which should be written + * @length: Length of the data + * + * This function is a simple wrapper for 32bit register access + * through rt2x00usb_vendor_request_buff(). + */ +static inline void rt2x00usb_register_multiwrite(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + const void *value, + const u32 length) { + rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_WRITE, + USB_VENDOR_REQUEST_OUT, offset, + (void *)value, length); +} + +/** + * rt2x00usb_regbusy_read - Read from register with busy check + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * @field: Field to check if register is busy + * @reg: Pointer to where register contents should be stored + * + * This function will read the given register, and checks if the + * register is busy. If it is, it will sleep for a couple of + * microseconds before reading the register again. If the register + * is not read after a certain timeout, this function will return + * FALSE. + */ +int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + const struct rt2x00_field32 field, + u32 *reg); + +/** + * rt2x00usb_register_read_async - Asynchronously read 32bit register word + * @rt2x00dev: Device pointer, see &struct rt2x00_dev. + * @offset: Register offset + * @callback: Functon to call when read completes. + * + * Submit a control URB to read a 32bit register. This safe to + * be called from atomic context. The callback will be called + * when the URB completes. Otherwise the function is similar + * to rt2x00usb_register_read(). + * When the callback function returns false, the memory will be cleaned up, + * when it returns true, the urb will be fired again. + */ +void rt2x00usb_register_read_async(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + bool (*callback)(struct rt2x00_dev*, int, u32)); + +int rt2x00usb_alloc_reg(struct rt2x00_dev *rt2x00dev); +void rt2x00usb_free(struct rt2x00_dev *rt2x00dev); + +int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev); + +#endif /* ifndef RT2x00USB_H */ diff --git a/libwifiuserspace/userspace/userspace.c b/libwifiuserspace/userspace/userspace.c new file mode 100644 index 0000000..ffe73b8 --- /dev/null +++ b/libwifiuserspace/userspace/userspace.c @@ -0,0 +1,832 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 Inc + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#include +#else +#include +#define usleep(x) Sleep((x) < 1000 ? 1 : (x) / 1000) +#define sleep(x) Sleep(x * 1000) +#endif + +#ifdef __APPLE__ +#include +#endif + +#include "userspace.h" +#include "rt2800usb/rt2800usb.h" + +#ifdef _WIN32 + /* + * Kluge a windows time into a user time + */ +int gettimeofday(struct timeval* tp, struct timezone* tzp) { + static const uint64_t EPOCH = ((uint64_t)116444736000000000ULL); + + SYSTEMTIME system_time; + FILETIME file_time; + uint64_t time; + + GetSystemTime(&system_time); + SystemTimeToFileTime(&system_time, &file_time); + time = ((uint64_t)file_time.dwLowDateTime); + time += ((uint64_t)file_time.dwHighDateTime) << 32; + + tp->tv_sec = (long)((time - EPOCH) / 10000000L); + tp->tv_usec = (long)(system_time.wMilliseconds * 1000); + return 0; +} + +#define timercmp(a, b, CMP) \ + (((a)->tv_sec == (b)->tv_sec) ? \ + ((a)->tv_usec CMP (b)->tv_usec) : \ + ((a)->tv_sec CMP (b)->tv_sec)) + +#define timeradd(a, b, result) \ + do { \ + (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ + (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ + if ((result)->tv_usec >= 1000000) \ + { \ + ++(result)->tv_sec; \ + (result)->tv_usec -= 1000000; \ + } \ + } while (0) + +#define timersub(a, b, result) \ + do { \ + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((result)->tv_usec < 0) { \ + --(result)->tv_sec; \ + (result)->tv_usec += 1000000; \ + } \ + } while (0) +#endif + +void *userspace_wifi_service_thread(void *ctx) { + struct userspace_wifi_context *context = (struct userspace_wifi_context *) ctx; + int r; + + while (context->service_thread_enabled) { + r = libusb_handle_events_completed(context->libusb_context, NULL); + + if (r != 0) { + userspace_wifi_error(context, NULL, r, "Failed to handle USB events: %s", + libusb_error_name(r)); + } + } + + return NULL; +} + +void *userspace_wifi_cmd_service_thread(void *ctx) { + struct userspace_wifi_context *context = (struct userspace_wifi_context *) ctx; + struct userspace_wifi_command *command; + + while (context->cmd_thread_enabled) { + pthread_mutex_lock(&context->cmd_wakeup_mutex); + pthread_cond_wait(&context->cmd_wakeup_cond, &context->cmd_wakeup_mutex); + + while (1) { + pthread_mutex_lock(&context->cmd_mutex); + command = context->cmd_queue; + + if (command != NULL) { + context->cmd_queue = command->next; + if (context->cmd_queue == NULL) + context->cmd_queue_last = NULL; + + /* We must unlock BEFORE calling the callback */ + pthread_mutex_unlock(&context->cmd_mutex); + + (command->callback)(context, command->device, command->param); + + free(command); + + continue; + } + + pthread_mutex_unlock(&context->cmd_mutex); + + break; + } + + pthread_mutex_unlock(&context->cmd_wakeup_mutex); + } + + return NULL; +} + +#ifdef __APPLE__ +/* Find the last instance of the / in the path and slice everything + * after it off by chopping with a \0. Modifies the passed path. */ +void chop_after_last_slash(char *path) { + char *last = path; + char *pos = NULL; + + while ((pos = strstr(last + 1, "/")) != NULL) { + last = pos; + } + + last[0] = 0; +} +#endif + +/* + * Standard firmware loader which looks in the specified firmware dir (if any), various + * system directories, and the libwifiuserspace share directory + */ +int userspace_load_firmware_file(const struct userspace_wifi_context *context, const char *file_name, + const char **file_hints, size_t hints_len, + uint8_t **firmware_blob, size_t *blob_len) { + FILE *fwfile = NULL; + int fwfd = -1; + struct stat statbuf; + char fw_path[2048]; + size_t i; + +#ifdef __APPLE__ + char exe_path[2048]; + uint32_t exe_path_sz = 2048; +#endif + + /* Start by looking at the context dir, if any */ + if (context->firmware_directory != NULL) { + snprintf(fw_path, 2048, "%s/%s", context->firmware_directory, file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + + /* Look at all the hints */ + for (i = 0; i < hints_len; i++) { + snprintf(fw_path, 2048, "%s/%s/%s", context->firmware_directory, file_hints[i], file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + } + } + + /* Look at the current directory */ + snprintf(fw_path, 2048, "%s", file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + + /* Look at all the hints */ + for (i = 0; i < hints_len; i++) { + snprintf(fw_path, 2048, "%s/%s", file_hints[i], file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + } + + /* Look at the share firmware dir */ + snprintf(fw_path, 2048, "%s/%s", FIRMWAREDIR, file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + + /* Look at all the hints */ + for (i = 0; i < hints_len; i++) { + snprintf(fw_path, 2048, "%s/%s/%s", FIRMWAREDIR, file_hints[i], file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + } + + /* Look at the stock linux firmware dir */ + snprintf(fw_path, 2048, "%s/%s", "/lib/firmware/", file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + + /* Look at all the hints */ + for (i = 0; i < hints_len; i++) { + snprintf(fw_path, 2048, "%s/%s/%s", "/lib/firmware/", file_hints[i], file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + } + + /* Look in our path in case we're on OSX and the firmware is in our framework */ +#ifdef __APPLE__ + if (_NSGetExecutablePath(exe_path, &exe_path_sz) == 0) { + chop_after_last_slash(exe_path); + snprintf(fw_path, 2048, "%s/%s/%s", exe_path, "../Resources/firmware/", file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + + /* Look at all the hints */ + for (i = 0; i < hints_len; i++) { + snprintf(fw_path, 2048, "%s/%s/%s/%s", exe_path, "../Resources/firmware/", file_hints[i], file_name); + if ((fwfile = fopen(fw_path, "rb")) != NULL) + goto got_file; + } + } + +#endif + + + goto no_file; + +got_file: + fwfd = fileno(fwfile); + if (fstat(fwfd, &statbuf) != 0) { + fclose(fwfile); + + userspace_wifi_error(context, NULL, -ENOENT, "Could not find firmware file '%s'", + file_name); + + return -ENOENT; + } + +#ifndef _WIN32 + if (!S_ISREG(statbuf.st_mode)) { + fclose(fwfile); + + userspace_wifi_error(context, NULL, -ENOENT, "Firmware file '%s' not a normal file", + file_name); + + return -ENOENT; + } +#endif + + (*firmware_blob) = (uint8_t *) malloc(statbuf.st_size); + if ((*firmware_blob) == NULL) { + fclose(fwfile); + goto no_mem; + } + + *blob_len = statbuf.st_size; + + fread((*firmware_blob), *blob_len, 1, fwfile); + + fclose(fwfile); + + return 0; + +no_file: + userspace_wifi_error(context, NULL, -ENOENT, "Could not find firmware file '%s' in " + "any of the standard locations. Make sure you've installed the required " + "firmware files.", file_name); + return -ENOENT; + +no_mem: + userspace_wifi_error(context, NULL, -ENOENT, "Could not allocate memory to load " + "firmware file '%s'", file_name); + return -ENOMEM; + +} + +int userspace_wifi_init(struct userspace_wifi_context **context) { + /* int status; */ + + *context = (struct userspace_wifi_context *) malloc(sizeof(struct userspace_wifi_context)); + + if (*context == NULL) + return -1; + + memset(*context, 0, sizeof(struct userspace_wifi_context)); + + (*context)->devs = NULL; + (*context)->devs_cnt = 0; + (*context)->service_device_count = 0; + + (*context)->load_firmware_file = &userspace_load_firmware_file; + + /* + status = libusb_init(&(*context)->libusb_context); + if (status < 0) + return status; + */ + + pthread_mutex_init(&(*context)->libusb_mutex, NULL); + + (*context)->cmd_thread_enabled = true; + pthread_mutex_init(&(*context)->cmd_mutex, NULL); + pthread_mutex_init(&(*context)->cmd_wakeup_mutex, NULL); + pthread_cond_init(&(*context)->cmd_wakeup_cond, NULL); + pthread_create(&(*context)->cmd_thread, NULL, userspace_wifi_cmd_service_thread, (*context)); + + pthread_mutex_init(&(*context)->led_ts_mutex, NULL); + pthread_mutex_init(&(*context)->led_cond_mutex, NULL); + pthread_cond_init(&(*context)->led_cond, NULL); + (*context)->led_devs = NULL; + (*context)->led_thread_enable = false; + + return 0; +} + +void userspace_wifi_free(struct userspace_wifi_context *context) { + if (context != NULL) { + context->service_thread_enabled = false; + + if (context->devs != NULL) { + libusb_free_device_list(context->devs, 1); + } + + if (context->libusb_context != NULL) + libusb_exit(context->libusb_context); + + if (context->service_thread_active) { + pthread_join(context->async_service_thread, NULL); + } + + free(context); + } +} + +int userspace_wifi_probe(struct userspace_wifi_context *context, + struct userspace_wifi_probe_dev **devices) { + struct userspace_wifi_probe_dev *probe_dev; + int i, ret; + struct libusb_device_descriptor desc; + struct libusb_device_handle *handle; + int probed_count = 0; + + if (context->devs != NULL) + libusb_free_device_list(context->devs, 1); + + if (context->libusb_context != NULL) + libusb_exit(context->libusb_context); + + libusb_init(&context->libusb_context); + + context->devs = NULL; + + *devices = NULL; + + context->devs_cnt = libusb_get_device_list(context->libusb_context, &(context->devs)); + + if (context->devs_cnt <= 0) + return context->devs_cnt; + + /* + * Scan via each of the userspace drivers + */ + for (i = 0; context->devs[i]; ++i) { + ret = libusb_get_device_descriptor(context->devs[i], &desc); + + if (ret != 0) + continue; + + ret = libusb_open(context->devs[i], &handle); + + if (ret != 0) + continue; + + /* + * For each supported driver, probe until we get a match. + * For each match, add it to our count and our linked list + */ + if (rt2800usb_probe_device(&desc, &probe_dev) > 0) { + probe_dev->context = context; + + probe_dev->dev = context->devs[i]; + + /* + * Collect as much info about the device as we can, we need it to + * identify grouped devices for some platforms + */ + probe_dev->usb_bus = libusb_get_bus_number(context->devs[i]); + probe_dev->usb_port = libusb_get_port_number(context->devs[i]); + probe_dev->usb_device = libusb_get_device_address(context->devs[i]); + + ret = libusb_get_port_numbers(context->devs[i], probe_dev->usb_bus_path, 8); + if (ret > 0) { + probe_dev->usb_bus_path_len = ret; + } + + if (desc.iSerialNumber) { + libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, + probe_dev->usb_serial, 64); + } + + probe_dev->next = *devices; + *devices = probe_dev; + probe_dev = NULL; + + probed_count++; + } + + libusb_close(handle); + + } + + return probed_count; +} + +void userspace_wifi_free_probe(struct userspace_wifi_probe_dev *devices) { + struct userspace_wifi_probe_dev *next; + + while (devices != NULL) { + next = devices->next; + + if (devices->driver_name) + free(devices->driver_name); + if (devices->device_type) + free(devices->device_type); + + free(devices); + devices = next; + } +} + +void userspace_wifi_for_each_probe(struct userspace_wifi_context *context, + struct userspace_wifi_probe_dev *devices, + int (*cb)(struct userspace_wifi_context *, struct userspace_wifi_probe_dev *)) { + struct userspace_wifi_probe_dev *next = devices; + int r; + + while (next != NULL) { + r = (*cb)(context, next); + + if (r) + return; + + next = next->next; + } +} + +void userspace_wifi_handle_usbio(struct userspace_wifi_context *context) { + context->service_thread_enabled = true; + int r; + + while (context->service_thread_enabled) { + r = libusb_handle_events_completed(context->libusb_context, NULL); + + if (r < 0) { + userspace_wifi_error(context, NULL, r, "Handling USB IO queue failed: %s", + libusb_error_name(r)); + break; + } + } +} + +int userspace_wifi_device_open(struct userspace_wifi_context *context, + struct userspace_wifi_probe_dev *probedevice, + struct userspace_wifi_dev **device) { + int r; + + if (!context->service_thread_enabled) { + context->service_thread_enabled = true; + context->service_thread_active = true; + pthread_create(&context->async_service_thread, NULL, userspace_wifi_service_thread, context); + } + + r = (*(probedevice->open_device))(probedevice, device); + + if (r < 0) { + userspace_wifi_error(context, *device, r, "Opening device failed"); + return r; + } + +#if 0 + if (!context->service_thread_active) { + context->service_thread_enabled = true; + context->service_thread_active = true; + context->service_device_count++; + + pthread_create(&(context->async_service_thread), NULL, userspace_wifi_service_thread, context); + } +#endif + + return r; +} + +/* + * Queue work to the end of the worker queue + */ +void userspace_wifi_queue_work(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void (*callback)(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param), void *param) { + + struct userspace_wifi_command *cmd = + (struct userspace_wifi_command *) malloc(sizeof(struct userspace_wifi_command)); + + cmd->next = NULL; + cmd->device = device; + cmd->callback = callback; + cmd->param = param; + + pthread_mutex_lock(&context->cmd_mutex); + + cmd->id = context->work_id++; + + if (context->cmd_queue == NULL) { + context->cmd_queue = cmd; + context->cmd_queue_last = cmd; + } else { + context->cmd_queue_last->next = cmd; + context->cmd_queue_last = cmd; + } + + /* Signal the worker thread */ + pthread_cond_signal(&context->cmd_wakeup_cond); + + pthread_mutex_unlock(&context->cmd_mutex); + +} + +void _userspace_wifi_start_capture_cb(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param) { + + /* + * TODO handle error and backpropagate + */ + device->start_capture(device); +} + +int userspace_wifi_device_start_capture(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device) { + userspace_wifi_queue_work(context, device, &_userspace_wifi_start_capture_cb, NULL); + return 0; +} + +void _userspace_wifi_stop_capture_cb(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param) { + + device->start_capture(device); +} + +int userspace_wifi_device_stop_capture(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device) { + userspace_wifi_queue_work(context, device, &_userspace_wifi_stop_capture_cb, NULL); + return 0; +} + +struct _userspace_wifi_channel_param { + int channel; + enum nl80211_chan_width width; +}; + +void _userspace_wifi_channel_cb(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param) { + struct _userspace_wifi_channel_param *ch = (struct _userspace_wifi_channel_param *) param; + int r; + + /* + * TODO handle error and backpropagate + */ + + r = device->set_channel(device, ch->channel, ch->width); + + if (r < 0) + userspace_wifi_error(context, device, r, "Setting channel %d:%d failed: %d / %s", + ch->channel, ch->width, r, strerror(r)); + + free(ch); +} + +int userspace_wifi_device_set_channel(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + int channel, enum nl80211_chan_width width) { + struct _userspace_wifi_channel_param *p = + (struct _userspace_wifi_channel_param *) malloc(sizeof(struct _userspace_wifi_channel_param)); + + if (p == NULL) + return -ENOMEM; + + p->channel = channel; + p->width = width; + + userspace_wifi_queue_work(context, dev, &_userspace_wifi_channel_cb, p); + + return 0; +} + +void _userspace_wifi_led_on(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param) { + device->set_led(device, true); +} + +void _userspace_wifi_led_off(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param) { + device->set_led(device, false); +} + +int userspace_wifi_device_set_led(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, bool enable) { + if (enable) + userspace_wifi_queue_work(context, dev, &_userspace_wifi_led_on, NULL); + else + userspace_wifi_queue_work(context, dev, &_userspace_wifi_led_off, NULL); + + return 0; +} + +void *_userspace_wifi_led_thread(void *ctx) { + struct userspace_wifi_context *context = (struct userspace_wifi_context *) ctx; + + struct userspace_wifi_dev_led *led; + + struct timeval now; + struct timeval diff_ts; + struct timeval sleep_ts; + + while (context->led_thread_enable) { + sleep_ts.tv_sec = 0; + sleep_ts.tv_usec = 0; + + diff_ts.tv_sec = 0; + diff_ts.tv_usec = 0; + + pthread_mutex_lock(&context->led_ts_mutex); + gettimeofday(&now, NULL); + + led = context->led_devs; + + while (led) { + if (led->trigger_ts.tv_sec == 0) { + led = led->next; + continue; + } + + /* + * Did we miss the timer? + */ + if (timercmp(&led->trigger_ts, &now, <=)) { + /* + * Zero out the trigger + */ + led->trigger_ts.tv_sec = 0; + + userspace_wifi_device_set_led(context, led->dev, led->restore_state); + + led = led->next; + continue; + } + + /* + * Otherwise we're still waiting; Figure out when to wake up. We want to find + * the most likely next timer. + */ + timersub(&led->trigger_ts, &now, &diff_ts); + + if (timercmp(&sleep_ts, &diff_ts, <)) { + sleep_ts.tv_sec = diff_ts.tv_sec; + sleep_ts.tv_usec = diff_ts.tv_usec; + + if (sleep_ts.tv_sec > 0) { + printf("something weird in sleep for device %d: %lu secs\n", led->dev->dev_id, sleep_ts.tv_sec); + } + } + + led = led->next; + } + pthread_mutex_unlock(&context->led_ts_mutex); + + /* + * Sleep the shortest amount of time and try all the timers again without + * waiting for a cond signal + */ + if (sleep_ts.tv_sec != 0 || sleep_ts.tv_usec != 0) { + sleep(sleep_ts.tv_sec); + usleep(sleep_ts.tv_usec); + continue; + } + + /* + * Otherwise we've handled all extant timers, sleep the thread until we get a + * conditional kick + */ + + pthread_mutex_lock(&context->led_cond_mutex); + pthread_cond_wait(&context->led_cond, &context->led_cond_mutex); + pthread_mutex_unlock(&context->led_cond_mutex); + } + + return NULL; +} + +void _userspace_wifi_start_led_thread(struct userspace_wifi_context *context) { + context->led_thread_enable = true; + pthread_create(&context->led_thread, NULL, _userspace_wifi_led_thread, context); + pthread_cond_signal(&context->led_cond); +} + +void _userspace_wifi_kill_led_thread(struct userspace_wifi_context *context) { + context->led_thread_enable = false; + pthread_cond_signal(&context->led_cond); + pthread_join(context->led_thread, NULL); +} + +int userspace_wifi_device_enable_led_control(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device) { + + struct userspace_wifi_dev_led *led = + (struct userspace_wifi_dev_led *) malloc(sizeof(struct userspace_wifi_dev_led)); + + if (led == NULL) + return -ENOMEM; + + memset(led, 0, sizeof(struct userspace_wifi_dev_led)); + + device->led_control = led; + led->dev = device; + led->next = NULL; + + pthread_mutex_lock(&context->led_ts_mutex); + led->next = context->led_devs; + context->led_devs = led; + + if (!context->led_thread_enable) + _userspace_wifi_start_led_thread(context); + + pthread_mutex_unlock(&context->led_ts_mutex); + + return 0; +} + +void userspace_wifi_device_disable_led_control(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device) { + + struct userspace_wifi_dev_led *led = NULL, *removal = NULL; + + pthread_mutex_lock(&context->led_ts_mutex); + led = context->led_devs; + + if (led == device->led_control) { + context->led_devs = led->next; + removal = led; + } else { + while (led) { + if (led->next == device->led_control) { + led->next = device->led_control->next; + removal = led; + break; + } + + led = led->next; + } + } + + if (!removal) { + pthread_mutex_unlock(&context->led_ts_mutex); + return; + } + + free(removal); + device->led_control = NULL; + + if (context->led_devs == NULL) + _userspace_wifi_kill_led_thread(context); + + pthread_mutex_unlock(&context->led_ts_mutex); +} + +int userspace_wifi_device_blink_led(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + unsigned int duration_us, bool restore_state, + bool extend) { + + struct timeval add_ts = { + .tv_sec = 0, + .tv_usec = duration_us + }; + struct timeval now; + + if (device->led_control == NULL) + return -ENODEV; + + pthread_mutex_lock(&context->led_ts_mutex); + + /* + * Only toggle the LED if we're not in a timer + */ + if (device->led_control->trigger_ts.tv_sec == 0) { + userspace_wifi_device_set_led(context, device, !restore_state); + } + + /* + * If we're extending the timer or there is no timer + */ + if (extend || device->led_control->trigger_ts.tv_sec == 0) { + gettimeofday(&now, NULL); + timeradd(&now, &add_ts, &device->led_control->trigger_ts); + device->led_control->restore_state = restore_state; + + /* + * Wake up the thread if it isn't already in a processing state + */ + pthread_cond_signal(&context->led_cond); + } + + pthread_mutex_unlock(&context->led_ts_mutex); + + return 0; +} + diff --git a/libwifiuserspace/userspace/userspace.h b/libwifiuserspace/userspace/userspace.h new file mode 100644 index 0000000..47755e1 --- /dev/null +++ b/libwifiuserspace/userspace/userspace.h @@ -0,0 +1,434 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 LLC + * + */ + +#ifndef __USERSPACE_H__ +#define __USERSPACE_H__ + +#include +#include +#include +#include + + +#include + +#include "kernel/nl80211.h" +#include "kernel/types.h" +#include "kernel/usb.h" + +/* + * Userspace wifi USB context; this is used to store a bunch of state info + * like the USB device list which we need to keep until we shut down + */ + +/* + * Forward definitions of various stuff we need + */ +struct userspace_wifi_dev; +struct userspace_wifi_command; +struct userspace_wifi_dev_led; +struct userspace_wifi_rx_signal; + +struct userspace_wifi_context { + struct libusb_context *libusb_context; + struct libusb_device **devs; + ssize_t devs_cnt; + + /* + * Libusb async can't handle scheduling multiple things at once so we have to guard it + */ + pthread_mutex_t libusb_mutex; + + pthread_t async_service_thread; + bool service_thread_enabled; + bool service_thread_active; + int service_device_count; + + /* + * We can't perform operations on the service thread so we have to process them + * through a helper thread + */ + pthread_t cmd_thread; + bool cmd_thread_enabled; + pthread_mutex_t cmd_mutex; + + pthread_mutex_t cmd_wakeup_mutex; + pthread_cond_t cmd_wakeup_cond; + struct userspace_wifi_command *cmd_queue; + struct userspace_wifi_command *cmd_queue_last; + unsigned long long work_id; + + /* + * Optional, where to find the firmware. Can be set by the consumer + * to pass an alternate firmware directory. By default, firmware fetches + * look in the default directory set at install time. + */ + char *firmware_directory; + + /* + * Helper function called BY the drivers, to load firmware of a given name. Can be + * overridden in the future. Can include 'hints' from the driver to help find + * nested firmware (for instance in the linux firmware tree). + * + * Returns 0 and firmware_blob as an allocated chunk and blob_len as length, + * or negative error + */ + int (*load_firmware_file)(const struct userspace_wifi_context *context, + const char *file_name, const char **file_hints, size_t hints_len, + uint8_t **firmware_blob, size_t *blob_len); + + /* + * Helper functions supplied by the consumer, called by the + * driver + */ + + /* + * Record used by the consumer to store state + */ + void *local_data; + + /* + * Called on error, with a string and numerical error code. This being + * called indicates an unrecoverable error condition. + * + * error_str will be null terminated, but may be a pointer to a stack + * variable of the calling function. Any storage of this value must be + * copied (via strdup, etc) + */ + void (*handle_error)(const struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + const char *error_str, int error_code); + + /* + * Handle an incoming packet and l1 signal data + */ + int (*handle_packet_rx)(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + struct userspace_wifi_rx_signal *signal, + unsigned char *data, unsigned int len); + + /* + * Blinking LEDs takes a surprising amount of work! We need to run + * another thread that knows when to turn them off. + */ + pthread_t led_thread; + bool led_thread_enable; + + /* + * Trigger condition for waking up a sleeping LED control thread + */ + pthread_mutex_t led_cond_mutex; + pthread_cond_t led_cond; + + /* + * Access control mutex for adding/removing devices from the LED control list + */ + pthread_mutex_t led_ts_mutex; + struct userspace_wifi_dev_led *led_devs; +}; + +/* + * We need to track each device we control for LEDs; we need to know when to turn + * the LED on or off, and what state to return it to. + */ +struct userspace_wifi_dev_led { + struct userspace_wifi_dev_led *next; + + struct userspace_wifi_dev *dev; + struct timeval trigger_ts; + bool restore_state; +}; + +static inline void userspace_wifi_lock(struct userspace_wifi_context *context) { + pthread_mutex_lock(&context->libusb_mutex); +} + +static inline void userspace_wifi_unlock(struct userspace_wifi_context *context) { + pthread_mutex_unlock(&context->libusb_mutex); +} + +/* + * Command thread interactions take place using a generic structure which the command + * handlers fill in + */ +struct userspace_wifi_command { + struct userspace_wifi_command *next; + + struct userspace_wifi_dev *device; + void (*callback)(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param); + void *param; + + unsigned long long id; +}; + +void userspace_wifi_queue_work(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + void (*callback)(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + void *param), void *param); + +/* + * Userspace USB device list populated by the scanning function, and used + * to open a userspace USB Wi-Fi device + */ +struct userspace_wifi_probe_dev { + /* + * Context to pass along + */ + struct userspace_wifi_context *context; + + /* + * Device that we matched against from the raw hw list + */ + const struct usb_device_id *device_id_match; + + /* + * Libusb device we could open as a device_handle + */ + libusb_device *dev; + + /* + * Arbitrary name and type + */ + char *driver_name; + char *device_type; + + /* + * Bus and device location + */ + int usb_bus; + int usb_port; + int usb_device; + + /* + * USB serial number of device + */ + unsigned char usb_serial[64]; + + /* + * USB bus path + */ + uint8_t usb_bus_path[8]; + int usb_bus_path_len; + + /* + * Opening function supplied by the driver that found us, opens a *dev into a userspace dev + */ + int (*open_device)(struct userspace_wifi_probe_dev *dev, struct userspace_wifi_dev **udev); + + /* + * Linked list of N possible devices to open + */ + struct userspace_wifi_probe_dev *next; +}; + +/* + * Userspace USB wifi device after it's been opened, with helper functions added by the + * userspace driver + */ +struct userspace_wifi_dev { + /* + * overall context, needed for locks + */ + struct userspace_wifi_context *context; + + /* + * Arbitrary device id + */ + int dev_id; + + /* + * device hardware/eeprom MAC, if available + */ + uint8_t dev_mac[6]; + + /* + * USB serial number of device + */ + unsigned char usb_serial[64]; + + /* + * Record used by the driver (often to hold the usb device state) + */ + void *dev_data; + + /* + * Libusb device we could open as a device_handle + */ + libusb_device *dev; + + /* + * Do we continue queuing transfers? + */ + bool usb_transfer_active; + + /* + * USB data buffer allocated by the driver + */ + unsigned char *usb_transfer_buffer; + + /* + * USB async transfer record allocated by the driver + */ + struct libusb_transfer *usb_transfer; + + /* + * Helper functions supplied by the driver + */ + + int (*start_capture)(struct userspace_wifi_dev *dev); + void (*stop_capture)(struct userspace_wifi_dev *dev); + + int (*set_channel)(struct userspace_wifi_dev *dev, int channel, enum nl80211_chan_width width); + int (*set_led)(struct userspace_wifi_dev *dev, bool enable); + + /* + * Pointer to the LED control object, if one exists + */ + struct userspace_wifi_dev_led *led_control; + +}; + +/* + * Signal data extracted from radio + */ +struct userspace_wifi_rx_signal { + bool crc_valid; + unsigned int channel; + enum nl80211_band band; + int signal; + enum nl80211_chan_width chan_width; + bool short_gi; + unsigned int mcs; +}; + +/* + * Initialize the userspace usb driver system; this calls libusb init and + * allocates a context in **context. This context should be freed and + * the system shut down with free_userspace_wifi_system + */ +int userspace_wifi_init(struct userspace_wifi_context **context); + +/* + * Clean up the userspace usb driver system + */ +void userspace_wifi_free(struct userspace_wifi_context *context); + +/* + * Scan for any supported wifi devices; returns negative error or total number + * of devices found in the probe, and populates **devices with a linked list + * of probe results. + */ +int userspace_wifi_probe(struct userspace_wifi_context *context, + struct userspace_wifi_probe_dev **devices); + +/* + * Free the results of a probe list + */ +void userspace_wifi_free_probe(struct userspace_wifi_probe_dev *devices); + +/* + * Call a function for each result of a probe list (obscuring the linked list + * internals). + * Callback should return 0 to continue or non-0 to break + */ +void userspace_wifi_for_each_probe(struct userspace_wifi_context *context, + struct userspace_wifi_probe_dev *devices, + int (*cb)(struct userspace_wifi_context *, struct userspace_wifi_probe_dev *)); + +/* + * Set an error handling callback + */ +static inline void userspace_wifi_set_error_cb(struct userspace_wifi_context *context, + void (*cb)(const struct userspace_wifi_context *, struct userspace_wifi_dev *, + const char *, int)) { + context->handle_error = cb; +} + +/* + * Trigger an error + */ +static inline void userspace_wifi_error(const struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + int errnum, const char *fmt, ...) { + char buf[2048]; + va_list arg_ptr; + + va_start(arg_ptr, fmt); + vsnprintf(buf, 2048, fmt, arg_ptr); + va_end(arg_ptr); + + if (context->handle_error != NULL) { + (*context->handle_error)(context, dev, buf, errnum); + return; + } + + fprintf(stderr, "ERROR: %s\n", buf); +} + + +/* + * Set a callback for handling packets + */ +static inline void userspace_wifi_set_packet_cb(struct userspace_wifi_context *context, + int (*cb)(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + struct userspace_wifi_rx_signal *signal, + unsigned char *data, unsigned int len)) { + context->handle_packet_rx = cb; +} + + +/* + * Open a userspace device via the open function supplied by the driver + * Returns 0 on success, non-zero on failure. On success, allocates a usb device in *device. + */ +int userspace_wifi_device_open(struct userspace_wifi_context *context, + struct userspace_wifi_probe_dev *probedevice, + struct userspace_wifi_dev **device); + +int userspace_wifi_device_start_capture(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev); +int userspace_wifi_device_stop_capture(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev); +int userspace_wifi_device_set_channel(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + int channel, enum nl80211_chan_width width); +int userspace_wifi_device_set_led(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, bool enable); + +static inline void userspace_wifi_device_set_id(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + int id) { + dev->dev_id = id; +} + +static inline int userspace_wifi_device_get_id(const struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev) { + return dev->dev_id; +} + +/* + * Enable LED controls for a specific device; this will enable the LED control thread + * if it is not already running. + */ +int userspace_wifi_device_enable_led_control(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device); +void userspace_wifi_device_disable_led_control(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device); +/* + * Blink a LED for duration_ms (setting led to !restore_state), then restore it. + * If extending, extend any existing timer by an additional duration_ms + */ +int userspace_wifi_device_blink_led(struct userspace_wifi_context *context, + struct userspace_wifi_dev *device, + unsigned int duration_ms, bool restore_state, bool extend); + + +#endif /* ifndef USERSPACE_H */ diff --git a/macos/AppIcon.icns b/macos/AppIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..8dd4fb6db3cd622e7038178e43cbcbd20ce5ebf8 GIT binary patch literal 1257977 zcmb??Q;=p&5ari4rfp2ywr$&*Hm7adwmEH1+qP|M+V;2o??&wI!#?gqmTpE=#f`jK znR(8&G_i96pfbH$nlLc~06)tj6y+rlU~ymp004rNq^RgvmcO^ZI}j&j z31L9ZG~U_wMATGM%1llUK>a<227rWF0>J-M`4*gS0RX`AK>%RiJ;;A+`Jn&%sbD_X z{~7R?_cY$IZjtjlfV&|6+O3%U(A-#i3Ag9HgFn|BGP=JlX&6i;wyaEX z>|D&ti=eR`r_$*}|7$;fTrqgA^gdgBou{+N4Znq&0$FNrGm6sZyFOVQrciJL=Y7WI(S0~i+9!c#RVXNmWugD*Xe)yFZEC?xTdCXS?w8D@bDv(Y;R*knI`iZkjf z?T-0b#=P{yx84rpRtJN7-ycsUs>XW@i2}Uo#&!fpS3t~!z@9ARI{2xz?R=hK!#83z5c?Apg1Q$Yqzp@i`+(|%UyPQs@`DPav z7vqXyk#QFhEHWYhI4>^Q*cvak9PZ#3_1qHSF*tqT# z)turRgarW`Qeqp$iloI1#wd9c0KD|SwahPo^1n{KerZfVs9;qPJMZCW?An&*<|~nN z6J!j?rVjuoNTe3ea0a*nkHMX91%DZ{=*)boas+UZzCdeje0=?%)4hrt;l-+Z2w5-2O~O%Aq8>5QcUY2Oybu1bv^a^Y6zp!r9X~Z1*)_mfqRDhim>U@Dj7&w4ots98Q`AbGBKKi`S3Lv_JLyFdl$*J(2zGZHDNU^7~kH$ zo}ptCNeG)CPiC+Xk^mF z?=Ijq-=|*7+ch*JVcXV~;j`rRs6{?AiDfzSZ&{@NkBh$k(b3V#B8j*!E=wm7k%3!D z(!|U2b8VmVhjPNwq%&n_@rR3|5(%Jj*xGONlydI2`Kk-QjZVJn-zT?(*T0{1JI2ew^iyW zyFkx{WVvfy+hs-;7eod4s`U2@;eoHOwO?)8%Q#nb`Eq!>2^5(wz=f+9eu(B;ST}7q zixn5odf)mY>nd$2m|jFz$Xc*1*R0s<iKJ>YpYb)?YIosL z$xv0R!g6|Q^{SzVkReWD-xhDY{j=D0u`Rt+${n^Yu6RKDB-@HPuIi3{+O30wgO`bP zV|tD{Qd;hK(;ou2(i^Om9`Z5H^JwQYPGtndLiLG>OHY74OTQ#63TV@6G7iHY@eqwn zQ9$5*91+lb4*Im6*yxrKD4YG$VbpIAu57l;B7{|@pG2NthjCp!9xA=OkyHczL5~BT znU!Ur``2p8>mcGbGaUE!E$8bzZEC`R3NmtUtz^yois|`6q`kCkRb|a4bH<)Ii`$7D zv;T=@>-DPL)NC!Ga#GEQ+(z1*duDS|)9JLuf9eY{qJ)Qs=Nio0wiiKHceUBUt6C$A z$9x(>BxLr6?l@KN;VAq^8En}(j_kk}?o`aXM%L1n*JQ5RtD>)ZMRMj*G9-*h@|vu+R6vxT(Ww6fb`8<~{aJ=@BflpCpkqz_0#Ew(eOT=R6VZ+S6h zPj^8ziFnJ+&E3G_!-^Y;qt$D7<^Zqhc0QYzi#CVO)E8NZHFeB5H8a2O%bJ?Hw!#=o zmj&34Z=G$m{ewIS{Y;xIaY(Y19w>IMUFpDQH*+N#}0? zbRwyI0mvmQWmNDB*+AC1=t}_NMlq$a2K!YQ`GsL1Kn!Y~7$3-+arwBjavrnTYSk|C z+H&(Qt(_pB5qEfDO|o;GFl-@cq~7qGcFhRzCx!ST zEiseWpW#U8C`Gc<`Pfy1X{twZ{Nb)#(jD0~=WxfuYQ5m_mPcL3+irzJr&1Z%Gta(Q zUv=C(=`r7*+@<9kQ07fz1sE*20_YZ`zGN?^Hc!7R5r&3NCF#5d{j$r2Qm@f{4Gk~W zR?IghH@i7)L@5xhhTJk_$Ls6X+YU*G{B55p0D8{x2bcWMBmyT0)JAknTwIH#}zYYQ<3@9QhBOeUW>{Z4Owjt9drklA7ZEAA-ng3UAi!g%!+aR-X-?|4sG zLVS6ZwY7vp`X&~k;fC|{p$>v=+sgJsRr6KdJd^kmN;BaK#n5y+^Q6FKW{hV-%6WUl z(9rq;J>=A&IS&JTx}nr4Y=?Rr;V-od1g!4*jC~*Fy4GM{4;@tmyN-P>w{ajqPG;& z#+v{sX2eXz_$e06R(Ms>_mv~jjnTL?SWA|NGzr`$(8Vtyf_>#;ZH{oINDTD5vu35; zWb+D&E5qkU!8) zW?EVSZ%W2W3tEpOv7&nXI^zq?_n1Rx;!QrC7?uZfz|z!K=n}SV8KQ-QiwoDN<%B~n zI@|mYOCqYme6G1S7N3U~a~9{9@Com=J<;f7Cfh$B8zzJTM|FPGD!F?bl|>{G3GDG1 zmHCN@rr&$HydHPjTjxmqyv6u@j)$W;$c-5NqIDLn*%AC;pN>EeZCJxsNF*q_8)p_v zPskV=CV4iacL5Wtpw9Oe3y+Q_y+F5mDXAW4lJ&XxS`ix*TrN5V_=2>cjA3wY)RD5( z*T)pAqQF~`?V%`49j#&d6MZ&rZf-EBKXuPmc*Z=}c8i+EylF@ecZ*O}jskuj6;Hlv zzX*8seFiy%Bm@&v|1;}B&e>zixm8O*Y zy}_^$GAv=G_gT2OJVMJ_?CKXXr~d}gnfwX;cmVdYQhGjbU)f17f#Z5QTkw+2<&+z` zrd9XFG+ A^8T88fOGcxX(U0aH2RPnZc#f=cDb5V*&Y4GSey)$JL#&l?|yR9Pb3V zApP|8L?6VIsg0nrXEfYEBTC>C@KTN>KI7|aRYCtyHNlYQo_R-`WYQk9A%)G*qo38u^_P zWv+8Z?399jbz_*f@W64ba!u7=<^GGOBq`1FxNnYg5DYzd=$hq=sDCXKoAm{L_2*+4 zh=|6`hkD7`uSAd%W8z8t%+{zqV`4(8AGsJ*d0^@*;lBjToVMz1J z;YiWK0Twe>z0u+Y^oN0ubflDPBFkBmvesx}fU_I~51YVc&ReeISkncGcRUNc-(#gg z7c`&!KKwy)HJmYU%3nV=k~~2X=P~~CJ@L8EdW7XPw4a=7RmbJ{5;KjsA|m#6f=G6F zedO1~1TpooqqG>_%xYJs)fWcokdrcXI3B@ zy%=BN>VZ~gQ*%+Z_WeAR{Zv4%>J|Fknxxs`PsHfoY)$xqi_C+5yBTTIr}2W_sXGd3|V z-Fgy5IvbN3(;xSSzK+&c|KS;2Re|VoQ;`CO~8QW=+LgZn2|Ia??6AC@(No9>8h_6ab&k!$f>OTX0k+-#>IGGLH{mbor8Xw?n7dhT!dUf?+yvLM$}{Y_$zw(o=&$kE6S|K8jkW)xY2Fw(Vig zcFB*^=1ldl7e?5O+~_B$%b19#5T-S4DwLkIK4OJ4U$*0Y^_HMQ$j^uui=;l4{d{0Z zn!1nQnGs);$2?r7pYAX0;I`Kv67js_*MrpQR02|MRgm5`3Hb5G$nluXW7S(E2J zj#}HEN8A}Q$o3+6MdC5cj@~j8p0chkJz?ws;#5w2rHvdSYFRM(-^d-u@IMa`v$^G;|^>NEd~J*Qt*nJ z=Uq4ba1#&&r6)DrZ|C%`+1wrm!hE=SeqXPTqEWCz)fPuOj$`!}_v6+`A;u}@Opq+g zZg$p=tpbR8M;RusRj)`GZ`lsT<@#WNWrtBmsk zT9qZ-=V>*03)-CXzyD~@m*yJn5J50LXIj_HarK1Het97Ph5&?}m0F>6^_*UT>ekTG zo~u~c<_m>!E*)Eq;yl_g`GpS@F{&Cr*I~qI9NC;UT>oWPCr?bC@wb}$RMk)oWm{S* z4ly{ED_HWlxac7CnlOzAKU_{D#HE6`-wG1p{f6Y>IlrTlFA4|C#HdYegeOCln&9+M zXIFq1k`Lz;o)C~>JFk7l@aFovkR149QRmYdjy9tBlIn+*{n;#ca5FKJpo{Y!lJwf` zoW*^l+&fr;W-a2Tcn6QY2+PYc(eBE-?Abz$Pi=X;gRZmXrwR6KwGa_?Fv`o5y~?o> zM;cZPVjiD%B~?wsZ~10VSDAwJnc#o8IJAo8)a-bW{&GjZ773f_c(TaxmqN6(So?5V zZ3rP#4fO$!wMsnRqLJL#k1PersKKas5b^GT0LwH;dNUPUy?57|M(y6F@@9?JQYMJr zb&O}%>utKdQ^m9x@sU?aFs6L0{8(_qx9TG4uNfNyiVhg#9^#9x!9~k9;8n-9x`iik zHOdcVrbTWcKEhxZGf*+rbURzyOBFsuk>fh8Ie&><1utt1QLB+~3@6k323d7IQaw_O zNcP%x-&)j2y}^P%Gc)%fR_6xI46K!_b92NeJA*k$jAXQ>MYfU-;5@R#WVRYoVta|D zJ>fchUP3i?eTlkDldpJ}=>0>9m{m0ujwN>hXyML{<>gd!OFgMFL>56{gXsi{q&gmE z(uYn~Aptzrpad(k&#;4g8nir)7CT41{`JQ(M^Bpy6U61=AO3ET37g#z8fulf^Ea^i z_6)Bq4Lvt#7R5ibF>kF`Dff3&WWy7=oWBcE1nyUwu+ymVPC`Jjt7i|xOC|GIu7vrK zt1T(j7H38=na`kYC}y2N7m=#88cV~QMoXhO8~cNh_&MRj?k8anv^`;i7iA-ds@3ws z%DGm3k9l@prwN|UG9B`@fAUlzc-C}WwI5WFcuEd6SyE5dm3VWb*W~pyQK%|q$Ra+~ zg+iNARLIqOdFb#(rHVyi9Bq64s}7k}kE(m7p64#*!VIjWnx!RTNoR%l@E2J`C)Gue zptimh5OsldFa$?w#-G>He?_NJw_q{_Bb<5$7a_2+Mj3ciGWtHRDC(1 zVlS(er=D}~`!=AMU=y#hUYZ$~?MTVo$YX7M8C=)O^aG^P!L8nNNt*un%}wq$F^H{v zMJ|NJk9iONoL;aJxt%$rLqZ!0=U7p}=b6c#>GA&^D#^U+R zHZc}8GB?ld@z@QmkS8GDqD{GD%(vt#-6FCPQ0=>7c!h5hNze$Ne@lb*OKFT;m0Ob? zjA@t#-4U^}_7|o0S$%^Oq&&eQXjsU?NEwGQV7j(fn}>dVG1ndz>P4GYDt$vC!KPp#JO|RkPMyC=s<51Y+&p5V|K}9B$TUGju&@lyn@0%#_ zjt+_UMi4g7iRVjd)t91O7ZK(`ZptIvH%6NHf~}@a83zQztgEy9kL~!%v|exkkJ({= zx#HWrKPGhO-JjgjT+p1pU11oWCki}vna?OB*GWgW9Hm2@?%1e!vw2SZ|Lj>V3}Bw zuz~fpzq>HR;8~2Mq?QaI--9+8Isi35a?#{{yv_a25G!d^#b_QL9DX_yD+mLEm1YefHlX*X{iRVfG>|YaGqcdgnBi z4S}aC{*Rl1B3VD3-)|FhPg{euP{`c~K6G;yy)3h?c!B?JAegA-B_jdF=`&up!)s@m z$IGnL7V{)v>-dTP(7{w^m;+z^lFh5(0w-_T;17QjF^QPIgwrZ*6J6)8T_O5lyhtG% zYZ9SNvm9R_8%*5B$Q61VJ@U-QJwhYE=euHbDsO=f;~0epA%zT!Or$Xo_LhNb-MiUs zG*_$e7r=ilU@?|#l02XXQOp~%rsg)jg+4oY^Q{e9oI3UDc*Z;YSeQgj!r~u$-+5_X z+kJ&|&5QNt=`Cx@4f=JVkxWfVn79qMyJHMGhJefNEL_(k+T52AOdpyLBQ}e+R-7F6 z6C>VnW0c_n)-Ms6S(aDeA)me))NZVO?ungq+AZ*Wn|Qo6Os4Y#Bpk|^h;D%S7%aa z%;gV4?o;Nflp5N~?fyk|x_$Z5W|yQnkaHR)Vx4eQ14%Fj7UB_+7l1_m6n>o`6%d;z z2W!qhJbMlHi$4nLRhbUe}1kz_1~KJ7wI; z*sXMP96u0j^ZZ+-0h&|QgMcLKRiC9HA6?p(jyAxi_EmP-ANX2L#8(Adk8_NpQIdwe zS8T>Qs z#~i`6rMmeFyFq^yIVG-2MyqlfB@m!SMtYd{m-t06J!j!*A?0x3|mT*jUej?k^9l}U?i9z ze5QW0fXHSCO&W1#n4kw?K%x^MElnACGNIMVbI|K<4;YE%pUiH*7V+h{kmyn1LZ{<^ zBqDRFJ7D*p&?=!1dXUMI(}gm19XXbZ#$P^J)8}&5+0@;S_6H2>%=K<-+U(3?_J;v?D9{>I*GHB6UqCmIl zxcH0xNo5^SO3QaXqOiSOtpkK0|G?!vU0wfc9Y>X3pkfBu-A4>-GSNvyB;gA@e7ntE zh~cfIqY25j)NU>SlRLXu?{T6_yzGl2Bn_Ob`=ib2eYNU{^-Mp2=C$p2^j$EwhZ^FlfnrFn_!VO^+Se#k;8-cH{No2`1t$4YX6n`=`B?2pwT{#F&>&A^L9(v z^A}^LRP++$PjoG&Au@f#gMIKHo7|JXTs{BT+i~h|#8{QdUwb^^hAe7stqxt4q{unN zkxGPRX$jRm;!5uw@$P>i9=|uAHHE%Q;+@AfKS7&5+@Y>x`dC(&P?PY)Y_CxoSW)4gi|f_`95cVT#dZ z5ii^ES+)y*j;u6u0cX;HU2*&q7^w7<)P^-62g!SjtKAjFsM1#ka z6*f6A^2q2%h}Eb9Fdx&)LKxU&-ym{Ure2qe%Ne6xJYOT^`}jA@bIKo-rfVXT4Jo-t z-V9}Ol&%Rg^@i9+bhrGsUM)6U+l=qQFu|dj8aA7KT03>>sTYrAT)(CFaFsP1d}#~) zMf^W?P;w>}ZicCleUXq4T2RlwNX*(HZuAyAu-Bi7S*5lEHQWw8*go3}A^(gY2_zTR zcUH3Q?IeAmMl+@hBi;HyWtEHEkQh#Z7J5JwL_RC&ar9Cg+_Lg;xe|+QfFd%XMjDA{ zvz{R*zkSG>q39A6Iumg(EkkVbgXtc}o4a|WhqJtFdtLL5qCAJC3nJgtf<6%c?A$9) zlu)UG&gC!T5ki;k`UUH2!u?D4y;5-s#rn@PDS5qiq96oP0Y1g*2JXPEg)Qx{{3@MQ z#jCvkAr0lqzEn@-Ayi27g=2n_VY&4Vh%}hYy~_wh=FO_0H*KElw?lK63N5fd*~ji$>a^hGE9odLPDx&dC9YclW@ z%^G@fJ;`a_l2J=|BLY2NnXt|ja!Xe3F^Fn{sKhfY;;hU`s)??gPt^FWvi`aD-WT;6 z&Gd>C2zJVI2=q?tDXs1`Jj& zkHzy&eEX*wG%M9Qjih2>%FRlhh}fLDfk8URIb?*+&I8qYe%{m>n20u(V6o?cTQo2^b{y=Sd+WC-H8(P6U+uWf8 z=Cz8eB{EDAXRu-Ef4e0L$VwMmY!}VMNnS$S|4nxBNC&5fY>cE^d2t*Af`PXQeVLr@ zy8lNGkrI;^tr0d1v@~Jl000cx{~t6J|8F(_|4CCB;5VB1p8S8Isrdh2G?o8$07%Ay zyZy(B`Cl}ZsV6i@adqHU8zG4(2(4PrHs>Pp*0++5YZz}aU zZ(tkh9e!Ku0=9c))!|@&Mk&GJgTaNxg^yK7Rm+J}GEXWvdfcu*zkn_?{4Q73&lQQ1 z{(3Ikxy$-qmw&$--V^nPYm;X%fg3QbYW0cs_V$K^goKM}p6kh)uBUZaQVp6E>3eH~ zckQC2kMGE7(vlU&JmJa-XGYpk!Ja+q9)@9e?)uIctezG7VQ(R~O4V_O?Ml z-^kI)Yo6!!l`i_M?Ci<6x3`83`<^aj?qK%+vNlZNp5shwt0k*P;duse$=d!Nct5(p z^q_s`1Wa3!+>|^?8yNk)e}^JBfp=Q3OsIY4luM+2BD^#4K%y_OUGJCExgrJLhglIA zh1BGL56C8VHRH3Jw#()X$*(WR9XD727>lQ?xI*gL(*x|Sr!g+Pp7i|EVC|j<*bEM> zD3WDAg%Az$L~sMqANv0NexAQ7S`G-i=Pu^zK!6=RFtcwaRiP63qK-bpWyYu&V2pvXhxCx5Y7Vyw= zZzH%Hg%-@mf|*Lb=|CB{hsYt1gm;Wxv`INb8V8FKDb|K#H06%ja6WQ9L`Xz;^Mhd) zyVPbe?e21`RAh$!?&{~q46lLs>IiK(GY{_{QI`}QvD5488N0S4jK-d_E3XQ`chygg z-RXGpg2v!AvQ&k9nK6qPtqruO#=k&7>V`b{%01Wf6qt76$ljwn8krdU0xD(KnK@1T0Q$lyZ&XQr=JdAi@=y8A|cI~f7K_y zz}}?+{^1#uD?sDpBnm6~lynrs>wvtHS`tc}#=+JuPyp%*eOPM)T_o z9=9uyV1CeSK{}mShdw3rxWMMBzORNIP>cXU9qeZs<+xg&;-iw1aY>%*m-)p0P2DC!}%4Id43 z!38K4ljxQLN?~*m_9g&hLFCU)sDcmJ$sXv?HJ)GFq?WLJ79}5Z0RaJJCsSF^mk@9m zHV12P-q0|idXBK_AkBO#B}#FO+(EWCrRB)l$iZwz{HcY_-!Aaz{rTD;Oj$Q} zpPM*`4%DJfKcyM!O;s>qd*oh1vrPeJz)Gl6rGSK0@x#X1nN_FL{rA(Dg75srb>w>u zWp9dxKDJ3Nog=*H&9aUZi|4+8^aqEcf0R-Dq|;pqpxwh675Y;u_;d8Th?bkfVm|#N zc&=B}jmG)zFZ>fXg`Jc`Dh;@2qysf-Wb#01)1gG}<6+!#Vc!k&xC2Wlv+DE3T4Vgt zju_ zz4lLz#O&QMtf?|qh$2aWXer>bWm(P>GM@>@EqC-~AM>Ii(MNUgTC>en;6`xS-GpVR z!G(%?WHTcx`1Gc|A^xz^;tx;9m1f%wbrXF3k-GYTj}R`4CI%|d%hrsCod6Cd3B@1t zc%xmx17S$!Nc^Xf_bE=be?U2#iJPLuxe6+09nzc;aJbXRKS4l0o{tB@n+f6~w*ETo z^?OZo9z>5Q`VYvDdmE;5q6x2&^<}2^oA$8qs%FB@Hi zVCrjjezW+j>tXE!d^w7XRiXqJteKFAJ|u4TgKo^g`G?3cd9C})>eyX#HO9M)VGU;# zg45WtZsKOsfg$lTz1|ZDULhTh^1)B^+D)g^--gV~YBC&ccPS+mAEpbDUvrC-`GK7KL^Ky>Dwop9kd9JN1Tv zJu^#4tD9$6GtH?RvdbGfbD`7Xv%XyUk8;`iLf*bg$l zrlezLCw4?6F$`)l3aJ-#Y!vPc8YlhKj=fM^W@w~6 z8P-zSP|hbHUOzDY03W_CVfun5eb|Ray{gr8YMo6XS|OHa_<6D7uQ(e`FoP{^KNvz{ ztRJ&-+6Ql-m?c^Li@EVADmH}@sCxxEY~Q+xQ#LVW{|`)Zx8aQ^aL4vR6jqfo#xt1C z7;<0(}7gfuk}l&-~kXy$j`q{8_$H#HzZ=~6Vt%^mV%RRL#mcA zeJx!pPc4THq_HAt?H7WXs*#Oa!n3JQ%yw1U7B0szh4mYMX%$)=e$$zDkc=Ow6y0GNNl^#9<|Apn%5 zS4yB?7dB5XljD<8{ZsWe(Ux`9mF(i=;_dGvZ&~&N&zDH*?KCY{oJ}TFfqD`iXV_)* zCy)XSjz{AlcQ>VPxG%?Im3^bcoa}(6-)XBlM;=+c}&o;lOOPTV7 zUuw-Ai_|w#cyn;g%zz%UUnc4N#Y=x&G&=r0|9Z~$pyXkFpC2#DQfJk`!=4W9=xCt# zQg@PRHs!zF7F#PcnP@zckZ4G-OSe>LT+u)t9NfEb*nwMva|$uYsOI%&mW?()pjPZX zdK_3ORk4@Myf8L)p}&Qln4r)ciQ{|#VDf2l%CU9$${^x%J7dUn;9m&v%C+IRu$!B) zj5M3+m|s_2WUuU85NhRB@0hMd*a#P_gamxG^L@=-%#{SK8D2LWH+=S9@@(>M9`)TO z9w!#mni=T*t#7-XFWHjGdu!7YaN9Y#dfVhd#OHkg{`8(9xnTV3E%^ff(3Pb(5HV=t z{md6B$7X1d`p!Y+-ycSGmfa0^nH^k*j{HQ1<-;#3L6To3t>C$r?KJ%g-{s4Zl#Trm zZ{uqE^diw1w|(>La?HB8yKI}~g=8(xd%yppKL_^4WNl=-uDoHaD^R>zE31{h;|k7x zbo*wo{vy2+(u+^!#2oX(>1jrQTNPWIGS*|tV`Dq3>lqcUF+>DfluXi$&)dS<_kCmM zi^+mh!9CgeUCTV@@kg>Da!Cr|^ybLZ)mBF$!4n*Gp#kSHb)JFSQ+pN^IpleZs$JV| z>_u!|wZ{3e+K*$7FQ2DtU}POexJsTC7)1Jq;!{E1w%(c#NoECeoPMU>+sL(D_xrTA zdL>Zgh_J?+$ZJ=Cqa(A+HSTYcHSmRGLf|gV&j)B=P;aski{x*O@Gy9XrQg2yC^x?i z9*0Cu77y$VJ|ep|<(k@?aLirXP}!VVzM%2;mRr?pyD?D)lSMz~a~wj~_(0(Cfa286 zkV5)nfpLak#+Sk8@%J zXn|5z%2Z}2L&x=gfqpPjl9WB(Iad?PaIPGKDQY)ymGDyW%IVSpkLyJ%BWCxF3sy(q zR)?}!AvFF5;SJWlbDJM~4Z;cfLU?!qnnHDim ztPNx03MNnZdTyP+hYPU(eyx3yJX{%!P=AtKCN^K`!c3EVA-Ma5N&{pm1AY}^`FA-} z+@&2>L4W&b4HN)z`N>Y`P0lFko_X2#1vZtY>o|4^o9lc6Al4;UK=AxZJfWGX4U^JN zjIR&Q&dPaDPU15pXDZsaI_jIr6`#R6V^)HQ7$X?yg|q(e0v8C|d9j0;({Z{PVY=YC!MYPXjgo|<@iGEhBSWogapSHWBmAo~V<5>%nCOA*?t}{9NH>cQk z;H;-ZR~riFVg>m9U+|Y2L}MiKeEt5sv|@m2vX+v50l5Wx*BeHYqiNeoW6HZFxpy4V zht`wl>1_nTzeGEyW{*CnHK&u4!ZeCK`cZoK#almC+{>J_DO~eVzS9~IK3sjzET^vm z#*E!U#gqu+=R})`=LalR&FLl1dRui0O(yuvF!_>tKa{>2voXtSB@3ZAqtHM0do|P2l(!QfTCcK%axBB&IA@4_C+Q9ljpVGSh9+m~O*F1q%)fVi$?m2)@J5 zs$dZSJa2nr_rjWwlZVgiGKaZ+w}BjT=+C~>g@%RLEBmXNSoXMSqj0P?+K!7{nns$I zR$Vmlk69)2mCMJ6JF$J{9~yhT$7f5G8aqeGN0WIAEo8Jve&M_n2Ha<^1osS@5%@`{ zNn1%NW7IBJ+sZr4X)d3W-JUxj=kJFhQ*dtZ8lfHeaa~)UDXy^vqh79ZSK2VC!<`Wx zNL$HU4`b;gjO22x6x1vY*d6T49Nh#Z=WrE<$VpoeP&iP{U4LJfW2%Tey(;)zQVTz8 zJ(nuG$0`o7Y+E5SjSV0&HTvEkFMfF6`CNM$$d0Rla+`_c7?!zu?C@~qL+AYF{xUhQ zga@(8&f*oApj|J?J=sQQr}%RDe0$uPzu3r?r%+T(g) zddwa2Q13Fni{#nK>3aVPTI=&oKm9es)?M1U?>Jq@e?SwY7>^%F3jh2@Zq$4ax~$rT z3T*%)th|6Pv2s6=`whfDCzgt%!S?13?sRmIFh3N)2hk$!^b>R)^hB0dDu2Dg(YNmU zp*Ckb&*gMblsjcV`e-OLnkN=mCDuLa&=Z{6HNddKcCAS|6?3;RyZtI=Ru;3&W@$B# zubx^ac&)x@@wHT#$<3NIgJjTkQ~#HB>b2j}xbx+aOzMhe8HTHb{Xp>XaUuYOgI5B^ zSqiS4`Ck=&5$D{sWGDT2nwPF;!sJxAqi7$My4#S26|O$&2YOJezo6jrSXNzMb3bo7 z5e9RHFh~Q7p{7}_EItmmraETuzwfW*208TdC;2DDE_ScW1(7vH`)z9z<`5z;)-uLs z>DDwCw_q7}6V3W;^#JaQ;I4av#i*ev#(!ytmdtc$Nv1pM7Tbkd5~E49_ZW^-GMsvI zOsyWy40R^(zqKb6`GYlhGV%ZBj%%7$MRCb6uwsncwO?{3;-A6Eh(^cMbYuO@?88kZ z`x}i=m0L-z;Zx46k6k2wt1*{0Y+?J*sbHGdZe?qF2@QJyI~=?6i!=Q_NZ=)iP`sBg zY~<&ic!C?QUlQUg{mHLUG3=qc*@@;dM>?z00F;1~jrVdQa-SECgePJ)6my2khQIHe zU5E0q_U~g!KcoPAB-uD!2IP~g>9(DeqJldkT(1+;)6>3=V$H_k!|f9q$srL$)>BVG zed|$(o5LY8XHo(A6M9YDWoWzg?Q) zG1OACnQ3XMstQ!u4w(G+33cq+EPDYZXZ6YjN=xL+HP^$(F*8hMtpjcHN*s9Z&36|Y zNNR{}Bsj3vpS;+p1K6^iK;-qF;i8iJ@oZCpK%40y6i%w>BVyRC7y4(RsuNc2D#&DFpE{a+CK*}G_Y zqALqD?LDQ%jpdsDv;jjZxX1+~?UUAkJ&E5dY3gs0rM&w6qCS7iS^G1_RZqR`!YtGu zQZr}Q0wQygqUI&+SU|VCxy==eX0?Hz5~L|u%rN9JtI3)LI>)PxHyZ}sZ=iS zV&d0Kuk(D7X)~pSH3!xh*>H$yR3UG4Cb=iyL#MDuvie;ySZknPH}u~IGMcfXVXbey zXd#)L#G^+>)W#APJPVAc<78Y4NDG-hKpnU6nI%+{dzZ$Jb~U73GNmmOQY z2^Di$&c6GBmwvILTf868=KcNBXzOdt%RMBIMEHjmY2qBS)|rLZh=qDGvA>C?P6K}) z9iVV@;B8#v1sOo`9QAyOeNq`%Ji%rX0WyxN|~~kf2qWeSI9i8swj}FiJug9kZO+ z+u7xg1*>Gj>bi0^SD0_PAH*OvNZh>BEt}^$a>;&hcLB9ez})Q?L-2~`slHb8QM0@F z37-cZQ1ih0{P08vh;aKGPL-N&q|9dJ-$-j{!+%!6{F+}J+MA^0ah6!JSsqgJG3(2k zw#;>!g~?SH4tV$PagRP}EvqD9BJT^SHC#L7687LoQr3suLh^bu=Rc$W(N*6WRwu9W zFC^K>b47%4u|VW^F}Hq|LPA}7KLr%k55CwSt{926js`szyNb;RqLFMx*V!zE+Mf4ML7c%$Jz35>XN9WIIX1fU?V`eJ}jmz7W8toQn zO>kEme1jt{e0t%TQVDi3?#$0VB?c1?Qo47=uFBlY6kJ;+TM%_AWVyBj?LMo!sk|2Q z5Tg-!$H8w;FZR~lJ{*q1fX^&+nQbs8nhyp`i+Yitqld^|2l1@xVSF7z_UQNh9RVpcT+JzIOUbd+f*3_+?1y z!Q8!BhuZ(}1{-Ej-|eg{@HZOC6=~`&O6Ozo&BQIfumU9%L#F1a(iJk>D&U*I;+#I6 z&_`1fz03=&i-uCZZT+H?E;;7w!QL2T1N`{d@ZmYTKdv% zXJ^mu5)0+B6ckP&G-zQ|(%sv#y9T`6yP)-tEz!NHSo^%oycNU#4Pr*fKdkDU8a?fF z5$Q0FAJ)xqo*`y<%%v)ora^g(54`q%lV?skzp)P>E5;rTFYJU`z~xt$>g-gfZY&j* zH?{`n%4hcgJ<5)*n2B$)@XDO^{v&NaNqW|M1P}Xq{NRgYYx-cx2dQ8%zSj%EKBfBs z*JP8~_D2$xgnoDRmnwrVqckC2>?Qa{aNal!MKnMx1EtF0j94>RW!<^EZp@`WJ6>J^ zNos*9Up2+zlEiQWMJ_eM15O$lPZh>td!(wN>62vs^0fxG3GF)nc_*KYf{s0$TLC_Z z#CYkIeEi$?nPC^XB8$BrIkdT|dsJ_TOpbm~NN|a%z}Bf4=G-Rks=Ow>EvDR=7VaIE zJ^Z9wD#`2T@+LN%H>ptyJVTT3U&-KC(>*SB9xzRtPufXMyPxemJSDC-`gJ0y9QWZ^ z8)nC237_%O&$dNmoOZ($+SbF4aDqGg)^kRfP1EK+l8+HW3%O>NkPg%r7yc_CGD2_k0b90jmdfy!r8W3dhwndRsoV^0j(7D z)s39hm5={3tw?V&A^dfC+PyMA(cbv2d@CBmcby#BkOFZ%^M=d-IdeDyrF4g#Ed4M` z!t>zuB#%%~+z(>YZoUch&T!!GivByfx{JO{txLDzzA|O@I`Pk^gn#f5Y}=Oa=+u&H z*j>OMsWK)Pk4Un8tMZWIBu=1FkU_L;)FlxDC1R%Y@hjHtmSYV4T>1y#K}PFB6rw)a zfqFyp&LA}YdXs7d!o61qVdT)!vm;!%nnTOim9!IFz=6rP9)!kkR8XQ&3V6hiMyHD{ zkswKQKDMFTE0_jK2gm)(1jjal(RYXmzg>i?cduK5;Tp{@49X9T!556T+hJdV!8fM8 z`Goi4dIDgK-m|_G#wo#is}VBK=WWHBf&NI&eAy2nJbfd3T76y9ZlBFEEz1 zyjLhg1AsV9J_^zEKmC&_+xbeV7j?U!uFACT*#xsM-|RkGuV90Y_0bB$Y*>@~;9_B- zpR^vg%CIR-f2#DNY)QB&tr#Lw9)93U z@f@c@jmNfQxqH|l+{qC5@m4dqpVm^K|6pOmE(d)g?#$n%A4t>;Up{yh1+PbO-0{PL zb{}P^CcM5R7O~Q?Ma{ah}~v@h^(;ee^S+^5rIRbMeeGvZTh z_zTFt2_me-TfCFYmoI+~=AXZn^8cy!{Rc+;~1-wbl17!%^0tBH1fT{+$vZb6&~Q%*03 zQ~5}PhNx1%0Lqm@`fQ(0KZl8ga=Q7#CLGAE$xzqL*7v9F{iLTamHa5Czc)W93OrTc zF9Vs()!jgkIE?}>jVhcpZD;52aH)4BA)Kt|3nOv`TYieNq`#c7I8(U@BUnG&G#e{c z?)`ve8N%O04+!&5o9z8-X@@tIQ}1^uHv@!&(pUihH_;tP@-rHf46ErFdt4A@C$%MUWnVL-6L6(xQy* zOUP0f`eV4racNRA+FauWo7O#6i?|>`NEo>7?EI-G9<<)n3MUbY~Vz&P46Ef*p=YdnI4MF*uR+xpoc(R zS^=(vuVke&hc-vPw4*$u^!{goad-;^IgUiDX(=P6b^4vxEg#(c8Nf=YR1zbs(WQ#`@gQp4ffa-3s$TYAbb`B5GkHQ)CB(@@ZK zUoVt2SKJp!_d9)l%B_cO(lql2RZB@2A2;O}KGJL7*6ovA3a9jPybP1lO-r!l{HekT zHhi0%9upKSPp~8Yn3y~BlFJ1jAf@!6$F|csdUz*OD}JxAz_>lU7De!dTO9*N-YbY) zPdHNjLoa$kpF(L*-OMDwsr+(&IhK`U` z&tuj{?b*0VgumRK!PHLMgPUY;;~5xXeZg#sieINc)sym)pWstmKe_4h65a$Cf`=w) zNGpKIvyCa;1jD#8-eeg}Z^M(~D1U9kh7F_e;kI119uS#*oqur6DyG0sxY!G>&nxt< z-x!m>1Dbz;64BEM=G5t-L=6PZTi!4|`Lv2lkjLZZ@sW%cOoHS1JHg}gwNE}FgVOHb zw{ICrFtaRJ=pJX-+Mb(rFHrh=)d{^H>$VjOaEMnLdZ^Q{Ia_D7_3(j-wy^Pd3YcJB z>rdj1u_T_>X7r_WOi2~BVW6T_l$ z-LH!|_K&kVn8$A5!o*Yn!{X8V zpSJf`yL#$fJ-xowFCbnhz~xqu917qsW|)v3Io@6Ckt??rU7KY zb&X+02LX_g66te-@XZ6hoSxv0`<6$uS#x=InN@1Mf~+f(VO zR>tO@bLB3EtU=cOyJ(;^TY-oqG2;f)18f4F#xih#iLGB0=gXtxU5stqpk-L%22}`> z5$Jg3Q-%151#cjun6X9Ps-l2PW%achoi6foVI|m3n20BV>gQIt6RxeiZJf@T=P>Zq zuYR=$9zDg7=vUPJR)a-UfUJxAf4&g0&I)YD*RRKsBd%0H|m$99~*UYB0fQfS8 z6Wsrz;-4u-PVL$o)}b|`tyQ|}qZ6xEt$YqaHZ*l070%X0g|tVy8Xjih(}(fRsc`cmU3D-EaN~_*fhh1lmFxw@Y4ui_)gl=22X)21;nWW zY~H-Nk2?>~p#XcqyV7*rIs9HjtqXv&iOkItJwY2p3H&JYRQvxDm;_z!{hHy(BR?q& zz767&DC1*YjfqiAe3xq*Kwh%T8FSoY&cFw%`uuSRcKcdC`~cQM_=FQZammv>`0G>W zel2+n>h;O4rf;@4d8-?~=GgP1c)B7{_2svNCXatfqy;hy0?BGQJl1)Yn0mN`Te#PKRUvlfYd~Ie#)|7XBK| z{OM%436T_Fh_oc=G9y#kbbf+0-?6{yxX%vL^ zW}V?v7@vHHk;(DO#K@2s{ku=gp}c9NW3;hTqI@28lLVEwhRv( z6F)vAHFoSs@3B44&+3~!e|+Y`<=iQlNXr0f3WDucgo0){C#L9s5N^YwN!*mxK1;c2 zZ9e0_LP|6QBH~lI0tP0;(r|oiw7WV!3cU;qeAX2w?s#ApZ|5oGRvH!8K@dtno#cf} z^@UGy=D9tS3@zCUkKB0yes#&&mu{?fb&s2tgp!v%sb}+jER+0l0n$l6o}cm}kx23l zI``pBz#0B_Z-1GV)3Q|r2kE<5kldzPJl<^IM5uR1B{me8_+e!dxL1oX^1Vo9foW-ekIB(%X+ zt_6HlfT{eHU(PG18Mci!!*dR=w;8FkQ51Fd^z_xK({m7ykUeJhJ%Xfg-qJ|nM1v@g zJ8;wR=ET@=&$D0q%zMU;9*8%g4{d+;k#pbh?!T}u`JOlXc)33bx!Pm#VJhPYf+U|5eV0CTPs#U*8!WjU2jy%qcc?**RUqMRCK$W2^^eMyO zDAHj>W!wEJ7mWVH0f|DkBK&q-jD`quEA<6+6_)vFK6AZ``) zeD<@Sy#z+B1MRr!D5R!dDV*{Ff7UZFYjnpWcU^jH=X2MyO3_+08)HMuCdSA1FFy0) zXU0bcod>D#C*aHL3Hnlgs#|}muy84_BR}wv7QT(gvQKhhbT$*hA0^!bG>T`t6!LtD z=Yh8PwJdF6Eb9PJs6zS_0xqRRIyhSS_Wtf3mgw7O4(@$nHo^z7;~zzVXg2(PpXdpE zx39PH#V>ww@jdt4q8~;FJ8aNstsYLR%#}vSaggBS#P3OUH1sS@h89aTV=L?L5KH1*igu z2DE`Ue8b6^PlwA;cE5KtNZcWQb`G;h^H&G}CQZsH08+0PdlGzNbc%-$!WIm|7uNW` zO^+>v5u~?@G#US9%wIavH+uo+FXLVP{R6&zG(Q)<7xrQp;4`lMgsb}Cat#|A{KzAZ zEI?V7p~YH{L`SD@k+N&cr}2$XeBu)qDSSwDMjYcfmS-M3@Z*pREo>*yhqfQ!*UZjg z<7kXA)VArw+38wo2;b%Iyfe;xhKT?luZ#<^bX~qQK035=*T(xU>YFuh)Pto?1S#HP zWh<7#$xkq4KjkT4okA@?rjh5^?rmXLc-{*bvRn?gP-6Ow=*aN;EYY@QpbZS+=6+jT z*myWuWU`YD?cY7)=&miZVFKXdRWqyE!nGG1Wst1)_ViS^uiww5MDHJl%Y~Zp%DG#) zH4ZN%G+ufDx4|Zt8x}wQ_~Wx_1mLX~JxDJL#Bk>mGhj}`CitfD8T?4YD%uE2KGW5@ z1K8wyhC8i*S@KqW^YDVBDCxD(I#2VNXcT5DM;n`yjQ{gjp0jIU-jat}bJn6KXNO{9DSv3ed(yXI*qR zgN_GGfeS0pWI1^D&W+zZuV?0*(R@jq+8!oa{O}~O8!pvX;4kw+z!We0DP3QD;vwIQ zF}_Kx)vF7S6EANcw-g{M5ztHu1>xi+KQY;O2pj)+8t@GM*~sDjeTQFoZcg<6#4s=~ zTzmd8@*$wB!ezx?#@;aTrAB72dChD5LCAQ^6+-&?<0IN>`)Fr_I-Vk2ak9rD(a=Q~UG#+I<%8*lu>fcD8re)% zN6w8*n%1fG>=E=VTyy@mzBvmXg_FYi2V~8RQ_&k-8j7EW6?o*iuIvX)0dYJaOv;m< zL{qLjfs}Cg!kKRweKvz!<)kI7FntQN?4%?;QwbkjL2W1kumJ-Zn*YlF%^T-Uj_|=m z&g(@=V=Mi07md$5@~qZ3%EaqsF?@M~CraSm@ZSHYcD zwIPu79l|Ka z#->f17NK-b;5zFNW=e+=e8U|MoPX?D+1TKbOLjkT|5+R<`ymK<7agwT6C_b-wOrww zWIC=8x}XUz@kc*B!s?1E|V`P)QHM@r|dn6MH{!%x-Di;huxro}TOO zA2qg$vxl;9&3QxJy#uTOS|54lhE6w`;S$jZdeYtxfpM1aqziN0Bt7mYCO8YZbdyek z!QGN?c1kmx#=a`Az5D$?9jIDLz{ZGg4cV(r^YyqYN-+o>?u52ECWv#LL;~BEK2-!} zG{%Pq`xc*l>9cGbKf$^{nkZOd_SeYvZ+_wiIEEBkr4!C_4^C-i{L(F*$(6#1sPI$o z2Zt_{USB1LcTUWFbRu&XtZh=DfI|p5KoY#bo#BYH`&D!4cVNr6=S&P8>B9U6A*_cg zy|d;|&R=y7y+1a8LV5C2JJ20>ntaA}>nQ4hU~jgj#udQ1^$<>1_NNM~{hk0yYq{t6 zlQ8awn;bnxIL$nCq;6u}Q9pIMTn^a$PoisTAH|0!b=v;*9KgbSW*RGS?BEr9o_b() z?~K{52nwVLKYj>WzoV{*LT9Aw<8qL~bH*P+7a!q5X;gMr0t(+*z6GqCPugeMaH<^b ziEruT@v^`LPET7pgMWs`cOTsHwrj6V`^x1ZMFkSQ41wR$~%=^bp=1jGvA#;SJngGR=Ev zXBAV&S^A9+9_d@Q{)#8M2WD?-vjWXV_r6V!-q79GpN5nq#U$9kDQ!Nwnr3 zZDk`PFPF;TJ74lkXucciXJdSl8A7n)B#+Q=cN-g+_G5XHAAE z>9-KeyMm%iFemu(({q9D{+VNQPh0ynfpf<;U?m$pa^T86&pdKkci#-Yx|W8BfM~;I zJH@4MZrt*y?8gReXe623@st%I!Ze^d zxPMnawTOg=k&cZYCVnHFh|&4uq6R1{eu$~YR&#^(XpFs43H73Mm4_dG*iW{{+8<$L z%-jdC0Ey`~BEF5cdiClN@Mujeo?Kg`NCd{^54VC2kOqpF-^t>w`srC-+pmzBcheWKlTch_K+}qFi&A`}$1KVBcR?K%F8O(}oCdJNi4E6V0|qt>0wKudlfD+9Rxk z?fsto2^(9>2&8IHV*NddB6#X%&kLcD?t6*@?AkRE%nXMB8zF7Np%{}JHf%TmeI%V! z?uikFFTdXKhBrJ#UCtj=9vSGYcmayGiYssv?E3jpY4hBn(n3{Ph3w#qn@=!2`Ho={ zf_S5RUO`Gf!S^oY=&?h6D=xe4?!E=fZ$sGQm9FlC%#HqH$vKy89v|j2^T!W|65hgx zhAHdG+kZlRrduS>H=Hbh8)7QJ5+;M<4+S85v$5w*Ne)4zk3gMF0aBg{gthC=R$cM> zLlYOgX0TH2s`3f(xNrd>!nKs8Wlfx9`a3-thdbjR{pd&gAS!n2OlMq<**1PG6)mpt zrH%L9_pn!*_)?8Ghgp`!!3ev7#hD2C zHHM)fXuQ>JVCtmGLID!)ys9=Y933Az>NWXd zJ_MGcOh+4xPL~%QggT1+JQzvPEdNrT+utj4+)knlKCf_mlg5Z)KRxO+Jqh?l`OX8_ z@vHJZ8XMSdgu3`98p0!}|a=gge5onr(HSkahuKOck2;{`imo z_~+OvKIqbk@-J55%5(*XZI{cviP53%f%!|0!lQBL26WRT82xfs9G&qtyx=Tglr%2l zv?;8q`POTqY4m=>yj9g$o5R*}neV7vd+oKCl6fBmx&_8G@4xJ_%bvj0rcc6zFo7xi z<*c9p{GiGD#nsV{ zY3VJu)iSBP>4ZD+6m^@Y(&}3uR#uC9>{oyFS8pf%D&0^Aa528GLar}*j(o4O!RyU0Xqz#&) zk(7Tij5`5_YE-ZZ9+k~ig1sf`WUb7vJ6ByUxq0OH84Q%xj`~i(domc?$r6jf89X7l zs>=@do3|9d$-L(OS+UP4<_&QkoEk$wcs7rcklm9u4osz-0Zi=MDGGoI5-)Z}Cuf|BNvd!uCel+>iQFds1E}4LJ|e>_5uO z1mGpcV6?@6ZE%kD*0;WOl)V-|qP3XEiUoY~pZ@8e_}x1k3I2Z0YiYPWt{VjyVCgez zVVy7?t}I-?zn1OW^!SVeTfaTf)zjBpe%_U%{qq*F+)bB4jw?!zCo#>a#7E-|r~JIy zqJfTMDy52%9F6eHpwTl@dXB3AA&_vJ7WjlI)!CUYz7xu%vZcIJ!316fjljpByXTA7 z9NDpD10OaxvgE8wKD~7P70-+wJKPQLXhx7#2+lh4v{uG(dQv<(gFH%rw#PDgyCPpa z%8(&VYj-a5D!&*uimdza{k_EEVBmqg!k8Vh1e?j&c#!-g{7&Dpl9}1_IS1(9`psMB zVnbpRXzbYGuCuOx=a82}!JEpq%CtA;luWc$Zev1I6~%NPf!|$=O)I})*I>`UWow-k zf^P-Kq$e>UuP`xfDnHd<_M>H|DEney=xgyF!SD-@-nst3rpNyS;_?;b?1e|~TF2hW zZ_HkL#y;LLU~p`$Fmf48MW=#I!Y*i)H@KuY1x+R*oey0-Z0a0lLbIK@N}V41c8bl7ZusAJRAwel@szRhJl=(Py+e%yTALp?f}N*k32sWbAb3p5r#^z z2KFL^6TzsQv2cK~u%Ebs(oH4&Jg1Uz?8$^CG!#l%if}-*|GACbytGjsOT`rr1Un9; zcxt@(QW(n_2N-oWhh~57bDvwP@NKL=lftFV8O+dY2;VF1&L3*u`qsBr{Nq3V<5|$0 zaJ1no<2D1=3768^eCsp;SN1#0rg-w%6s=c#XUrMd^~5*NVa}Ko|qTf0esSuPy}$qEg-%iKFqfIh2USSk|<-`lkjf4--oJR zd+oJVE?rvaRx|M@VQ3d;=rc7RxFmcFwmUVCCC2=fXODCb%xtjd7_i=tA3n6Vc6j?H zc7=Lcrx6Gr+%bCwr?b=4sN|~<5jKyWUw`JAXZpAdy3k4~n-}3Yiz{08bcTkw-C`b3 zgFAmq`JIC^yaQ-s6F$r1jO$L8p7O&l)mbi^V5Y}YYTJRWPj0aH<3i!tnfLnm!>3(v z)zi!Ydf`>#MZz0?-q=(}%Il1$^g>~*+Op8@5K!S$af|?CSHds1_+8~#<`(}Dj-^=$ zjWS=e*WqFwz#2T=+cQm<6ahRbNUJb$X!GQ}6=#hQR#E}#-~G=$-qo07+duE^)RB69 z@@-IOSmM>*3}L!EXMMpz!`u`)%1s_GZcMUY!E0SDXPXVNjl7yGXR}lw((>FXg`b!? zt)G`qNXmXWY#nWJX<5PJBQH2@DL|MqYHb^u=9NYrFcd-d<|k7=>@ok#8>b0?LCSz`a&mk7e_ znqP9_PSM~xJwM~{XP6f)5wX)85O;Mq2lwynI49R6;$VY zw;m4p^Q=)He}aoxtUc}#KwFhp+jp~C8BTf7PVq*K{rwfp3siuFyX;GQYCzd9!<;HS z9gaMmO%YxZ+xP6F8<+*SCnDEr057NX&)9hS#aBPdk#L_UhSSg(oq)DXSr0w8Om_j3 z6h-oQFfH@{LTpo5aD|3(1)>y9WCnZQ} z!FXth4<1_=w8UeWox5Wk?H*%)AZD_j(y>LHPWjZ7pp&nkE<}O-*i{=|Pz3&Ie5*+9 zD*MxwN$_p?wwdkTG44m6K5}ILt4qB9gNg`cMt zuz7xzNt0iM9SXn}`Y?038{vaTz^eZ|LZ9t1g>x89zFVi`vSZvz^GaA7`Dgf zjgNY5kZCAQ3~a*SJpZnt1aXKXGfm5%$oCJNMC%oaElMxrzKJLyXC7$SuyAs)l>gboqIhJcv=DxZQM;=;?T z!S^ci-6r;Q?GYw~_XtC{!B<0K4v;wvXc8C(JRtDr$J7w`Sg&#@GvD3@BFpKD$~(gt z>*m6B7Y=bGTx9vS5Vv1?hW77*gr59sT87klgN|*#zr15I!`TRt7el zn2~5rJuJmvu5VqI)s_9gXYcm~(cMpe>$O>ZVm6gZoMS&trzV$YeDnFo=^Vnw`9JCe2~H3my2NlMDfvOG2s$HtyqdfC?8MAv;bOy^lqTLT)Zt)*}v&AHFI#oEKEc;T`0juNMWYh`azD|V@>Kdf z&7=@;UN+ifo~ZIPd%qup7kS(=#CrnOFMs*Vao9pd zjq9(!-VaAV3ecC-9FR|9GP)U0=apvF;?N}q7Ga5SUAu7I1w#}LASmOkpesAFduz|= z(L;PS#2;sDTMmjRgep!O%=*609X8)$4F}rrw`|!mn@J6N85T*iS7+_-Qn64H!`vYl z;_~RA%)k}6$x1YT=Y5*QWsk9a&pp1Lj|41)AnSz*oRZdh4lX_K)!!IBdXO7H@#B<| zSfV*2|LW?hjI1*+~;Oz z5Gyb~=B1IAnP*F!vQs|P9S1%aUU=aV@weJeh%hE=;DHAonC}J<6THdo+qVz!`uLK_ zEHMW2w*#2Y&7e-YUurz6@ei(z@p&A{(8TeP8Lf?tHIFGVap=klXo2|(~{eUDc7IK;4@iea-T zEeWSn0KZU{x!L2sKlsyjvi17f_Hwkl%NhP{x7~IID*<=7l4-0mbPV%l%xz90O{a)Y zQqmMZnQt}b>rMvOk;mG5bhw*W!X9BAcmS2}<|D)1Sy%7gYnaM}5CF07=%?U-( z__<*|mN2;L${Y7BIp@+NbYs@!F|HJip{^88e&DjSIl=XPeAdHPZkB~c&x88EyYikmtdy!X(OLQ9O~v8_}=s0^zS}? z!4LiPN7*9Z<)P2XcKteOp*>;II?{$o9w+Pf!_f32dfV{`Li6G7u$HJf3K5Lu5BM>!>Er- zoX5EL{`l2bU;RA8l?t2iC109O6;An`ez|OC-U)Gd;upoa1UlS}GVmcvuI{z2mc1lA z&>QgJJE5HIQ%P(SVQ)QG;LA}qey*gW{x7nWgC}|VKShs!A@zQE=A4e?mJ^`O!9;J7 z`c#-3xIgfDnEgXo1K*(O<~6HB+@Re?*u}m=5l82fa2EJ&NQ>so#9JwIX}nQR=%T6=0zFHae-&#lb`(LXDN3rtcjnAqXT`E-v2&iSmjs4 z8yuHs9IsRCxQkwOJep!og%FbPeg(%(fb1@ZLj_EFaPpk?o9kNNa(|jo3mrsgf zaf#BE{npYiXAoD&w22LWtN|t9f85?_DMt$?gq!0?j595TQ?H0L(gR*UFO&R$C#@Vm zRd}lW_B0s4spmMC?JC@Pn8grR;p0z3OnRW6DqD24m&x0u>=K;>gZ|`8XE{I7Jym|r z3x`OTeM5i#=YPJIZTpW<#?w>pN;vla4zl}KC-wLZhxgBXCXN9BIqo#$CpapN-x3Ci z4e?^Z2l3ttUR7w)2_YLW%UP>$Bd${kk|Kl;k#=&t!u0#Wo(5;+^N#FzZVtPJgM4>? zA17xM^|9FZccNi^X?#pJ1$?4SY6Z z(em5ReBIkV1G}Qpv?Jk&@;MJ;xu%eS!JO`Z?z$sO9Ve-`vbS1&UWdnosZqK?5SHnapwN#o|wyZ@<|>{S3XQkE%-9t zGJ{ikIn8jQ=VakjW;z(zaU6zG-w#ype(Hf6o1=rvSnkeX|9i&Z?&p8#;PX$P7T3K) zz7{)P&h{HmemSokF6VcKqcDFEWZ-fr{K=pE$wN2ae6t_=yqa|S|4TfXyvU5pfIuw4GA>+XXp$P_+3~GZ^1nc44|md)ZQi_j1viHVrcwfFO_~dQ2#LD^ z{(6@;i5&u(d``80+c$4n`|Q_0vyQ`}{?;~WFe?f5WPTD%CrnDW=cK&0F!UrC^9?6I zr6)h7w|q}CArC2ZamSBhO#Z9`j&Om(FNgzI&@T>M!gWeteoY0Rr-Qx{R)qObjmi4q z_rL%BH!uhK{}6iAqo8q`{s(f?AHCm=zUkbw3h=2%BU8zB7XkKmt;{6ps9yu9RQ)6OM9Pghj{cCKJDI4_0#L9z>fVYM`LUh^j@2JRc_<1%^XK$eIi6@>|NxUqSwlK10B&uf|hwhlQ zbkz|ycX@$ytkRsEi28l49Md}Kn=>*I`Sah&bv$k;s5CyLVFFu%ZL5Q%usAs#M2nu- zDbN$*0o>ZNaNlC8$DfizXX)XfMRD6cB!v(7@^n zc+z2Ez2b#ePC$D(2l+7kUrssSmv`LXNBIA;5WU}@0}R=D?0Ygd2LCHbC#m|}gc)od(3pvaz%;%qsm>Bnb!Hp;41u2ailSHtef}wxzf##@Ac2v&+nfo z9dFgLj)OZXS^ zNuM3iFF*V`GWj3Q)wI$a>pKL*t}ggb>Ryxrh`}8~Rs*p-M8g6p+V;=X|ISF7T z2}4=<^nPy>`)c=3K#;Fyy+$Q~=I}UyL!yo>YT=?cs!gD`q_a%i-+&zIX_s-c)W%h+n?nNtr1?>55 zDkyxFfP>Chp0R;2evt|$PqOU_qD_DZ(b4y@xwN_^XbghOW(7f@nz-?uj zNj8l?(dE4~-f3wzH{X5pYlrvmSnfSU%Zwe~yO{BM#=2{7`Z~R`%P(?pNptDeZ+_+N ztkwJ|Q#Lt#bkX()_N_yRALVl`2dO7V8uguM22fY&fKGd<^g0>zho>-84lD5;0Sntk zRRmCZ{L zzGaWwSz|B4A^6NER{|#-havn8D8VKO^F@+z2zQTQExUy)nI|}LX!XVxgJjYPkG!C# zj?Y}MbicnZ;0gi%gr_k%R`Z7=`NgkoY`$>&cK7lMdkPF0EX}+8L}$jl;w*l&VlG39 zuO-#Fm3)2(zsA?Hy_3KXH!zvV_CEXQt7a@%dYB2^_6m0xuq}MWi)-+04+m~dz7*Qk zb9l~aYoE)1H`q%p2sv)zhR|tKS(wrL%K|lDr}FS5*i<&GM1n`Se&29{gSX+2ee7c& z>=Zt{ehAnb`2@cA`#t0L2f#xv)boN!vI2nquE4O)QHS^vDnn_Z3c&7OB`?KN-x8dXqFJ{e1sGRJZ!+MHK7 zq+pk07yyStNo`1B{V98Y-s=-ww6|0~@W>lhQir(De;UK+ACv!TWbZ1=U;J{+zX!hl zAU!{X?~Gp==m>}ZQvaNA8u(%nFxkr>HscDimLN8YP=;fqeFCDdhTv5Q)a6gczV%Gb z4i<6U`!FATI;JHcuiR703}JOQ&Tqj^xZuY!Pq1M$S>g4wRvPA!T_sq;WMd|4_iF9v z;DO!Cxpm^FQT_5$Wrfn^lGBN5PIsFibK#cT5WSgtLa>wxrLc#mH2eY=oyO%{^X#+F zKFBTYYdB;12(afsSiE5aFP-iGEAclY{2{Gw628MNdjU*IHP!MQ3ME*YMzeQv0u$~%r8|GTsPPF}T z@9*bJMP${QVN)!64Sr!t$qRv-mZukSc<2|aC%bxjS%Dx=da;5njnjpo+%I4spU;j> zWDXD1{lyK*MSy)jgbWbV71fSCwxD1<4nF5dP6GwtasPb$Qi+Pw=+Sg!F|1lx*q+7mEfD`~#X8k;hNkme~=DjQUg9lCnKKy{onsR+20xW9kT#s zawJlM9U5E-5T4|16@M@2_h8O%J8?nKg*71VSH7M_VZN;*U=93|g&QGBP>Gp^0>H2` z(<2=k+TikdIWOf$Z%p~1N=gy=#M9n=DqDt6GzE-h!Bg(_VfvF2m`__gOBvz5ZMWC=(!;e5-=s;u1i!xZmw)+}*~dTr z@!*-uZH9_Chq1tS+Pz{5AfbGn+qYF?NI(g!%SO3&^)A8h5Pv_7@2Byp7sVuzU9dqm zL!RN{!?Vng4=HPvL8igf)H^$cDGt-7N-qm_s&EpnWmC8e7irKDLI%dXa++a>FMGd} zyKxkF7=`xx!>c&Ee=|$rAA)wip>NR;d=EpSUpVvj?tg(Ve`JQe9)8r_Yk_Am*)#k~ zxmQ#HB>Ja*>ZdZ+wZ$Gajf&kX^9Zv!ll?Br@MApog2dEN1Q;}i0&M0*m1nRFJDE6+ z!!SP&<6A;yWk|xBPWaOaHkE7hb3q3!(ASnnylnb&nRA-O(Cx%l!85n%=R;NJa)thl znEDO0ZDvXEE{Ef5-PH59JRfAN-wIx>W32BDJA69Zcjxt$bg#GqNIYNj@|A68OJNP1 z$>NH}($MS4`%f_H^|>O*bjMXUcfxTKW(Q;FW+qTunL+PIIVKoFDm>|1t08XKB{$BCf>xtKi+bLA+S7f}mu1@z|QGitG2R`tD^cs5jG&~qW50Ke5{!Mtl z2IH>F6~SaDi|!o8iiLDP9`OP@id#^K?I^=udR~0x8>Xuefs-;6X|20qXcA`O=V@&M zw*ch=CNFDTnCSJ^jj%_PC1O19;U$?>+=x1t@D*66_2BhxzLiHgg0Y#SaU<=ErZLYLw=U9vs60Kjq?0BYQvtMUde#=5@q>f#44V7aJn< zq*x=9?)gQ~4Kp>n2Qj5K>BH(4l zS|RvrCLX%<;P>&&=9$kpz7&52Fbk=h-$$&(&?GH9Do`wGlhA>YMt^hRA9+53;I~Pj zUtl2}@JhpTd)gO6;}^d01+%{=?t7{Lsl~jw7>aOLe&r0N!po`_B8CPS=jY9@1paL> z?=3uQ5nlA_TnGw);0X#5RhR)juY`Gn*2j+riCZ(R(-g-rgRjN$gUWs@WW9A*)9?Gn z4N{_nfQXVJ2+~M18U&=fQ|U%w#OMY^Qb1xfj2ay>x}>`q-5VXFmRhKuL%L+x48Un4BN@DO0OP=S@y}dV>xX&GMntH^Tarj;9`gGwtqhOk0-Bi8k z?QN%suwZKhBMeiTOEFPatv7!cMYU-nzzREJrC+%l+D`v)#>ehDeU#3Z`5POr% z^cIxU_`cAEWYG@JH=V>L)Kfev+_|htM4HpdSHknuAMilh0w@12IG#~$wb6lmQb%4s zwCZ5sZ(2lr-Xef6WXN{poe* ztLXBezf2=cXLdC=S`%x-HENx?*xY|v{r^V|_{fWaNv8S#rv_l6ABBnWKWc#S_af{6j@&fm zr7_A!s1fLcPgeR0)+#C(tmx}cF)$b@mZR+KjkIF;`)IB^Xtu`X!m8VsP}w}rJrjg1uBm9;P7~HD zR8AdVTol#mtrhdRP==#po}*2gJcjr8_R_^gMHh=LCi?n5L%8q%$->=4cc%jC2JXh?;B_Sap zu-`eQbNRoit_Ypq`M60ZVp`)h_Ty>3x<2nH*U1+C>NWJp_TVj+`OJ>^B^m-VZew3L z>~-4Dyt9ao5%`HtE3YqVXz+}}U3dch=f?lmroO&@hLF)!%xl47*AB4xW*2z>b{Mo^ z;Xc9V6%rD%dPwRQ!BhZEqt48b2zdA}&0?j9XMbX|Qm^&sdJ7#^1lC-^k`oV1T;IOt z+Q~|%EONNo`PV&IG!;nP9IU#0ffkX*)^N7nogyed^P;z9kGPuA@z$#IO`bp?gtDx0<`F2{~$SjDVO?{PkXaFL}?|M0Z6363(1HT3|RoHDik98;SKUdEym6tyM zAxRI=JLY?TUf{;5bq$h98&Zv$+@Qa{a0&by!1WqE=iq|e&A8mp)IyCKXfIA;1MYt7 zl@T z;REH2F)2Qm1wgWXkh`PRjJ%Y`fp?7Xlhg%4zpNKUWG1|Gkf=4h$wHOe!-iHAluAe3 z1Lr=WSVTwiRZB`&&TRW&oo6IaZ|eFJ+w*dR-m*bXG}*~;emVPm3-*2F(<;_-!p)^S z(*Iou!5boJaaB7+_BY|HZQ`u~oXeUI9)_y#tuaOZ3>8&IJ4mKC6FV*quM+h*!K{xD z)Bpp(?%%rbLH}v_G z)I6rB*_Y3WL*g_(eCii_yEEf?A#e||1)#fw&u}uV@Gf$aT+3 z2?0Fn5}B|s7Fb+v_9uF>iNB>~E8timILE-o4fKe#_I{9J(3PAbl^T7jNcAg#(rZL8 zbF+stp3~FQQ*FL2;L%Ymgj=41XUA?r$T$(J_e;i#hzB;+5;&Uj^B)CL2-31W!DK*T zF1LSAB<-nqzz*1RIVHY~8$s0D&(%w4pIshI)ps|Q*h0n}^0nUCrbP#QcR)$ajI>RR zmayGG@fTu=FhuQHQk&`XLl@Hd#{}&IT_!>#;O_e~Z+AK}NC?YHzUsP){KmzrdrD)Q z>={0pfa&yXEW~*zZ@0U>VndipY%NLX(*`Dkh_)a!?e+GqP=*Z!pD=X+xSN!4L5L+^ zpg_dgtefJR#7f#<9XM72GRV17dPMg(_vCB)lO#@ztZ`;Ujg*n(X?c%RHi!%y@Xlsw zISdH`ZVtM$YeTZw-_#G%zGlQLo&2zIRXts5(hU-mtWjv_67tF}Gz$rX-d9dIPRld8 zguGa(?0W0kMX!1$i};MiCPDJF>+ODgLdX!J)a$V7@p%@P9l!`w{!64HrN;9tVlqPo(0Y5|5^(!GR|0bsYpz3( zxrMqEmq>S90+{p?@WsSN7;Q)8GWhGdCQ_U5t<67&)#@3zU&L|Ocw@Q%Xzwn>cU*!j zO6OmlMJir`pr;~r>z8}4U-(IWWNRUQ=K5y8Hte1uKJ>Q$6Nebx@1p265srA?RNv(- z3=K)90jan)xkOVFL##;;HrDEs`8P#Ga6XpWz1=CIFRip7fGSyMRN9Le&G~tiZWs>b z9d3v33$<+vA9uT*PfN=!{`WTl{%DPg|1RuGPV! zJyNVQ$GMMV0Mg34`6&vZiU0t!My6+;KZ-E!J8NluJ2=N3Qa@S>4XIQU<&V7991{rn&6n! za_3mHJn#iDl2%B4#@qk4mjPq4{r*OsrUESPcY_5|ThDTVAquIYa{|msjc0fy3LYtS zw$*fiWAqav$H@)NTRempf=6>z7L9=SG~eEVxjj@XpO_LG`4C<)^N%$EJv;I;W-EMx(JQx3pnsoreCn6@fa<9H%o2e&u z4UGN*e#d8*GW~}0!-$ycYJ2eC%@EVBtmroQ2^$JG{V0c9quMJVJ>X&XjhiBaHSgtlgI3^TAM* zi)1R7JeG-gg=z(q%EkJyqvI94Byo*>$zUsxG7U zL{00psjxj(*rPJLkn7-|s_{=_5u(UAJicR3g!D2iSP6}}@TU@}T|YB`Y6}Jl+fLv~ zf#3f9&iwy=Y@yM0YF!#)gR4;UQK0WBx47u0v0N2fTE@o^lZj*UcAn(Dcr{>1bgptT zb~Wu>y~B5F9`1yVF=s`+9=fU33OgPl&ED$;@{Dqtjwkq|Pdx$|SCt$Y+E@2Jd>r2e zbm?*sWIg;>R|Zhn0psLjpS-m}q%5?hSQkH|RQV;ehedbQ&US=0*AcV%z4|qxNJc3L zjd0{+1j|;JUHSYiaG%nUUxK*ZVj;PQCmL+Fv%WxFeSq8@6@7y{EMIfu3h8}XIY+*H zpu(&Dr3w6=QqlE!Gegbzx7?^IPP;T$p8;SsofC`osgQ2B3>VGu{>a$0c?G!&?&{~v zrl&G6Rc@`U&rP2aJ8{zf>=ggH!p+5NAc0ev_{RI=i~KlhMx*Q>uPy@~F9XxFQhTSx>>)gvlxXFiGrx93nx%G>f~B_5OE!pcz-v@dQhhVJNO5RfOEE*uBzu zL8_YlTP^~^qQ1?E>Kzg6*p<`q!KT{vl{^P*ECSz!)}l46!`HgV!PnMe9e74!`~*)U zJ8brXRt@P%L7Cw(wg$2MD91Wa;a-Q|c$CpEhK$?O)eS-3X8p4W+*D~wkDkiNd}1%( zw=a0##97@(ve}ZSg z$xpLpoolQh8~^vORsA*o*{zxV#&LyAS6+8W?BxFByouXAQlcy^>VOh4+JvanK=pR6 zh!HJkROFW>WZzEbD>K_)Wy$n|K5ofgh;L=i^h(h+J`E&-1=(x`AEmKmNoAW?)5}c} zMx9JbYT{hjp+wS3mDDtJzqBXO48-an+k9a`hfCB5g^t#g{b>^xd2~`FoI?_y& zPpqA?7%+SR4CznobktR1WAu^oqveV5F1Ukj+OsctX!5!QI-=LA=Ogj|n6v%4ANs9g zz4?pw-08T{B*jhat7~?I`&7ipTV-H8J}mWXpNLow>9Fg^7yD^loxIU^$gF|Jta6CS z((w&yFU3~=%0tZFw>9TYF2^>Lx0jf$( zRIorHrw7lAPd#nZ1AgqkIOcWwe2SeHRO+5pj&&d3YJGR9=xLQ-woKytF}${&3-D-% z!C!fO|DUsvx%kV2Hcb$*+f~bzZ{9lxzH|5Up-i#c7=~EUQ-86cuANfoc*k^(V;Ayc zrYDA*`CUM`5#zd5dp#s75p&l*JV@=BJhyodK$05z%1MNu04j8C)H;m@Pg_+o*C5> z+!sPQY#8KlQ<_U3HY>-b!(E;SeR zL{sjIXg+1$&ffqfmm`xr#VlGc_sCjhpf~h}c$c~KaF)!>$UV#R^DohDDO$?egO_|3 zKTO)4m7jsJ0w}{oU7CFvGRLh30e;+@)nqYbehD#2NQm9g=GH33`1-1fFR#I7i0T^l zT4GS|ZXyvt;7>?}v*0h1ikigj>CJsyIrqmll~Ll1BAhMO7B<%?7OO-tm>s;g+5Ot7 zn=1fSYIYxLDbV-9o+~XXP))z>!xQq-0Rgj>v&_qkI&`zLGVZooG0DDIIKL#4ET}p2 zY=)@5Kq9-><7kTamJP*6Cn0NO0I z0j^U4`lr1MS^5v~QMlf{0;nk9r&xJ3a*1@HGt+syQ;{%X(Iq(>N)@?MTo zr?pxD+9HkN5&@6u-n!TRV((hDW^rba@7DN{X1vET^)EW`Cakk+JC(uGce&!^f=5>y zv5yX0N1YXKl}>SJkcO9GNIS#S8y4uGOABh|a!>Iw3O1Q=iyKvkP;IM|ng%xJZDtMkbIo{eKjisZpxItN6E$cLB6B$;fP zBwDJ7{nbtv;b~}C)GYVVfwA747v8Q4(Te=ud2Vq4!acWKbQgQcYgTFk0eH5lhGb6U z4L7~fE}>$25?oP~IRXlhYZ&2J!h|N!bQ<+t7~IH|tUy6sF-u8ml~?g~vH#c+c36|R z5OODt;NsUJybcw9{4n$Uj3${MRmQ0 z7dodywrLES15U#C9(Qh-XH06#VKqKGmSVbhiU+u+6_bNjJn1=>LcjybrEftRo{7%B zTWAXDPQWo6+h*qRpX};CxGX{|Cme<>y?#W8ukU1htv5JvS2*3juI7`KLFps-$pUb0R#8UsF?GS z@g;W;{l%I$hmMDf-|UZy**KT{5ovx}m;Ahc$Ryao{0+M$8wN`?xGq`Vw|7m}%fN+J zWGh1&Zh8?f?&W7U`Lj$5SgiM^6V>v?SSE|lKw80RE+oCpP;s;%_CLQrG^`u z8`zC%5s|h{u2HJ?JdaaHt%yI$sO_fBNeK>ufneb}HcE9=USKAe()5lO;%CXWnWNq* zE2Kp!8`h|IM0&RsA%31y@$R#v{672HliSD6b9=`E9r3$0;L*#vmW&rfQQ_NEBMaQMYXp;L4ja1&=ZW)pM0$!|@(SqixN&bf zWw_k;sk2CelUb?HfDgdgx%GN8DTK|8f9xZ7!6BfDj~S)5&{7LTa8%IxqsY>{aHpdP z)jrHnVHs*H*j5{%BMnER+oUL(WAGCp#Ts1CZh?ZEOe)Eq^rfPoeCvYL0Mw3c2TEcv zd;bF5p2jqN$5M_~;CGd`SS7dVz;F9LlmxzeFF?P*;~~SuoPW_Ca2+4K%S@fU7x_MA z)6G*__GvQ$2g`13JN|ojhi9{w4d-t5nhiHibTlQ$@`iM&ZZfxoDMx_Hy$R%Rdm|Gt zqTg?N(gLCiK$&q#xLz}q1bEY1AO&hJM`^Ea#?2%Sm$5EQ;qVn7Rk9Vvi(ZhnJ^1<{ zUC?HkLIQLv-&TM9cX&&&k*9sMru3nFe6yd!I`f^j<+6{6zUfweP}Rj|<4)!+-pz7% zN^pkvTY>LfMXN@w6u-5!ziJvd0e0F<;SY~$weN*k#W_~%6ad?G&zvU7AK>Tlc(hvw zGpjo(4z{lce#DrUy;n?(VAczmddPdf7cs*{54Q#mW5v7`M8{GK1t!fvP0XWLtEy2X@! zhQw0hTJg%`s1D{48r#WLwW@G}hT?_-&zUYPVzbHutHIyfB~E;0)G;}KR{4}{bbco# z)z()_*HJ`PBWLphY}l^3t}m%h|DL2+BKN( zZH5HAC(b;F>0rPCXvN}E&F#8<1a3f9W#|{YzrjaNNHIiwru_0kMHV5(PlZ?-owJec z0W2)yW~rv^t&4QIzR8)cAJhJ@cRYT#hX=F1w|`x@>}c!?$`?}D4LUukB}yGWn@y}& z>w4){O?0Z2maXO$SUFVrmu*(~p9uz>8IB*MB)a-(Yfn*p_Ucf<(AJz8(UnQ`-$Ku! z7b0juyNM-Jxor1Ur|+Fs)+Yzt5^*1C25N%24Zq@D)H?pIyP5UiKS--BtlqZ8)xVOm zx5T&SfW-&vM)1oxBwy@O)UyIY#u(L0qO}!`(i+&Q?P=^AVnTfX&?u+iD=eg86RphG zCK78$pLE!5t$k0#z1VNPXhoc2rhBvd7NO9k`GV;}d8tlUl6eU|(`)RnNG-1Jp>f@N z?X8v;`9YRkWR&3Q)w?4F0jTvCfQXQW_apunrF!mEJ}O12&^S|WFV5MD70_~WT7|HnI^$4k zJ(8N`G49hareT+~l>)ZqkzXJ6I)J~jWobrqqhO@6#etBh&rNYLIj8Efvro?Jl?483 zeM}?}FLXB@SO_|0NNCMrrQH*(B5GtqdOX>tr zDG17aez>)eIgqK45DTB6 zVB!ll-JL|C_dR$kBNQMq0qIOGX?Y4pS>7X`kPjB3lTL}tql^3-AdR|3;$J&$)zf+qBydNw6tKu3rwk|tY;oi6el8@?pkZve5*@k< zSZ!0wQ|JIov8YHql(^8_CC!YO@4Xm;%^$E(TSDDq6U~#g2U*m*j#>MAju=b^0LHBO zb+@e<=5~hmfw}jsWg__OgvkDKCR0l4pIj*SE{rE-Zy0#@@f1Q_!NhWIKW4V(Wopp) zyZK(#cJ7Z%VU2!nxBNvliM6=^H+DN^r?iDGb4WR!QplEF$RyEIpCTz0-e_pKmFMa3 zfuPxR?g?}$MD5dili5GHaKG3+Dv|)`&!LsXC@DAgQf96;l_z73a@8IO3!}EP#{z!7 zGfZ=}qEeU4uUg(RVYpb@ug&@&%og77p<_hrK=1Y*Z7&*rkhHmO>B$ng20Z>ZwGDE% z0Xk5@2Y%4Mj}h9HSq8j(Tqr%5HZpQC`EI`3{v`34kp%Ddqc4ZLzq8X}VST&+3af>_ zD5))1Bnm)5_lzvUA^Kk)xLP1jAcR-@@NKu$4`Nce665jr$1{d|>OwegdWzHxQVwmA zyR$uf$x>Vv-RIx6bc(E*(gsR;ttcy78LElWq#1g1FnuJA7KbNnARCE+zd8xZyBi;Q zrccTO#c&6|_0VZYm@$-<5n6r)0dE4)4SgKnv(yz>nXA|1nwar!x2o-pzUlZNZ-h0n zyI6Fr@}cHpC%{Q+GMH19IgM>t1#1{L8)==`;+q{>rB5Rfba<_JeM3itG__Sf?6WjxgQC`Nl6QLI0a%BWLfuH#QkxR@e!w z9JDD$sl=$hjHWkMg%@eFGK8u^?_4w>_l({r69aq+4^}h<+Q`|17OLqN4SSt*mzM{= zSsctfIhbDwR76?e*y=t-sGJRVJo8K-Hl?3qpDl>X#=v|2$B5xhWq9QmJ+|p;-9t>V zJgwUJ=+7`WeefdRy#My|TUzZhAy=Ti#=1auIa?*vg}PP=QM5}SX`!`M8AN{U7#9i} z;`9g$%7cPR%cruU4lwq=+4tJQBHFY@l|(tgFtBtxe>wYULZA*w=}mj za4RGA9t_*1HB_p=)!kr`tSbg59d@bKOfNZ+MYON7qv{dkk%meEcAwAeHKKwmktG3& zlP{adK5EjiAZ`@AZ^{s&ZmwD7JNxx||9+r4I1tHuLsa1|e?QGe@*$xTa(2^NKU+zs z^O}?&v;D6;Psfi)={Ja)M4#&?9y0lEm(`4bYOVz6Wt0Y9HT(PLWnE!Qz7HKMoPOkR zm?^vVF}p^rju2FB^&HLiv>xqs4uwP(X)T~FNnZ`(U+*(L4}XH>Rx)%d^-Ml8u66NR zdBRcXeV5T#h+Ldl{3Xv%QFf)*Rwzmnv82h;r6qBPL>)K+@RT98@QV0(y_4&1DD_F7W2T29bS7q zn1_{z=KQ!(VU|Qy1CkXo%H4~P)#ehwvso#L?K(u_B)NWmWz?(xlctDVgNNt*&1y>_xWNJrvFemiupT3@4^%5!7jF zXGRy|1h_e!O`EvE49{u48r?(Lkw#N39x~)D3Ik_MW;%B^>p&cv(?7`&u)E40o%@$# z%Kmx&)H1IgSugP-iE;cuB2sC@{ZYUpT(3<3Bw)hL-zI!6R3}QTWdCvEkNIt;s zbKEdu(L}HSkJD!6jF0L*)nWQ@BmIkuwuh`qdz+b&W;Lw&dZI{krBVShjM8s^4fHFh zzu#PFr#lhKFr$A$o*c3@V*P>{`@P8Wj|8Da22W=U?GGl4Bfx{Nk~9>*eZ|njYBRWm zjw-e{E93Xmn%hly`2D0^_ErWMk9C?*o#&J2*0YwmSv9N`hju$AY2DI{@#6UMb$M9s zlDYe+)Y*n4!>Fk~P3qHFn-dEXr(5!8VW^CIr`yKomcYJG@8AOTMQ^PRGSajIB*tP^ zW4HGFy`Ej)cr5+!uRK3O*8-QVSSDoJZvr&GG_OlQ#K$Xha?{QMN5IP^&lR)cuh5XF zl*}_D8U&r54)HFP-^vUYn*;v~lS1eBFAJd)lGz&(n@WrSeEuTVy4;-`)MKws`&c>* z2Q~8^=j>++X9^DiP(-Z?2(*lwSsAZWZ@3*q4aM&YTfjA(pio%&TVzc$`}v0Au6k?5 zYXQ?;Tcq~Lnbs38o9)rhZh1 zU54UgPz=SSq_Fp@52_bC>F;2I93f+g1f~tThA{nm{O+qybAP=o2EE}UO*K}EgUC%H z^+Nue6(4!K`{NtIBT;J`2cw2^tgvY_eT{^hSx)m$WGhZE$tw~S0iQ~SAdQ@|5q2&! zfV;!(sKjY}Y%}4DPg>1S??f5>-;rU24I?4N2n)K~IsO~pS$V#{kciWpcBVb@zSW}% zf?JNIZFu%G2>me_R4p}Sq znUlON)AUbeV>!OGvW5ZB$KMeiqVDSt6A!QIgzr04*N$VsI08j%CO;`>7+o8dHSg~& zNijwTf3OEFb(Nv@JqLOJGwZoMWdzDzct4kj$8T4$mZ4l_ptA6QGkoD`hJ`!W`ZWa}I@OMP5)cP!P>)!S)dhs+S+xQq`K^OiUp;Cs?F7a z4E&n#V`~(XTpXHaTm4ZAr6SCpDlruP#cn7Skv~uKyM6Gw76=zTJMo!)KM5S@g@1~$ z(a-r_U_YOSLYxrWlm6`{6kjv;HT-(CM6m)z2c7}93N4Du z?J2LoAa5%cV41qMTwd3#hhH9T%JK^&|BZr4=MG)$eF=lw=3+nt;GruG+e_dzmGW*l z{;P`5qa33LVomq^6^PWp2-MJhqzSH;a8h~62(9T%>;9hnRLoq335m?>GmVvx9n)|8 z3TmKks~OvFts+f)w@fCq2fSq-2wQ4Z%FNoEx%pmykila$#1)JB62}kspxmy>u)^Tm z@IXu|P3$hoR}!fB7f1(dyo2mg*U}D@)}ZBY8)Sv{ohJA-m)m#-zws81*>>k@3+(fK zM0L99>+=gqinci@xELPNmPb6FsUpr{gY0ul8c~hQWILzk49ko29g=DIU=6RFX(5+rn31Fe?;3=wMdFZL_g*ttiU9 z19}_0_FVUL3S7C4OzY!6iM}olfgEO{x5|1Q05fH?rESf>bnQ7BVuona;4QTQ2qIip z{d=wHk9K0&ng&9(l{=@WTg2tIMkiCt+bsvMk@o4mlKSozWFP!Id@XL~?p+o`CcsKo z4Kh5@1?a{5%HW;n@Vr@f=Rqxu9KH~AnyX}Fx0O}4)NQxy{ElMH;NF#9L!>sT)1L4} zZJoALQZ4ykNF(I>2aR4?rkI<@EDW)CxbJjO*FY;$=uW_XXwd9;UB6}I!;C@(%L%-A zUBpU;#a6zWV_bI+zD?&^c0Ku*>Spcl){{$q=>hZr+NL>AY_#5RoLo0?`m9$2yLcmn zlVoO9J&$`%YM-;KfJK3>Cu8gKAhwoLRCIgQN!7YJW0XC}{jc|Z42nXc_B`j;;4J$} zT>#SGRJH+`o6!eqL{+|kly#+r;Udv2@`RZWbe)(9pR7wLmUlP%30M`4v93njFifC+ecmsJ()CO- z@@n$5qm|t&rTv@uOAmYFJ)P$fg72)`ISG|1i(0Dpl8iW)yb-tu8T-)uFD6Q2WB%ET zyu}f-A<(d3U$D4pceZzd&3CoQ>T)X)&Sm$L_Q6f{n2VA#1~qrq z-f^=shTRwcH46W=SrjXanc^|0BV>@j~ zG2PCcfzE1E&mUC_^>*WIX*qWd`!H3qL;R$`*r_C)SBT&)OHEj%N(}JeVc z9KXLPsk)=w{nZ@FXG71+^W?#OD6^j0a)H~-$3LW;)%T8L#}))5QUm*dnGWI0S%<$r zKW!FJQBgnL4A%2X!F`m|b(~I2A=BXPX9@Bkm5&l++lBu~?Hx$VFV>?Vopq3&A1uct zAVOwk&q<19oyt)9TMO;tioKiVq9!np2rOC?3VOg9K47Z)Imi2up6qDvhbqyl$P~3W z1?S)#2ROF>E`NHk((pJzM|Zm+%R4(%D;`2ad>C@u^C=s^vWF)dUdwyajNBE;C0r{D zE;S&CIk$G2t6Y1WM%z6P+s{aC?{?U|WYy=?{E%AA2vncMl*d`5q?$;Q=UhpBg2Q=@ zvFGkxl#_b187DLPA0q-aw>vW0+xcP1r0JIL*NI~T*{!nXe&Cp?vxMtNpK$EnU1sSo zvd&SsNT{#L4za1XK`%!-T=Ra$z0N;I_mNC`3HMJG30pE?-2!&mrUf41tbZ@SQ9QCx zJiWUg@@2d{?bD21r|J87*i!!KxTkB}@Y*~heF!H77&!letvae5tw-DsRLc0xF#WNq zFLYXBD+!eDlWvCEEcF;p72e5F%*v!5lIxx`?aa;j2v`*MovUv_0~KJKS#GX~9h^LU;0cx}VF$l@+J2Wam2YM4}Gce38&X$xG)Drf2|Aw9(+r7pe8 z{ezNR%B^i}_TR2wsAotT8Bmldlp;764#?2WtarQaJB8FjW7!NyE@~9=Lh`+?eFxYS z^U8^4$~yx7A{`4YpQ5aWY;{$qH?ncd#4gg6F_?&7p~}JCPgJI!^YY)CMKBX|B|KCz z?K1=EylZ{ya4l?X%ABR!ojQl^VsBG!-zXk_%2+sMErA91x7MBzpm( z#=d!X?xa-D&jqh^?3x-WZV1NW*S+z$* z&xS6GElhGc=lw*-%Yt7T$xDBx$n!Y97Z=;DNg8;@Ba211B-gvkNN+h(d{ngjEv>xB zhS`7Kym!$SL%}dnG4X^UkT4Tk`aQg36p64`HCzEM3O2&@D0 zoBh4%JUDwb+*CSMIvZ`k_~Z763BgoKdJNon$@g@7dzfZTy6}2%)v6j(q^fHl58sRl zaUbO4?zfl4|MB>k9J6qiSDXj`SS(D?*n2Cfjg=PlW-sKt<_*E!JobBi1(X!4wznzRzS5F5$ehinnu6KEJMqZwIwRMR^MsbjrOEh0mjErg3`(I!TunevvDO1VDB9oEfai z9CgjCDXU%@eJbr$4}WrrRG3I9BDCx+Cc|JBqn7CYmP9O++{>(r6`Xn96}YvV3ZHbp z8`%(4a{`0pz0`|GOcSaU4^3uoOI(__se0+^FSx~7h>~$CtEBGDN4;VEwjLVV&&2! z<-8FqIT#Nyy!Kw4qLizGGAfu>>KgrH9xfxw!ewOo(_FUeratURxB^UY{y2Z{O?X;W z|K_GTcju-lrj(|^E`iBboH%pAw-B+b^+7L<7>uR4-C&u47QzDnqABm8r+UBw|5n{c z2HwbE9%~_859nPf-_@mJtZ%m*1-qCGw@&F}|Hc>eGDAM*m%n$^w6WpZb4oJ6GUn+p zi_L49^2n=o*NUz+WheCD(~WCy9k67pUYDkEM9-CBQce@}5Epu}It<`2Y{!VoKHEnj8Mxm(t)c~B( zhtoAxa#qQN@p#@a&S>K`Pfn`Kb@DLel1iBV`6oKx!(6(V7c4fDLRu-EcfOi0eRdOr?F}_6Zxh?`pt(3{%`si~at#=&jtZ03dd%baacq%hq-* zC`k+{vxQqen~KJ(L`;7uk(MW3S?k((%aL}H5u=$cZ*U5*UwEfFJ`<4aPP`Da5bQj2 z00Wb5J*!oz?eLW1|F+U5BNFJ1>=W%>;a-ig^oq3oSq>+7783PWU3_fV1)o}Tf6Mc} zd*`FT$uEY`If0y5A+dj^J6~LrVIoaz75eu-#N>xW*L}V`i8R-U!Uii7;}UuhXI6gg z|B;unSi@Mpu8cjm;c7OAALk)aL^1C?ME^N3^bgCUBGTT1RPVwdOSilXsY@7~D~zqviOuwU)s zy;B{HqB0S6_;i;mDn-oG!G!bngV6^Ulj}IW%7C1Z*SIji>sqj(%HJck51e_g`}P(e z>2b^U=K{%xk;DRXFrjItX1ih)Nw*-KVgx^c^D8U2lA4op3-!o;pr_4>Y)p@XVK zd}|?1bIXwCX?|ZMU{y}zZu9jNv!VAI^3RAxrtOh~nT>9)HfPRZKSc-(4ug#97o;eW z!ROASBn_+XjPWE#4jfP}(}xG92Z3$59_M?Qb|Qw9&A`2xlj)rE5#^B_nL%*}vOo&O zld_*&tylLYfwG4QXVRuyEc}SO9dQ$s8Kh%HIWMyJ3mi0I{{mvL@14TYhvm}d263xq zYSBBa0KXz8MEy$cNY268!ht7ir??lN)QA~x%h&#@nS1wSg*XX6SATw>+;=KIxrWh{;O=BXY8I*RI))*sN~*d_blos@tV49- z7@t5HXP1d=0VA!SK#i7@uH||c>p6hJx0e%_5@PBkOY)H8kR+@8_Cjjads9XC zUNWQ&R@7_@X>H7MV)&#*R>-ew!OIWv9@)0)8q9nadun~tk@+R8)^WZ&lu%+dFnb{6)dnq7{ z+dYoHuq`l^m>d6i?c}g$@uBfv$%eB9QqX2)6c>@gx+nh@m(H^|Xic}*eFEUSDrWOEs*xXzT)i)S)S>bvHvP(mRkfDAqVeXnR~GGy>fV|TF4ovL zew2@yN%-vt{W%+`pC9OS=s)0)Z{tXIpCT)p>J9?56ESFJabv%3{-c(4x1YfR&>EX< zEYe~C95*XlCs`p&DNxUUG+=CZ#X`FHeX$((&cw2Zn^l=L-B*rw{}lS1@~hy))fNMB z0|_H<_i(eN+LZ=M_vdb&^6h+NeZA;VN9n>y824vcL&2@iKTox8-$~JGNkTvQACo-+ z58)vc(9m$ij?2Eu-acEU0tOZU?3a*S1eVkyJ#{=mbe8}6wosz6e!gyxq<-A&frD!X zDSEW1K86r+E6IP%AsNvuCu^@;)Ti7#N60Q{_|J+)sXPP}xqnYXO~1^rQQh+rrGMKP z6}xj|6XaUVXt79m69a#InMJ>r7(ID{pXOmROu4w{uClrUWR)|DS>VAdbG}yjrz`gM z9POq`jL*6bSh=9(Aq{Ic16HSkLQhiM=@HN|=}2f^b3xrfn+hD9>v^kTCp0Hr5V*#3 zEfi@Nq@dI$fQd zSD5Ko+^1iqi>!C*V(Wo`gDwHz2p(HnE7*`GjNRJ74XH!U6qdauNPEi8I_=tS(n`fw zed=^W9$F0ONZ$s27r%H z7WOaPwq@Ryo%#XMqx2>DPW$;$op7}ewXdANX#N*oQ+v&=3lA*p>+a~LpBPr%xHuO8 z06+jqL_t)D&2A_MuGZKckk?LtddX%?l?j_n0@_vav+cVy$a{2a_af2j3XCo$B)jN; z{^x(T>-(7x>uXvA&=tcwq)=z%kPw2>XFvPdEB@`@{_Tq@z#KV=w<)$QGi?2JzyA&u zwnsAQ;G!aImPU`Vt6=CmMm{Z89gjT0?F^@-CoST#)~{OtE(ngpguw?$apx_!7)SPXtI zPhQva6OE~(ab;zQL6N@EH?F+!C@B7!95LmFP8uviDuWLMV)0GR_)6)cFV*fn-L2m` z?_0<3Y1uPxWMHJdc~bNKBlaAz>B5y4u3Ip$pjWRQ>#~1V4#&}8uWF#19dH>B+5uQh zKG?Uik=KN4_VxY+KXNl)zb5nn(Jlu=d@F!r0zPv6;Hh`M^PSfz{BK4+^#3XN(?+4* zsNk=C?Q2K=%fI}~AE^_*BjMr8-(R>42BwC~pH?b;b&Bn8;8c1kue$d`R@F`usYl z5KFbfe@e3PZA|IQa4I zU9YdHPhaj(f^Il!$1+A3wHIjIBGy`XE^+uTDg-rCx1E zpq&8crGgl356c*Y)hQSR$8lK-QPC>HVE0bkB5WJP;3dH`b$+{#N$l8(YE0JYf=@ld zMPGKg_F(-gXt>RMUo&>lw?56HOZqPSdPS=37JjUEsux}j(8hO<@*I|Zrtk|(*$3JOD@H;q} z2K>c0@vhdX!X4s$Az-Cq6HbrW{!UaAM+l$$+~=0AT)FaUZ4udeQW4&uv7yAOJ)V zd4kj2f1`mNn#K7hTqGZCSZ54Ewwv%~4Ymz0(FeCK1e=EAwmp`h`{8lab$nz9K?i$w zgu&x_X$%H=vx)tX9)khT55%$IcAZY1G(5><=kK~yz~|t(NNC{UA94y2!+EK`4{-1p zyx=n_AftTLC9l)AioV1&pl1WVE}8q?jAEY@k+11m%{1*2uKwG<{o9j}0rOA-o#kl< zjCsLz;qQ$)U%XheSKbM$Jjo4d@ZYP8NPZg%`h*YJ@(wL1t8LTGl7>Skjd-a{YA2OR z>7GW9a4P)ma(D>Xim2wS%;H-<@M0YVzSmKdalL?HZR501MwcZfI7ajZo9MW2 zl8JUrW9&cUyL^b?v>ZAx)+FqNHS$cRi2MiTKDd zK*L~-O3(tn$)b}EZt^D3Kp$EBayev4`y_x}4qXS}&A~36E`LgVyU-`m=m$EST4>x| zqDkQOZZpM&Hj!{h6MzH1=RNPaNFVpSN-I2t@`{EXrz2fBTC3ZBPpR;T#7-s|Yb=jd za0_YP)A<-v94S4YhnKS#ZDT0a4YFfsd71I@8DxE#^71*mHn>umv|KJLnndbx6Q0)t zG6c#%FnZo6uv`}zlg$35X(+BwoDRx^)lr1Rw%b#T*>QD|3CboL^3bvh7^@#`c_I@T zT@ArVa1pD^i&r;*;Ukpl1Pm(+@*x1&`d01LD-IH5lQQHn%y;-4DK1#P+KO&I;D?9cSJZ>&IzAA=gvOu^D|EC0HoSmo z^iz{fh7TxK55bXlB#@i5>?eGK9pQi&+dSW5@nv^q}V#-CW=N zascm_!H-izzF&WE;8hi=YqQAYWjlq zN{zAq5}8wIFDpp`KgQCe_ikSGrZ>Im0;4?5e>O5Fs)LiEvQfEOSDIhJxrl-}t~i@E zl~4h?^;2H=OQ-JpdZBW>K?JALX8Lh3koSS%yddY58~LHqB2FG3ebH=Ea9)wkbi#3) z6OF+w!cO&5882I)QKzvy0mo?Wr)ZW>@x)U$8;GQXp4X-ETpzgtnZP#Y7<}o(It#jB zPB^$d*Coz}gyw!*>~%ow`sn(ARnq0^AgQMUo)L4pWAxl6jDTaY(-T_VB;fKchrh|L z!PxwRo=yVL$cO$**6exS?TOqXyiaOU+7@V(-De?A71#xwshtA9IBa$jT}b1Gr!@gk z2*PETU3P_TQ!J;T3hoSP6HsLj=(gV@x>7k1Xqlqo!L#C0F&1j33t4bqMSmdm9vbPp*#O$WYRj0}|@v5IWCuPH8i4U+6k3rY?p2jphx8d>=jln?|jJ%H9FoU^&Qh{PV z1=}W(*9knwuR{R?KDNaC={ynV;z;$(D?^>Pv zpG+rJNS(0?RV5u*vSi6);-}~R))=9Z(Xm5?I%parRC3VCdcHDV!Kx$+@Espqg*sXI zX#f)p{0!L97wCB!`9}1dT{9zjf_FgE#V0Sb`=5!K@8%CW1o16TS~GncPy1=t<*zM| z@x^t}4~Ib~bqAeSe|ZgcisJMOOs)fr$zh))@u7qOV;Fh;U?bYh)rE<>zA~v?9?J2( zJ|f@i59~+`3ECiU6MOg-+S1Am4LNAwc?i0mjj`*Z7fvNi&vjEhCI#9C9ppWztt}6Y zExsQ5Y1VoEzi5K+my=wS*meQ>xX7t`9RHmuV`m#7S@@1{d9@+_zABOtsYx>NNe7_dFv(W zw^ZGKV$)9vPbcm6T}L(p$thVZx)UrRA)Ll`zFqQs*R!%KV|9uynBY*a(5YvoBOZKc z@Q^3rfqGRRH(wdZ;6M}K(kEYjP;-w%{^dGkBG54c_kbgT+=e2NO#9>L~Bf>Q4uP9358LoRK44 zOO`C*S7Q8uAL#K2g^zhvLQG4}JD|}d8&_sp2pkpMcNJ8=(Hz6`h$ix`XS!f`z+TW% za@5D1jOpiTp;05x^KLhfm-uGpkrz#3qt`oJhVl?JP^Ye4yY?at+`}Z#M^mWNR!s^^ z)~{cGzP5df)DihHPQ(ohJc4M}5y_M0`F>$tqW1-kmmPi3%IdmB6U!00nEM*tPC7$& z?RJg<3C}S+hCb2YIv%^8^0CfDvvi=jh{awWc%fbz^7HzsE>#ioaUzhsVG*m$cBD3t zXMhJ<)OS611UYPTK+Ea5nAM|aSUBAur=>BxqEi7qM&F{g`xi~vn}Q!^Gw6y`Yf@Vt zqtk`!p#_-~x-dQA2_QIqiaO<)svLj)(Vegw6}?BVi>{WF4Ilaujy1ZxiE#l9XCt4q z2hyQoj8v3Y;cenbanrP8rUtmSkMlWA9M0{K$-VB=*5@eW{EMl7*P!nLKpLAfH?bSWjC_-sO-@nZa%y4SovZ zctx_%(usk=o7#YnZyb3#dXDXS$Orp|>v{B(3CCpk7j^-b7gkyC3GC6%`a4SR4%o3j zfF+DJjZeNJe6-s(<#GPSnjJ^R8Uy}SS6y|zI?)k9){V!)%egN7l=mtXzHs%Ip8U!J zX+J{c#k|wgSTb>U00O);q_Un)ab3rGiX&b^i;(b@v5Ca_o-e?PzUO#S9W5tm=i?hk z8r)y%PXl|V8gqg8U=XNp&sg1S#-FR*0I%&DFW_MWdGiUH2KNkMEf&pB`Nm*rhcHvm zmiq)?Z4Qp~(~36i#3$?&hE&)63WDxep`Ob~-|9zsDk=I4mT0i+^vMUBF`TcsZ~_7+ z9EMXgkYQ+0`A#j`V{l8it}e)@fjn~1+!ySnGMRhVyDqED64;J7#mI%s@+90hE{g7Nt=jGBoc*ush&Zi<;s!JLfr{O@7RxBk6w<2I_!tR!`_Q;nKok`$trem}viy#MwE=Xuuh`^pLC=<-C|S1sghDLIw+L&p zPbT;dR){mj(8=9~h_QV6wCe_Y1{7ozNl_u>)7W_aPZ%Z#7U?uVQ=X$JxbHr&tQ-=o zlh0hRI*S{5(D9U_KWB3?xnuGhKK^~s(0=O8cokZp4 zn{R$fch~rNvHkcb8Lt?_Qg)ig>CZ}iD*S^5?_h;;qu5PNmtTJQTLio?fV$DBCkOZG zV;^hPi5jl{61GMYhQ*$jozzpw zxc!vYDDAS8BfQ(cP_iD<`f(c0@Y7U0h+*}iJUmZZtX;w+ojV>ay0>*9miSzH9>NbD zV5f)GpJ*0iWW0cwV}M5>Pk=X0i1^5b!^>l8j+0;*A3F)n><5}nj&3)Va~ll06qf;> z4n%N8lXzyr<5bVFz$YChi8`DxDHw?JQ@f-&96vpE@CoJDfBo0_b>aWgE?_MfE*r{j z4?bx(w@A0@f8OgOwc#|6y;FF;E>6KUu-~Qv=U0E^C061$;tg@Q!by68}SNo$6z2c5jkw8b`GK=ag(oUl5NwEb1YJxdK@#+BB)?= zO}hKl5#q1>U_$|Z^n2&dokwdG;mg6$itvo4&eo&d8^7_#7lmROgWuLM0al*KL$o78 zOecPLhfaB}3lDl-2>50{@F|oR4A<)9Jrn44OlV+$8E}2TjFAHvS#%g!$TPr&Zv}Rm z+w<6Q$)oG}BsNU=j^R9LN}GSAJzy8CuuG`J)zh^t-}uHi9@BWcPkm)Df@jKxC4I)} zFE}1pjl#GSfGb^i;f2cudZK`kPkVr+bn1H1Hwyl{5hin*q30r}O_K$txH=OV<52x?UaKq0=tD z_!B2xY$}+r27aq<*&d&07U7w^t~~G4+h-f4Z=V#CjtvNp8YNK2cxS^dbJAdR7dC!zWYG%0aw;tg2RQ$ z?;}tbMR-mdP#Zp_9l!ywbeNlpts2QU4oG060&$;)*L~XkcF<0K4@k zx*M~a)5@`5FZ^s*Z0C{59D;w$oiN&v*JE#!?&gN4Ctj z)P~biInoMEx>7$`EB29q94zSTy_;G6!=!8CV1vUyb&NJ`|4$-6PC%3|2XEKy+x61n z$rtlEV3DSs>GXDxZg6CU2>hIW9Z&iVL+}^B%yC8Wg`Pml>$*RAx(`gbVqMiCP0q3K z(-omHAQg;;9<+1-IzM2VD(O5lQX4_0&fipDTYsF~uRic&32hEOSs_Jt z-&@r;_*TFabSXzsu+ruk?x5nbI>i;@&kNqT5mXFO=b$^Zb=)qe?ALvu2U+-qN1h)l zt4=nRNz;y5q~p9aPUW5nPKwzeEpl;rYJZ4L&547#UvPA^22KU zZCbVSA6GRU+2g6OS-K@OC+HU8nNyM-5zaQPCOlObmmhq_FU7%4YuLn$mQHN_7lGAMG|s^R1O-00xak*Be4|A^uoVLM@RKgrxylTDqojQ@U6_O z;$Wm99pH|KErQ26`7|44(8b<+-}~MUy#;uW`oROiek=o!qA_7F(#8AND7JB4WT$Wf z2!J@ytS#iViXGfzc!a99p}W+1xP>a(Jwp|z&Dq{HaL#qbY$E^WITjze$;n*qZn+h<|fZmg5fAbkw*H*2v-(;25qO__qDe(ToKxk3&9{1(U&2AltYw zLPyVU!6_^CvHk}CV0v;)O#LdDfa4X(V-LFI>--YU@(lV=KhcKz3~8>{@SBehgh{2& z8S&^Jmq^ZjPArdM0Q^gX6fCQ__2+;7=dX|wFO5J;!HvLeBXu6mL*oP>S?>VIAL8Ep+>gY^P;7LKIMs3zbZ?o&W`iPi?PGuejrP5y7ERyF`VZ* zo|o@64gTpm4nt2Nt>=uA{8ycC(dxe+Imc4k>(ZY2*KI_96tp3hbnV<3z@x;` z3Ow@R7*kfahg?wzbo8tqQf%bKPurvp1XkdCOgTMmm~J!3nSTk*Wt~KxbhP97ykE*k z8F&of94+#bRXox#!XOU#X4mz>d%7VEa%+bo-H(3sqpi9n_^?jF?+*Ob7q7QTIt{o) z_Bll#gGJ}B3+}v#?b=${2M2>d3eL8uUmbCewvc?ZFdcB-0LZ5YFfku0Cg!QNl$NH^ z3$vriD{c0C;5*OruIn-S1Y&4@7%|XO-%|NJ-FfIbj>kYjCpgXZ-M752;x}pVPt%I+ z=j-@c6pXGbyPLFX+tZe^VVw+nQm{y?f2Yp>7YBfGv4pcl+y60lZ{(|~XRro5rsE($ z85PCD9Lkyf!{l=a7qslkF;}W~?#GX$1E(1>izlbfkPQr^FCNy;F zE0btVgLS&j|K|cA>~Vu8+ub_<=M!t}Exl}B5ByyCBt6f+NcJ0^^SJ?a&b?~C?doWL z_r_U12tBueRH$+qb)Y0>^g+ z$217?DuZn$6&Wp*$!v;XI>BCyf~?7qc3l^64Dizs?AH;|#fU;GT1ZO;kmo3{Uk3!= z>(lkgyZ(6R?k?{!I_whic+kfQR$d;Jv}l7yy-_ zUEd5mUy3|mQWxqb05|^4Z+^2=+frr?3!bml>A|MzM|ve$lPm=fBNrh|Iqxs2ct ztD}qN4_ikZR%8Xdxcu>0TL7r63WzyJv@L2MOoyw2~Cp12F z6n#ez9b`y{4#t3;qGP6bzGA~K3VbZ$00UMXjH^F!^#@Y6YTD-6@A(PaU;1f?C3zkq z+NQ~*PqwWO;Gd3I$FgB*e1iwI&KL2;OVh}q>mT&+0T=UuZ}_Qhkxw~UI)@#|lFsWOPe^&BJv7pD zdF0e?Ro!Kot%2)T{$pcF-$SIa`fI!H-&ug~Wuxp>O(fh#JTfRoJqL2SOtbnw$*F|= ziFFE{!vksYZPFqpxc^FuT`vzm=$l_YVFWn?Mo9tD7y`lT(&)%=U{6OZ3$hAPHzewG zgSZK~Dmn#vbvTl(1J37DeaCeG@&_5@E?O6}yI}Ij~*kzR&(0$+S>MZu=U%;_W4VEs}wh3#t9>((XJkvur7pSKZo%?Um z16;jf0yh!&T^X-GL0h?LbFs$`5ZB4Xa+ZVxA4T+?+ejy1M8C9n;-A5JIhzNfP(1vzFI+sb zK_WGrv<45rmUsHoi80Vfemq{#QIz>IPF&}6DyQO72AfL_B5p}CzgjD(=YxS}8E-K*~buFy^ZPV_s7+4B@P-gx7A zU-`;ce33AgcP48rDEd*tY3i64;h+ka2jbrGZXJHE0Y5!}Nb^rS9SR)vf)AF@^YXS* z**uRtA&+51{R{F9CkNzmn9A0bHRfH`ZFwF61-|0iq5;bXR(MU90Cqk=qv3}1wbxCG zN0*>cyF5hHth)$2_RHtK2t`;%mp^P5pH%y?`rES`?qkr4W%Lyeoy33dxPb)hnBW-3 zKoA=WV+NfO$Eas&IkMZ0H zB!Zt~bQ6)fq|4V4bD7{rRlB?A`Y`0l1Q$FPB?ubt+GTPL`(fl)2R#{tPwAsZcManc|Salepvly zX_EDsxW3m>67{7lYT}d7+tjdq%Ey638a`Os`g0p`9(jeRmu2IBqYLLLc5h53RFSuN zl&Vj-JsW%~gLBPxC=)cxJJSeZFosEl(QjnO$k{bJ&P(-kG^y2_N_?m@PX^tfKk9fM zAd{;DO)(kti106z#p;55J|y*+D_~Sz2 zL05m|bs>=tw)%rxkO=wm8BxB|X{aKzi7gLF+KC=V-5{GE+-57(i^Exr9VHAW*rt5s ztsjzfdYxj>aT+pd07D@q<_OJ?n9nFUjEo)k1c=u z+uz>3WXY0ykSi!NKPle!;SYb9>j3fgJ{>;>y<43^5`3e($TK;O)bb<8ujGx!D=>;%gLgHyaneuE=1SCSLlH!a#SnAG(2y49!S zT3#;ce7;m0=;>`2VZ0m1W>ofvb?(0bECr(lAahZCp8V_3HGnY>cX$~jFR`o)dR}~$ zR)2fy4;r|oa;2to5`7EMzAB6%OrT`31_SR1P<9=ni5+9fK$iel%A^b5-cKL`OV=zi z9GYTeXn<3x{Gi1-WD5iGnfW>y$|Ulr8ZyvQ5arP|lE*1Omo`7pVFCb8d{a(waykvO zj-$58m$#wLGi6XleUY1MLi;tz-zOhlm6lt1Dvj#^r@!-^@0|Xj4}EAmd3yi_hY7kR z#X~8t(6%S<50z2UinK?QgRdaSpm-<;x`aYq{E;7#m*)R3cW)Z2*>%=?p7+c{)v0r8 zw9DlhJjG7zB*aM^hmZt>#B^z0L?c>!Xd$)ubn}5hLV^!1Kx&CEAOvX;2#LOZX<7m< zGa@0wO@QQvB#w>ac`6T8u5!7?Q)eFg|NHOfS!ccbyzg<@ai>GCs(se8o_P(=+H3E< z_I?9Kwya*jt*O6G7gJ5{jz^SX|Z^P)Oz5DTUNuY$&U83#sZa#JiMgjh|j$VBIaEuRq2z2ntC!d_x z*m+pj`b+@Szc@-!6U2MO>lFa@atE6A>iyzdbe%AziJ)!AN_73t1WqKLw!?6<^;l)?)*Qaep?GZXM>|-8&}Uhck`u}p1x;8D+&3sJ?pz( zHMe1OMkNdu2GznOd~=e&%1iqXkBwis(JiWB~5+}PyD5CbTkzd4jnoy3mUeX zo?_zZ3c{w?@C&vc$(fxTT$LcCZuGb56>B$`I=iv?!AW>4um3d*`dVBl zc;4)Ry42lMHaeux>T=at0zGihr&wJdT3cQi+gQ3j#$`aAG#u*U4Zty^dvb0KtgkHU zRV|+d#gSF%$-EP}wV`Kwa&bmq-x`_VRFacGD&ld@Ro(nMm&&uwbRdbofTlD1x~}Ul z=nX)gDln_3j?DS}cyzs}!Nr7C?mKAtKd`y7Ji5NLxOa1HS(}kk1PgC5^--~|#egT% zm>BS%I%T3d4XO#?#JB40Nurjk`I0wr?Y!0xZ_VG&ep^RfMut@T11?txHSf0z)+9gp z#V>ww@e`l;#FL-=E zJ?4dbI`Nsy24iYKUyFLzZ~yjh`}K1^0_nkZ?AWpW8c=s?&?J9XuCxCo(Kw5A1t^ZE z^Ux&J@36k$HBT>oaPYKgR4!$c2U~(uZ`yVFJN1w2rY0J^c5a}vGQTl#%R8=&9z3?p zbvV!Hb=`kKJb4L2<)~K%!}f@d3hJ6}P@VpoWHofo!ansK=|kQt$EXx&nU=lYYU{XCIB{& zpv`Ar{karn6DRlzZatYUY@Z?}f{dq>H?IcVd*W-fz9V8s~>S1HGvv+Lp z%CS4|dS!iik#?nh-D6Et!Pqonwqb+m{;Pf)Vs)n9W_VS{Sy2fr+5}ygv(Aume~6^c z3e0zK7UQ9`3GI??K^=gFd)sTGHZ4C7{vF&rJ6zL~fR1hiu4qO0sP6dxPi+R;OLeO$Pj6K(kx)x8a35wNKVre`@T+%WxjJp6Sk4#$*T8x)nH0(}#JD2^tTY76$ov1rcKmGKoZU{b;8dT?uLAS9k z3HR|G3g|fjOnv#wUp^5HR+vT4-r3RwFfTf^99Ug>G;RshssjWz37(X%;lz=Xl$Xd) z8u*lH!^wl(zsID-Znm4<&nC$FDhFTMt{+UhC|L(G93WC&xpgFu8NZExJa}-ZJLt1t zdwSBvEDq`r^-2CRUeR0Y4!F=$;5$9nB%>-eZfB0qHQcWbTBWlBSk>0x=XH5#wssqe zXFzWc-YVj#p8|aN!yi7R-yT2NPpR%CUzbyQ_T7A*SbVzz zNYQ~zyBrlpwn^Nn-PA7=>p8P5Cbl~-P1%j^Dj{mV-I&GH$3(5GKTBgo+YE-h*+^B5 z`XO$ystu^Tip8H^Y6~&#!%u%I&$ja`q0p_1_SNIu&CQJwH5@IRqCN6%T6gIU*|EpB zt_mYQ>2RGvQg<>PW~$l(JgLx{;`ZN=-A1$^%m}q@yhZ;`FRFe$eP?2bcy&MLBu{&= zBk;n73;c34Pm|gc0Bt{@o5d%z8}N`P09`lC>IuNneop{20nA~LGm#ohHkuxb#x)Ln z9JFb|&in9n@l-OF$H@wpyak5~saJad1||>Ow0!J+AAgZ8r{Q1IaGFc1!Hu39Ogq}$ zr!xLT_0f~3H>`M=ajwb}tNddwvLfmuIbc}G#WuJ(F>`QnV|B$(V}v6WemXc-0p1N5 zc1>?s%ikUK3R_{Sxt9RWE-Bw!T^^b}arc>tefzI$YS*LOAyVX+|L26%_#a4DQE=1= zUG_zI%^*$5G~>+;UOOizR);6{uJ+zo)zpEyg}ThGpwzG%=%UrK-E9BAD0S8KMrx$T z!UK9QU_;~Q8C?c^Ut5NDCf>ExeAW|yf_qv6?MQY&TR_jIx&CJW`_)+S;S@)vx}5M^ z$YPx2ofsu)+joGO?uSc+h2h@lUjSkU_9g)oems4FzCWnI=H8x=| zp`q%p{^#tRID$Q3`A;OlMliKugdyttJnNm!9$$Tl`qSnPE%H_>F17G3il1n=d;`jn z?X#h5t`AM_KeDjr@Ud&+!fOXMj*6ehkYZ;7a}y%W<2aF<`iP!S85$n(s!rlTuFaz@ zsLPAGuti04Mgzcxj-Cl64NF7r2e*aohC8jl?zYU^RmMjhee3jg*?A*9x&-KGC*X!I z8D7Zy0JRKlM7-vJbAA04iRA#)Zw) zk#eX_T%FrCf6^b|hSl|fcSnK_f2LYCahbPy6aRMPY6~y9`{_!*$mz4FS3mX}!q@fg zCs6Zf#Xg{WdK-${m*WdTJH+JI5l;M`0Q7mP8BGGbC{Q!f5pHoN098gZy^uoo@gPFFYOdeE@OiR z3m(IPYuij67Dpub>fEX-zr$3|EcF+sB`ne6Ptl7sG_tfAII^yZgR+jI(+tvC%hfRT z;7GnYH?qec_|efPHGU2bZFWY+);oH!h)I8IeMNVscf7mON5!{}W&%hb>&XD$YZ{is zCv>Tk;l!sW=z=fHnWqiP#3g##F!pME#xIk;KJ2rpZv>vzXW}iVKPYhHBBMuvgSrpk z6~HZ8F6>u`XL@tsgy{NvgrMgTL)a_@E5+T%R{7bSc}RVuv5_go0Y$bq~EL?UD<< z1s8nv4nfn7KJ)N&02qA=Y)=^a4EUx#|8-uE1lOdO?Y)iT0#GEo9qs*@9oBZylVbLd z2i8o2acE11m&uh-Ah0U{j0?F!57`@;1k75?1CwNL2Q6&tq(8j1eErJU)icjc&tEt* zy}Gn8stI6I6Tr&e!?(`Q9J_6PXmortCIKq!$|GN;u0n<10ft@U!>=|E&RQSz;1}2o z;J{^_YT0%qO0;R;Do2lXhF~whyY#@%5d#RF4npLGujPwe;7b|%;X~8;P1{*lT>-)9 zD{|OHE)xPZJ@J`iSESIH08rFb5Ky+jRupBOqnkJW*EGEnAgs5M33{0i@I6!1~(C@P%g{K6v@Xrw-{& zHofJ;jJh?jc=`O)wev6STU(mHaQN=~ui~-@B>N+MO)1J*FoWu(Mm7U{VcRSz7xl(B z2UL`Ohdy*6-}u?Ikp}=Y>97pCBxjzGsWaGICg+e(`2@g(uvyChyM6|&x(TY#;T42n zkPH@bZ=GhK!BZuXaIL`wF9oqSXFI`NJjq+>0K^|F5#9Vr@57(ul1m6fO<8+T=3aXI z=$R+J{vXx1cWCrkIR@sJ=Wkn@pF4H)*1%uvzxN|g>5D7P>9uIOaiG|{agn~9{dD!i zr=o11-T2_C=-VA8B`L30_XnPR_F4FNFPLvemNAmHbO|ssteJwZ(@v#e5+lzQ0E$uI zBOR!5Nh1eOs`%`1#gF=;uLs_OJh8WoiEQCip$E^M_edpGI1`?e*s$`~Ha&_q;MOv1e&(z3bBl zef9PrG#%6;&>k(+TQ2r!yEm;X+c(;__*S>Ip4_n)fTlh#1BEAz;fKcYo?#7ugIZcl zC83>b1<=0!hlNg*z3tAW3_g!62cH??SK0E(*UnK24|xyTfIieQeEH?4XZ7;Th+oNV zY^F|?B&I=n>Gb2Xv&U{<)Qv$0b=ckJ6T~1Vn02FMSocB3bxbh8wU2uF9q)L@qTaRl z-KCU;UjZ?!x2-1i1=dN)cJw;#%E^-_7j!AL!bE_9tYg$eSrg34-3}EGU`gU@y8#(Rlhzvt1+;mmEyTmr%qkejim+Y^P~Z9rtl$)T{(5Rk%SH%o*-)e>*rrO zvbr#Ln`$Y8P4EXj%3Gb4)#Vcxzxgj8IPpC{{<+QdtG!=ot(Cq3Okbzp^h2HMy5cT0 zaQ#y9^x~^&HzLpSA6xi_kLepZ<+P#x-O_%4{Nfj&dUk*=6()7_Z1A84eZLg|Hyp~l z)Q->dW z>@nV)EOxaDSik@N`!9XuBOke>hUfcQrOl~3T9rHFPxt~@QX5y59q7n|Q}O^X5d9ju zMeed|-5~Xv@Th(i;x5(o4%MM7k)L?tiM#K+@4j#9hhU%7!1CE$>;o^p_~Nua8u3xd z`GpY_iT6Ev)9{?Ojeq6dd+)uVRRQ0Iu#NbGb6toeiqAB3_eecuYQBX_=UKv*25f0@ z1gbM<7cZWD@9OgMKM!exRUcPswKoh`ZBHK*e}U^d)ii=J+lS!HlrqrZK|b}@@&tOy z3r_Jj%u_~j%Wgj=h|4*-w}pv&JUbvDf1skx!(B@5A~Ldk;II;Ze1HcgZ_|<|=rms8 zgSX}nnpn+NbXGbT0i7!^Ju|bWv%k2^%b%S|Kkzs_!n(HTsr?JvgJ1Z<7xwEjXh$OW z>DW95^cZDA!G2J3sPAaN4}9rMUz*jMR(m7(O+ZFp;~Cb=REPik&;R@uEt`3?N_8w3 zcI^jv4sZ!)-o}M|wo%C|d4b(2bwvFyN-_(tvNxdlY?g;);M_JlZJKe1I`eE^(QX331NV`4gUCO%jrn*h~kQ(&J z*touO>-N;&W2P#~)7R#(<;dhL?|Poy&HL>ysbAi*QDocl?J~+~V**{5 zriRrw9rYJM$#cLR4xod$XX6Zme78#gJ}80GGI$%X8O+$uLwvy|OyI$}q;k*;KRoCP zeJ+Fo^8k~O*IoY3<(Hn~2A|IU>Lc*mrPazEv%O1}f%I)$%Y zJ|UYa>8@BJw{tV{(d(;Pt_DDNDx%M5s{frFxQnV)neI&yA`r3i{bI(7x(dql4 zRmY)CAxa06PHrHQ*gQ zbS{?wI6+eG!6V+%VL>w<7HGj&iF8jA@Pv*XdFseqeAc5GVBpg8kL_PyUDg@a=65Dl>-nf*`d-3i~_ zQ=NO(Lw8I%t1BxvU-;(d@6*lU?K_*TO1zn3A5%A^f__T*y3Y_+Tkp7jS3vslpMus^ zB(ULwA3fmPdZ6`6F#({531CM;pN>fagy8pR-N7Y2AGy||q0wOV}JSf8{ms>a$ z8@^t-^hvatRLCjASHU6Q>CC-)dJmud*4EV=%$dXEg#4gBS~7LurlrZ*LwWC_=u@L~ zbQ5gi>tFx+G&jXkOnF-u8hWoTFAg#*%Q)x~ zwEfEP(7xFQjfiE1>KgBj!b&HyO2(s~iAt-Rqk0Tg4~qR zQ{mhw$=lB1%Oh<^<~=!^ccrIfvC?6(4lc;N|`K^!>`0M|1F*MCv{Ka9?Bq+9bHQY#DG)h&jMrnP6Pir#)MTKISk0NL#ryUYRkxXw_naM>-20-| zcUp05uRtpUQNOL>)uqLg=N|v>cY2%nTMVGoOBVpw?N87Wz~IO!ljs8gtw2)0;F>q( zqkjsYfsjeKooAo6@r=#1@-CnY002M$NklwQg|x7Lr>uNmj1dX0PiD6zfPSx zwW4D&RsqPi8?E4U2X^$cpZ)A%>_*Bq=o%nN#D-uWRGmXOw|m0y0%r=DEP5d58h%`7 zF_jFhPBKI~lc=<5tn#yOj3g9clDVKUu8oY6uY;MzP=ag0v zKI10C+nG~OwZ?#6U;c{Pb3UAE`y`VDtAlWQ?zu<4cW``?%M%*1tKDkfqK%CLu7jBX zvb_EPLw}=G^8}o2SVZf|lAu+eS}}dA`bn&@Q;i*8+$M0aUd~Tg+wXkxE%Wwp&}qx*NH z>XPPFJ-$36Ihky_nOyIaFKF_6v?bHCsKGX?OO2Cyp=^@D+mq=HkZBy-xiqd}>b0d! zUkC4b;K`BkiC1;*m7QHz0VB)v*WPvc#b<7^Y00A(oh0&vji~;B#~!KXso{#b4}fGu1&4E^P>O04HBfOTB5klJSi{CMDrIs?A-eG zjsCH{`_^WT-LbT(<$CG~fA~=1ga&E86oE23*`-K0r7bOkSKs^I_bzcpgpWk7hVJN$ zxvC}dVs82ozBm@T;5CjX47yo16ZMCjx`MT?>$X4Q_uvcPJwU*bDqX3A-22J7gRfvb zBtMzZ`_<9>8Z7JD2y|8(fv$0*v#Fx@{PM_iQ6=ch;RJvI8FCPlOLsb)aOT)GEW5$ll);0mbC@H6&y>2FTr!tmd~)B0?)-<& zuEq`_pZ$k*_TPKc$tAr6B%a0=PAGZ#|IKfHlbw6pQ*v6|&aGR6c=O%we)j@1s7S?U z6j5eU_^$8zt_9s7+-(&AuhUacJ+)6A>In%Isz;J`8B7DsLy5}&i z8<1?8*)7=to&C>iBI9PC#JkU?l(qGDP4#?YH$|eko~#1&tJ24`VtUgPKoB(b2K7^J*Efb^9H1Rv^Kl#j6({oWFFAUr+98uhbuTu|c_?{Tknr z-*z|%ZC+w1Wg?z@sX?766TlqFSHqmeg|~Q|(NmTA+qNicEO_joM{wT>K)k*L;OxI! zU=)J_sB9jI&jv7FN}X4Y9;od}pwf}D4v-eU!y~`TFFjqqsFeI^n~EAYq1S+CkH14_ z|Fxm?0e#R3e0>CQEY9f2?$DDsT?22t=RNOPB50!y@S?}T2%c2{s|4989gET)siSST zquP)$rp~Y)@$|B7QEWiZ2BUxvVY_Q^f`?wEj#fD1db4vnaBX_B8m~IMcIworxp>T( zH0RjUz}bA)yWVw9I~)0x864}UkHI^ndhTZvQ4ZoRg>O?qk^pNVdWl}(A;0q00t{BiM*}jvqXu7~|eoCtG%<7syX;dYwh|Q~jgOJ|^oE{Z9Z1jU$2uoB_8hupd1882kE8qo zPv~jvDF8>RYyVz)sDm3$fxV_{e7`LhenO%i_S1ksCV@A22A+00+GsNwlTX2g?yNgD z+Q}v{OZ{oreu;s>I|`Zrazj^tW+~AsXIb@})9%0gsW(*b@CCZ|{&N|yn?BPt$xi8> z2ai5?j3t!6U1@Xi+UU$(?|)dAU}qbhJ0?QVQJ2oZwF_szcXj^SBu+*bHe&HtxKg*I zlP3%tJd`77Eg7)!^i2e?bpdCva@NkitL4)Mw16#J<1vIDZ~+&;g!9S){Y(ZVE*)6< zV~5KHRsu@9-QU|plBMi!vxLvia#S`OPa;D(3Gcd&sFZQYK@a(wKjCbEEZdIG{zDgE zczjk<6nIhrnqqTyWOkp}cVKnqR<8ZMOV9R#->~ld=QIDFdQu_%?CMxANkz9+!Cquv`1pZA$xbwD@~X0%l=zRgw*TX;i+}T=NId=K<NWPIr=FX(J9vl5SY4|x=vc$2FyAv{VChES zwVuQlQo2So36&=SmH*VKRG=l+MQh0v)^2%?ho!3{(}DSU*T#w z^fhIDczAtfY3Snf-<*xteS1ys=+nu6b6|4+;nnGzPp;^h2X#rExoUB);PCalg?9PF zwUd^;a;5Pl^-*qAH+56lpI(Y3)-D@tBSRabUoXil&)nK1|tfexIu$ZJ^}(I0eyC-`&q1r8XzbTR?#7+3Hp z`R+6~v-qF|h+fITBRa|S0Ct@Odhj5Nf|M)e#G9tgK11E+=5;m+ffI4Z5%`eYJ!95P9W-E7j{q(2v#t&Z(a;~rfCrY1GBMQtFq!DYgAaXA3ewYD0!Xmm3V`bm?-4+`1UzVa zz|mG_F_*`{2r@Ge^{CtfhCYcRHJWfPI2F%L#`+;L8m;WZ@?O zGo>8m8csd%gQpKu1~~A}6HgAFgbbGl*y4=Oc>< zrReqG?FGZ)#+G3QWIrDJjqe=rg;?M_o#nZ!BiCL%y;rqMUh=Ng*ccd?I(T$->cGuw zeBWLS=<{U&N*kWW58bRQo!6zPRUn{sH$5LCLQOwQ$KkI!j#n*Na=+2Z#}>F*h)g7W zOZY}}H%2dJbTM(UF-bQub8o_~1~f>RRBwg#euaKLk3Q7L; z^aZ?<`N*?S!w{vn$kVN<7`{>6@E$*O>+{276EArHY?G5MaxK?2H=KL<#gD9AK0DnR z8Z9ecbf%5y+hQZ_5m?wG5o`oLymg{n&PH&~k>bw8w&i~}>VeJY#wmLkj2`(lagwR)Xs*DfZ*n`xqWM_%9 zzwX%cm83#MCpyrXIXGS@(%Erm4;0C5K<^ds?Y-JQx=NC6;4oFtHw-WV@W@URO2E92&APqpPiXm6{F5Vw(W|Y@d=+R{edw32Rec_9Uco|JSw6B7Jm8hu?z~aCukB5( z0`}eY!DsjFn|Ul;?8oa0EnL0yv8~Hz4{i=N4~6hWhh+$A0-Xe&Kvz4s+$(_Lp`BV| zrDx^f&4f;_?}f80HnB}#qz_t2Ss?6}I@Nm6M_F=~1;&@W_D8QCRf8*EbxI$|(XC^F zY3ibw`0{VhBt_g!uoDs>r-QR`O0Xdue8~&Sygm4#p(FL_a(;MA&ufRT>DfO^dZq1F zqqLp$sDEQ%`sNeMy7phw#vf1qBBx*0$>7B z0KG6UGWJ@R;U1QT^?8d|&%XTLrPp8F*BKsVjgHRJzZxUO9x$%oi2L}JvI!%{Bmy2> z!adw7s9F{zV}( zZ>p7=GpmiDkg^gieFHz}Fqz-X+p-omkN)u7fBD+QF@5hZgQ};~nkGA=duBJZ{9n`3 zj|Q@SauR+4tAU)WJgD7l1KRkKtAL(*!?yuFvK!KueYl&Q^5##ypb31P8AsJN+r5wq zwsYjzi@l)d*Y3FEjw>4IU2PKWXw^-Vx}!XpL4wm^<24K|Q_5vIbNjkHKRj{#-WR9$ z%{($>Px?*p42`XUg}H0*9k_aKc57&K`&nNqY~|R^0Ip$zS;;{N9A&p1XWsM|dxEoW zO#@31of*L7lxx!|pSaMIH}x#5lNEi$2YXyE^yJweIgQONtq8e?$8UZ#Et3jCG+r7}ObmV`X_*Z*cjpMK&6Yt>m-+ z%q^$*;D_$~cklW`U)Z+ZD3EpZmEScrP^#-{@IV@;*>g}Ywv4lhBAG*vi{SNM!Faq_ z1g`KUf98@KIH@lN=Y9eFg9g4&>PzUuU(gIfHuq>F6PI+PetsFRGy5^UAT`6KL&LuP zmjTIYNbT?r`J4gWPaiuAuitv>t*siCwmU=_7=}9PMR3;^JH>~?V+8%su z@BYKjtanDVJ-BJ(WUg{YqJBO4rq0UzI1@nXC)Z&Ez|RM#P_-L^!j8S=(-|hpwa+A6IkG^YzAU#wVo&>td`eA;aQO-Pt#Z_Q0MZsGc-1_x##e$ ztD}>9FDi~)U-`>kR_bFf$KZ) zldrR}IyiRI9cT9JoB2j;9PK}dwAj>7t;$$46jawT* z6t8Ol_~*YHRo#E(ba{**<9L+;k#L}!fC~rBlLR>d*wm;Qm9vNnftg!wTb`Ubq}_TY*zE^?#lacNaM(1g>!Gc?@4kDTWm4*kyv|Hx z6`(KUPN;#BW*r*nTl&(^q=F_Njis*SBL@fnmbMEopE`AFnZeK}!S}5u`#`6wZW|{~ zoS4&_e)&nSUjAXvc)g==tG?)SM0f9-httxbI&bPSXyl7u{NjBYq+XFFf6GzVQ#Mz1 ziF4-m+i$JgtC2t8~M9@#Uq zvH!%~%Oex|8H1f?f9u6g>Q5LS)KHxVAAE34cjVu26~Gx#Km0MOS6uT&BzKx-)nQ&M zzLC5Cbc#M6a!HMx_VBM)!ryNt6?y8&DnK9eI2{U;RtFIz<8{WE)Jo?lzXO233^tt* zhV=^bVGWB@H{z7q^A)x0vyx*YP%TpWj{eJ3!DV1WQx}beN6uu-5)l z$L>Bov;W|KBhcegAPnoqnbhc2nZ-j#Z~4OLky953*2~wRZ4cdP3s`O8fFi&$2!S(2 z(AU0gS5i#rBRW$CJ;2byUXr?Ofn?%{Gkk}~ekq$iAP=0n@R#5xC+Yr8+C8q~c7vMQ z{LwvvD}#FMbz0X7eEx})LUvHfxddR(D9_h1)>c%?IFc!yQaL9F^C3@4zQ`#{xt?Y3 z*|&Mq-S3}MkS`4B#~}4`k6!8I$9^{kbk<)x`mP7APwu}-A1U45t!LS$f{mUEmMO0W zuuD*DU;CDps%x6?a-?oMz3r57y7ubm(^?bZE;kkVv5*P9Zkx*j_}Xbni$N#SbcfRj2-8^2^n3CBh=p&eO%$GB`9hQO0 zza4fqx){egW!`HMKXhmNE=BHA%Z)1FbM}GRPKP~UD(WR%K&YXOb?pakIxmeeG z>x24I&xjfsAF`gw=X&9f&Wt0PeFr&y58W1!++=(hi?0(7?Ub)xFHDgH5C{~xP) zTE1A1c-OV;fBd_@`@3J{>@S|$j{>XPYq%@GQ?J^(@BlJiNZ^5!9QYCd@T7it^fRgh zlSl8oaP!#YUrs&ywbSd%3;NL;-R>J5y)t~@*z+^@eE9L9p}`F%3rS+L=ucbdB&ALI zu))}tL2QB#f9yl@g9DC0ho5op>vixttPeiM2D&OeY05!N0d~e7D*|AG8U8=`e)~^Mgk>2Y8SH1E`Ygojpg6 zzdm{Dy??)|-$qzpnID>%y?K6cWo~eDX^!8{)_Ac?#V$I~n+GZ@*a4ilVoL}DI46Si zNiozFlra$$Td6nwr%XbRGRqR&qI+vEczC(qXNeClFi)f41C|aR2YO-<4}NXwlWs#g z(cKDvq%yv-sY!cX6U9{rk2-u#LYLB+l*n8Id0bA29Nvl$a4IFwqtI|XWkTL6D}2hQ zsb+G~<$xa7@awy}%Q9$qOZNci7wn)5fz%DyK7yylQ&%o&I{NX?EuFd6bjQ5CH^7|` zx(0N~z$?Gtyn5kV0o5d#ydv8^k6l(Dc;JDnx(1);5(2`TOzz;2DR9;7JJivZnGz;P z=7S&n;CX%Y^BGOv`It9-O5gdG;D#ox>&pGR0IVKVZa+#)BU}n?sQsSR{f$R-nQ=|Q z&sK5M!+!F55aSzkXhBbRooC%5w`{^8QwL+w-K9i@)J?9p1&0Ra&X13-T^pLz&mDBG zotfBLx;Cn*BkS+>3H|mDeU#JJ3~ulQRQd@%Q_5#KWhoQ5_OR}sj-o3hY>;SJiBF6#&MRjVP5!FmF)9sa)j#0_@wgpSk$t>JT^ZwGzK!VeF2180z8uS2{J{)S!e z8|d|54c<*H)7Rel&Ua>z*E$CDO}q^SGpBIdQ5$s>*vnep=VzAFmODvj+-3bZ=+%#X z>|=9kFW)mk;ag4e*`lhSzy=n=aF#Q#ZA5$c(nEuyqaXf!PLCp=)=t4IqUGo`bU5CN57;`hhIhphm`C>)fYL)3O;Gd zJzyaKn?Zk42jv!A^n*`YEgL$mOR!b?FMes|C?TP0Af+DQSmF!Saqy>4;IYGjZ>$1x1&?n1kn5KEoY%8& zM^CRLxeJnOwzBHF?~0VZDnsw=#mo{?#Ux`9VYl04)=8hNT9) zCx%L&D_QZofv^F8#b>!%2XGw9%0RY0mH9!>&dHM}H`zj~n_xWK=YtxaWbKVCgi-Y^=cG%{JX~ST~Pk zl7EwcXHw8!fFT-NkKNX^Y!+&r>$l`1CphXdj^(?pZ5R{gZ(QGo(Lo}=5&4!~?{-68 z1B7e7bv@pj(zW4~_C+k|l7^-KIydnch)VX4Wu^LhP1}ISbR%?DZLzEs6Yq>{GI6S& zZp)TGMILzWznNDvX+AgE$|d67aDlzBw!te!Q~-D@c~)z z@BxRMVFkKn)ouctvotVBXtV`#5F?1qkDkgdFb-KR+SvLTD{5!U<~Tz?c=W6NH;F~c zf}O($9y)*MC;X=@J1)cXtH1iI{Gji_kAM8*Uy{wE;;9p3fggbR-~aM2|MGwH%^p45 zzWAXJeMo)%q60p;ah{|B!bdI3qd+M)pK@9_VOS;7%v{ib`2$bz0jEq2Lw5iplW;0T zmLqA<6UHV-%0LKujkkR06S=HrfIWk%F$c69=A|JwD6_3#L`uS@I>jc$3qU`x{K6)k zkv_T@^5`?ZD7taLI)i;T*fde0}MZrUyB8lPW0VpYSyqF;+{Qhf!Yoy48dY=cv2Q! z=?^$;!2@2t6y}x>em4L*I@Mpk4A994{*G3)d!(}+{HS+>Y1R6Y;EOrJ7q#qr35Syb zK&cql(w1MiNq%VUmaoeRldB#s(i5%}xE7o|G-iQ!;X^+842M5y&p3Dzuf{N(a_Ljh z-HD=k0FVb=Ri{OrX^g-r=Lk8FYOv|yKG);WJ;Tq6P98#P{v-Cfnn=` zbNdqXwQiV|imn>gL=%HBa1J+^L z7F_sKhMWUc{1Hq7Bo!d^lrn)>@mWV5oWS^?HnAR+J!Yb8e&F;ogBj)wVDzUR@O45C zI!pWre(qUW7F)ph44f(bMOJcKCr_Rn{p2Sj8164u8E`QZ__Gy2XpA}2WNwuj=hjazi~8D z;g)TcJ<(p}4j z8$yjeF$xf<&<3j}(pK7OTKdB!&NB~MTT>E6ZDH}FwTRmYb zYjhVw*a$<`53H1|J92E*b`xf307FMUbua;PB%a_-rF8(OY|_Y~BS#`ne)J_wKm)@= zV5i+$7C3oQ5B#J$=%KM9V4@IzSp^XM;L*=z0CIozSAVtj!$17PW5U0eayx~c7qp_k z0xi$z1G+JESxTOTp;yuiB70=WJB5O$X8^b4y8^S)+cr|llGklTHLyPTslCA3vc2TJ z0F*;_ZMW7>BO`4y6%3;240Zl~$&fuu|A*l?z?Nsm%yA=;MC}wUTa9ws`BB8gk zi@|<&!CNo>mNcl}1Dx2mwz#x9cJ=b*skQOFy7->dJ)6ObXuP*3o{b%IVXqmP5&Mi;gSe&ks0*Aqd?gF}`?o;+cL-*p_9p8L_!PVf-t zy5Hv&K-uy2Ge7e)um8kP{KR9r^ZR2GLbA(aIa4NpHmz0elEa`Jsc{Zq$&g9_VD=;Fk&rpN8q zo`2-F*Ps5zf81DJ@|Nb#(BS;|?2)hB{J!t|2mOTHqIQ%CVx?wBJ*ihL)rriGP zkNpat3!LR}!+l6wp)Z3On48KOs9XjJwg`H&ZGq88PReCH{$$Xj3wlltJi%fWKzp$T zSYjRR1DF=iomSHQ$HAc|SC9Sd&;INMNZWT31_mzw&=38PzOCle9%*iPT?S03QeFFn zMUbtAy#?D*(JYJB!q|e7rsrz|S6+U0{KbF$$C>%p&y21v&JS^{T)#Z5p9mj6^XQi+ zv?5@IkR5<1aIM<7@F@qEbMcuyWXz{O_76W3--gkZvZ2?ksi2joKG&au5^&Kk{?f^9 zS<3K7GJtGtH|gY|JH(nvByAxBocxXI#+OQ;WkW&J7!70k;m%E4kZM`+g(#^%s=*9TNn>?XNwdi#z=(iwp@odXd$asy6lHX7UgJ@DJaa@@Crpj_}s2Y%oO&T3}4j?y}1nfm}S0Z@6EYQ`>D70GhuwaP9SUj5kP*3#9BBj=v@>h${J zb=E_1DS(S=^wpKYOD{gj?*$BNqM&6{M*$K+BXWe__)4eb0h{5#XPKNN(Go~5MA;n+ z3{NnUky6H;%(GfOXWh_^mJK!)sWUi@*e7_yFL$PvW9HM&Lq6)smwo+g7=`fRqf(Kz zwdPOJgU%Wcj0_2R1HpsNN*^Ta2S{Fcg3q$xD}AtcI+w@Sr@{w&e+u2`uS%Mo`3%7|1hwzen_?S*JTRx*2dK0!rTYXKK=0bEWiHp zKD}S!ZQ$tUr~S3;8?@TF zbozM&tHhHyE}md*D>G19pP4L=tb_;7J&bh_Fe<(=7u99vww@ z%8=73de%OuJF(OJ8nHUOqYXD}d=*HWZk9ryWtp)V91lJ8(5!ac?bA(}A$H;E{e)}! zdeLPz9OZ!NVYf77I7vo|DtfSFL9R6$YLuJDoce>$N-idxWg$&~A>`nrX#UJ8AR9SZ z4O<}Oiyq1;p9-U#Hqlf2SK1uD+8^@`4sES0EsS10d-~4h#p~~OEj7eY0i7hNts!;y z+?7iY9=`nYH#U!)x;&s?7=o7m11l9jo1(uj$?bm^lQ;UL_z0a~2A^m1kgxUCuw}C@ z$OgYN`kqSw>D#I=9}?DB%Nv8fJm8W*8+tdj6@BXSpa1;*$VzvqKT0VI|A@w@ZvcYJ z1^^!Thky8oD>{2UBBM+IINPN_Hv-x6#uiY|nikR@Sb>wBoCX1}ikYoyu+sS^SWGus zR#!S}I`ez@bejz}sn?Cb`Pa{mEMB>=&KrYi4+iXI0v1hKgA0KA0D_DxC2ZBW)JY-W z#9JN-Ba|gbFw^M@tI%-oN-<2|*oOxU3uc$c$n zq0tVN@91>`4?vDA;{-X5j0wgMFbB5aQJnehKf!K4@X*r-VDxd)!LCjin8Dv!@$|X@ z2p^x1f8=+6_jf%3AlG#X@Y6s2)0gy{@Lz+#Q76iBYFK9~-v_98%-H5fw!#T4`U(Jx zZK#R3uGd=0#eRRJL#u$b0evfASU(%CZ;6_p2HtVdP~efN>8&!RpqGSP@VK!BL$kVs z3$p+^lFs5gfuH%zXAUTM_h#_JC)yxi-&L?5)FqVqafq$Qo0=^4YNc=}gCAZ@>n7~v zV~;&{^QS-k>Eq~v7k`v$e_$u2@1{4Xa8?EUtq7^ZY>7vA$^~5bqHN>n;!yH{OSmO# zo|-1O=tEY?BH&XNJTSDNn-4hUlPCGeNg6kst842+ix*xxsq6lG{ouo-hx9K034NSnTrwpP@Qs9DC`A+`5sA$-??`vVb=(18hryZdq*Q#DFd)0F?j6Z~Vr_FaPo{AJj?X zL)h<;*ipFjYrpnuPm5N*1YK4DDWscGuS@Y)vr?5J*HSahw3ekg0W>wQm})R|){Rw@ zD_F}o-2|N2cW8Zl-$AA~XuWHphS8T^I@e!&Wk{<4x!HZ~6msq)8j&M$nai)lbq(I6 zlfzQW3KrS~@P;{?>v`(vm%j9+8GTxdkEf>IcDsQ0w+PV7z+h>wj!(Wi2Znz@AMHH& zxzBy>xKF-CAxN*1e-4?Sp^yx!V@zuiv-(*`Ie%Is-EY4t{O$(1}Zf z8!Nd9&iZkQgT5ippcKqaNC#ioH6K2~n>gyifn3s32WRtuVRz65zwsE9F2nFKuHXZw z0A~i~Y;QU6S{3@t4;~nMN*nt2!+r(%htQ#vV+uHZ`jS9@Fcw)-nE*n`fR>-v^!nj{ zqb#O|%dE{GT>?zXNPZQ!P-@nMLx&wn{Y9V!=o8=iCgAkO?D4x6)fL$8szAlAmH)`V z_46+cFI+m;Y-EbY7Z3jWkUXiJ{bj$g%b7U&LWMieIIR?p>Py5&H0yIe#W?Ioeav6O zp};=2_&iXkyHahhz)2(Lu#y`HVCqvdj1ltdED}`8>KUR@46_e#sfP8Rx zWMlE%3;XqxUw4fRY)q+Dio%*tum_X&keok!^!VeW`;IK=E3=OD^dao+2w?op;7py! zWIYHrd_*361Ue`OZ1x#vaB%Pu;J_s4DT^J-oYjHh%cVcOg1H2+KdcUv{3W1(JAB_! zdf%D4VTfcI-DLj4Z~fM9`2)b%B$Wvu7Cqr5pfwKjkHk-M+^>~B1@9!c!#n&|^K zeP(0k*ww-HMSlVagDy6XT=7=?n(gA9yHwo?Z%G|JEt&OTG%+V|uq$YCVVvBN=d zle5GJ4n5|>n2cUIXpy^mY?$hVA$8}vl zsbHoJ(bW#(g5z1gzD9hB6#%x>woCxm^$mt=TH5uS>@wJy`G>#!L5k1~Py1$=kj*Jac${Ykdu$ia!LA zh2>*AfW_y2AW%urqaJPtVB|xevhJ6O6wJPHhb)1ew&=&ygYL8ooD%_bZuGGMC=-wS z;1!Q|1G2LC`@jGDwO{!S1t5%8(}vAA*%U z#WKKMh(9(YSyBsjIq=T-gKq3_0Edk>>~ioI*;*zBwhde1*q*g(PkrUy`GrOOd>JAc z?1ud(8&s_|Fg1JVvqLjSuZ>hgw&hRpHJ0EuLjV($Bmx+pND#v(G(&Lz2c;t zscQmAg7SH7VEOxGQn^S7q!L5A4B+hNrBw3u%Hi*Y4;-{^x-5;1Pi@ZLdZ(NXQZoy8 zsj*(UHGlEk@Z7nVhIB^ov*yr8Bc^T|+X0`r%#)Wqa0Xg<70uvIrnB^;A!B;hKPDO4 zrQ3gV7u=T4`s@1a*6XYSA{g<9Htgujx{LbK&K2Er$?pvI(q;4f(WAzjwAq7IKwa0y zV)M6_ca^Xe$pbQB*jup6;x{SCt}_E&yoQ6`hFwMwIySAOl4;qZ2uu1<_>&OyEEb*U z_9fuz`tb7WXWpp|WJhCWE@RY+n|=|FeE|dOM{m3Pi~2>N#pdI(&5|A)_)D%jmbU8` zz~IqMjvVcR9A#i84*WwO!5zWh^}`-1n|f5vw#|UI`#BMykL5nA0Q6xuRs_EO*N@k* zf;{->qmSOF`%K+m8&P*ynf_@1|KCY=KFgVRO#q2hzWmpJ{nwvSC3=0=T6z?C^Yc?W zctlkiu97bxyd1kE6KOOjBGJYH1_;81Tj*Edz(ls;wq+I?&)6_|41$X)lyvmFxOuB-LvkJz_Y9I0Fe09_Xwt6=yk#({j> z7WA~6u*>M>ppN8`EDu6S8-J$OF8$l*?^{?}yiMVQrsS)0AsgDn^nrh#ICP7C1Xm{l zP1m zK-ja+&}&$>oS>7EuU`&J%2zzb>G9l{X5rm;ElEgiv#Ccj{P?O();fXdaJC5R^J3S< z{)S05$8@Kcm6tm?{X@B6?jQ0n@MWdF$%4jJ$%Z#Z;^c$qXUAG`^>gW%@~-Nq$M zp33{cc07%x?a){2Z}f~!Z!BLp{qEJ(mE&>tZw#b@hD(2$xCXWkpSt_g1LM=HiZnmc zOCKVbQ~!wSVK8|w`(uV{vGS2J^*c0KJb)j4607+gXMcEiOaN3O(u$T8f0c#eeIPV*4eMUOBu@iy zJX63$iSXORWKz4r4w$kQ~+?}7i(C%&1Q>P7v{?vgjB^Mj8z&V&)=VXExcsKu(1~0G+4CRKxQLRYdt5xO%K3Ay}^!V>Dg!gK`#j|q)s4BLq?WmuUL(2#WUmBT8U`PXT z4_jANArD6Qg17Rc0n>2i!WIW>xiF&!9@K`d!|VFNP;Q=yrF3?!+dkl@lj&Jrlh8tpIMOVmkS3XS>+!3E&2y zCW?F{*i)a7uB+|=_{T|8Z}f#t07tnDQf&3WdjKcCC1YQM=K5RtwpXPHK!QZphNS~i z(|Oy&$82dEQTQmExd$93Aa8B%nOVL5(&Hc0iRYGP2HXxl7$QkmGh7cGzvCbDyMXKU zi(?wo=>v9)ZDeUzaG56zt-cgs;y_9CL)R(*KF;3AaOOt`DRokxgacpr(;t@qB!Zqh z{{*~beC9`1<$>S(z295ao&ERdr1YSf)jpAvx!q-JUQY==C%wMUl)fZi4&*F5$H7Sa zTF~cpI_}Myi`@8GFD7>i% zd0o^EEYDpTy8P19BYHdtPdP$A<+3`c={;bfoQe)AqU3?132#Up-1KOUvXrQD>?*LE zUJQSPOODj-fulRPYnr8#H+g#ITKbJ^aA=|{XC@C~F{h8nCG7UacM?7UN4db^m&+}< zOCG&e6uPoL_Ef^&b+i~z#gyIWU`=6q^x7YiO({5B+IZ=M_xh z%D!B{9+L$VO0ELX0bapxb;!aGE@6$CY|r;e?tbKzy4phiakKc-!h7=%^6k`f0;rhQ zwY2!pRk>)O@@gD51x;!tu;XSRbRDv}J>Wu5(Lp(!%E~xL4ifqF%_mmIr)PQd4_#dq z41L1!I`MKxI|GLouU^vbKnF*cPW0s=U7ifGOpbmX0vkTc31<#nvvIwJ7yiCU8-G^q zbm#>ZGY82qD77)aPL#U>8)~1w8ceJ}>UKbF@g3O8x7*!qocK_iK6KF#O}>EX!}O%s z5F**aRJVO(IA996i$4{Ti*8?%FK|VkF$Ry)Kxb-pXAlABiq2`uk`5* zt`qk3O(*_Qo6Ed{485h^VYm24Sx1=!2&f1;FVT}8fo5JN4g4Y~$tmZVA2@6%D`N{c zESugYO}S|?3D~wKdha>G53c#q&6%I40Kf1Hzp$pq$am|0)cbUQz_O`Rd8wx^Jvu^kd(?oF&f;Y8CV-SB z*H61{?mv0Y5@-1&Cy;rgPajU4zou2dQ=>Xl*cai`Cwxtt{qh{Jg|{t3MY7Y=cE4P* zIT#RgTPcG*?Wbt5mx$eRbhPyZ&dQO+Hiz)mO+DZt7rDTc1BaMl_(;N=5oUP6`;V#q zQ|eLE0*1kgkU9Jn1WVVEbCj4C>M6)mNT7xHNa^UFrmX`%0{3cCw)V`0T$m zI5K+v(7PV|8b1TBpp~j72*aP^NBW1&gi{wX*hpFMH5`0dKeq?tgMd};mwA{RC==Mo z0&|Igy*%?XsQ`Af^h8D1y!lhRHN2ToZN0Bs)mUF4u?S;i>|+^z|8 ztQM%Z5++NhQmzj!DRh(>4uO72eZeolln+#hujmb1iTsiE002M$Nkl61ry}XmIE(uAhIL+JE?;wfSeB016wW4bX|N;B!K!4#0WlhZeBg5f~hDI0rw6 zkxd!U?Hx8<&H#oKforyur2w5kV!yy-fo=7x^)Xopc3JV|Pl8d-U4Ys*f;0OScMmAP z1zDvs&|K(rRwTnseBWG_i=cO;zJrd6X42sNBRRigPe4|JRe*kHj9(%lI1nq=nzq?7 zKvH$jJavTrEo}_i*muiq%Q_24uT>ZQsldFdk~3XH;)w6xw)^PpGxDkq+8RHudHk;X534^K_{Ge zMpkmauz?4bUA!vm^WJ|f9eA)FHV~8qt-YA^_k>HD3k0@l-Ys^?((b z&5iYegSXwgI6OL$r;^%-R6+0ZX|c|gm!HuOtF77|`q04v+&YjgI2+cV5ipNw(q#KBlh;V~>On zqzdmcs0M8|a0Zf(97M{)pj2!I3=7G$25fu@Im@RG|2vHfdF4;Xk_!!lV5qy z+Un{}3K3PJOV)D8P&@H2PfpJ~GIQdd3yMqv2(l@*h?51348=+ zX#;o=gI2>Ju@kZmU}QtDCkted4SyW$;0SJl9obw3FxK)WA~yxmBUyf}=?AnrxF>X2 zAxcT|XI*+8)#v8E*3pihAvrUs0X(Ve5#J0%4!+3SjfSW@ zp_Qjf(yj)W7Edf1V+>^LIxn=ZZ z;W|$Z)aKSJ-l8jDyIj?y^o0pcl>)S-A}<*b?l0hE3SFi_Pdo^v9r7SkUcBZZ4>>Xt zcv1nHVpFc=CE2-l?(|30jebEyd_CIT69bRSF7CVY1D_vQyzCVfh9UqRjOZnW{Sv^G z2|Q@(JMscYkfF-K4Nvmcasivh1cO~Bc=Q2tq%Qn`2c?OJ7W|$J@Ii_1NRWHn=!ZX7 z_3_^KDBeDxm0k>N|Hl{>Hye1l}=!Bb?A=Y^j`cigu)GOl;(8{J(#gp5}KnvptJUU_z0 zE#{7tf6mb(zSL`&avtynPpE4KLE`8jUg^~{`xVs_xqb;+M-$@M3*D~^TLw3kt!#@_ezVpHA0T6VRM4L)I8nFlOBZra!Jj*zgE~7Iibf;DSd-)DQWh1Ah3xkyEA+ zaOyE`H+g6&FAx>hQOSUUkcZ3ILk_;{uf2RgAAva`g4V*@lP8RktXQqOIzBP=%-(xG z{Ji%3`~C}h(w5pg`AYypr!RxA)RVrBJ}w^w!5{GOCM<;xVA*g$Q^p9voiH*SBmx}X zgvrB}?I9-~^W`-^XMV-kmR5eSujvHvKWe<(nL0s6@@v21e_8SR=LOmHV-~ye?H1`m zcNfCptC|4VQpjg`U}$Qg9-*M+%dj@7Ov`C~)wj78qM^*F3WpBLyB)BTO6Lcx8DMj3 z&*58F_+pS=|4rMOTPXjq>0^2BG8ad-6)o;g28S=<+Z(P3S~`3;_x9UwU*Iep_Iml? zHldyL&45F!0>U1=c^Si}!8Y`k-yVGkbY>S_kZeOQbX?XYh<+GhJ2<0VL%iX`E;1FL zgD&u80K-)CP*!sLWE+u#K$cv|GUN%T-bTFfA!))n0^vzM<<^rf?flEf zMATT7&E)FJrB1_81OK(DQ1GOAxw#4`A!Ssdp}nPVUun6va_=9Q-6P!|%j^klWUqy2F>$*|uqX@=A%z ztz0gwci!=icPwcCb#B}#?a)}>{!7*M-GKdiRy(22mFmK3+v@m1ZR4EP%4s&F3d6P* zL&ocq;peyq!60dxhbHK5Cvj)J5Ht*rlKY7~Vdw#ymok77cv4#?Y1!w=V?1&IBujV8 zo0j;RCtzpMMh%-V^oJfV6}>$g$TUWSZjin>d;bqUs^63IT{9`k0CHfV3;hI|k^>tU zK4|0wBmr2%@Pda2LCKUhhB0*z&?$?ZINRg0Z{(qqlmQML6NgVMf^9=_zF!;1yZ~clIV>y(k z1Gc0y-H5g&&aw(KiT$^|xO6P<}yPM$nDug1>JJL!XY z;*W9C*U_WYThwVRNlX27_TT*GH@~@0lfwb=AktR{MA=%_7n{$;=Az`!I=LL}T4*^i zskf3J9R`o9S;5vL9(=GL$iSrJfz*JFi#=cy;7uJVkBxv$OFVon7`53ywaw1-(K}8n z05suJ5BG87NaL$U0%!lxv*S0N`tM_F*BNZsa-b%hfd;_ay+VDy03IPnCdiGW$_uyp?q!snRD z2)F;zxukLOW%0d){Eeg=o&a!$q<7)}i&g=rqnr-7VW2Y!Xce$O8(e&)GSEqtbFMU~ zI7~w(aTXRm^w9g8hi)rWPVhm^Y8u*A%l z^ejiNtoX>@?9KxZJa9#C@#PCVv;*>WDmb;-?CH~|%MC$nu#$NA;fD`bPfto)h7$A@ zoIWb@oX-9$z0UsObM^sM^We$4WLf%>mTh8F&`oFwwC>S4A`)p z`fQyr{v}MnVUIGpYM3&3a3liUfc~U@%IK?UjD2Ll*LU&3=OiH5Fa0nPzyqEGST?=e zPiKDgbae6<`1N1^^)>yr#LsATa4R-#0H8@S)!`)ZobLSp5h%(xl5ThcNM$ncg_)U| zZz#}9V+74ks1n0k1?*Rj?s{JU{O!XHjvAi%`uSk7 z;?k-Yy&vn^MeN6q7b}!vd#zd#(W;b176pMw5(wG%nasZA{=U!qJZH}To&QWGKp;TQ z%=3C2d_*>QB4_sJ z0iNTJKYo|mBJPi<*5V1L_xdf?nOnPupQ{KuH!xT2G!x|$q$H~+1$Suzc$k-qIIsEW zzC~ME6~bQ%z*)J14?R(5@i6f1I%B!Zg&%Rm9J3sWomL@3uw$5n(WycBUT-&y{Pe@aXZ0N0co}a!` zGQGeA8)Ji{EIn1_(a+@Ix=fyO1V6BkIr}siMoHk1#Rj}g1i-?l!vW|_1Oz^? z#tVD@+2VVR@>%c;Uvvgal@yO7dZYJkT2cOYftlKGafiXwcoUb-M0aa;I!Qjvmoqd% zg)>6gi1H`gVgMCAX8l?W%u*eUp5X)*Y9lX9sfVS%ZO($h*0~D@xGJC*h>Wy!%p07y z{J5^gC!Drx+Kl4af#h%jqyZLsq_-F?8W0W}kJznaT|VH7oB^UQ{q*s0kY2{nMx9-* zaN30<<2t{V@SD^ogG>Orw_*`1r3vJ)WqLFahF|rnSKX>M?{U9PrQqZ9I^zJ{1T!$S*o#vJMoH}5;pMtM{KzYCAsZh&l(i>MClfVRYCiLs&kUV) z)>$8v+#iaye6@&4q*jLtcj{)mzt+oRA2fwi{IT1JrpRlZK?U^fvH#SaNWYS?<5a=a zveH9kx%Zk&TXXcXi=CY5mQ3(iW2l3oY>n+5W(`>lcK=Xg9U&gG(=uz`pn{z}y=1Yh zM%9c;DsV-B2V961ohjH7u4OQwiJOw5J|Mwo&;qoR&ea|`PoICZ#pspBHpBb@eN5Fli7=Zg^gdr*etO|Trj@?cJD_LVI7faE|qBpG3*KH^}F6GXTjCHi= z0u8nX%V6UP`M{I2(ZKbMO|}B4Z=5z#U(B{f3tltey1}6)eoc+v%L=ylli2i}D(6JG@lo#7h{ z&_h?i;74_ThaUGHsh{3HP}?@UuU;F$uV|Niv8P85{leG)CeVP9XOE0tbOI~c7y_;) zS{vyjljmQ*}wlqFM81(dYR}t1;35d%qM}C zQhjIx*#&8BR)P%&4d38pqwM@PAWLwp9D?6?5mGWZY*0oo1aKK_da;%BI^Q@MO`1OMcZ_%R81NvX(AYT$bl?oSR5!6vi911k(4ETI~Y~(>?m28wMH(tXO zaMFoxWN9Q|5@j+g6hGy1Mk>H0tYWT9Mf8NOU^5&A>ZJ@N!Dl%-z(pQ(SFl$n>IPP> zT)9!l>U(s<#vGm9Z&l|s=(1hEUi`UPv-lQ{{nfdqT>J$213DSlt3xSn7HZH;-mfbQ z+w~EV4M!h+G&gj>Z@#!+xldLv{D|Z{DR{Akzidi2Pz}iHAM&B!>82FJAxrMOrYB(M zNlv&PYr{;&+7+2x4%y6}6>}W&dHta&g-As~NTXpN9^@j(X$QeJW)XItBu^RsO!0*B z=!PGAq+?8E*Vc2+;9KF=CFh*XK}xNkA*Z8jYb*y->DZ^h@Mh2mDI# z8UQRAj{Se3F?Nj+-6!CwrcgFje&dVEQ@H4&i!Rm8EFY62^)$2`Ej%rpp}hClV~<^{ zy<`s+ru`)r8!EyF!y)cGMk|%A;W9cr;}SNN5b1KxeI zLj;v+pMcF*41$|XhiHlJ{2`lGQ5in*x=t%+zE$`D-p7UMLQifl*OA!(EZffQ=5W#% z@@~_3qEE0R*xJVVjGoEJ&5E=76UyVi*Vo!fa9J07biISHxW(A}k;k~f(;f!n6J^E$ zG>rl4Pr)O)0#L6HeZENJ=SFPcxTXN?_X+@= zI1|RS?7dbe{GKo8{|C58;<2{XPpwt~hiR62NP9p#2G01X6+)4l-q7(V@-asWB~h-H z2M$i)CKs`f7ok`p9F2Ek0l(E25U#F!W2E6T1VM{~Z+S#WioW5_yZQRA< zo?1C@XokGC2LmZm$h%ELgY!fgFz_~@z~wrE7e3!oe};bLxqU>8H|SA@pk(#}AV;41 zKm*1HVBd1s2;g(w8Em>--e41!K6sFW2CNO(lIm+qa@wD|<4eHKl4PL4j}CaEOn-(9 zIACmG)bVEA@kWCWpU~&9E%D)D&rhJ|@|3Y7pKSS$>{VA?Rde2X=grm?rvE8Dan>KX z)Y01e*J$VRL!EoN4t>bu|Nf>&d=4Otz5CtozFV`<)w(&RTe#HIa)hEe#Vf?Mm+Md? z;Gs28mg94dE0=THK4ICk*%((sFC7k?(3m;b!)Q0xH!Q9WV6*%Mt7aEG+Ol4|EYj-Cke_bxxC3H}Z!4vId6~!hS zDP&zIBB96Rg$I}HQbxw{p(mA%dF;o8-JW4H*lbf4p)gXi?P^jGQ+9dW4SB1R(~=+J z3qQ?Aw=cxgjb!nvMQ&T0FCX(SSS(vyNYaGAWoF`H9?rO(x*!HAAD2yz?nPNLJ~^ppH^ z-WW_3vQ#JZg#*DKcob%^4SaY5=P+!!?!0U;{MxKe6Ujo)lb55-tq!7_ZP~SP5xR0Y zc%tllxlF+3PuL)L7*XRfz}pBr=wdu-12!JY8Jz6GANt6rDlc8uM%X}(a@b_j&tQVq zPW&+mz{?&Se*EY7A3!^UQJoKJxb@asPu5Lh?*d11K7%D|4X<-Z-_d!d>&tXw+K-<{ zH37IUoCkPVH>-R{$0Qq6Q5=lMHD|@g@lAtne3`2~B6q{tF46gdmppB%bb@pIWH5Fn zqEA38`+?aBb(D0gIOeaz;OMZVV*#WyxJ#vi)=Mf)jjo)DkhH$)< zVNyy?SRn*dAkawQ2}TDE<#3239moh7GVlgGPTt$lcpQ!;ztuf-LDMoHTUK}A@Q39; zCRi14^Uvj%Up{jF`RDVV|99z}8V`t>ed#DVQDr6-O%xBk{`IfF`s-i+`bO7F_K4D> zngFoqZB+B7H@)c=oxu7kl~Kwk0V`7ny`rc?v(^mpP^a>qFB<>RaUn-^ey3cyE34NL@pd z29Nn{GUlid_<5O z$SXL*rXBN#ea`Shz%OD1e?k}K`|i7M_^oe!Ypa6)9P$1UIN13i;iEFUEm`M`{`PgR zd)+OLCws&x8F<7RB#3WRO!?7gpMCZ>1fNC)MauP42d--l=!2N+w1n9so|u4w&vMr_ z4#r1lo){GdI?f7#OH9_WdRJgyPyMLw#A58zP;7;m^9RC^PE0u2p$?%s z;mds0%E$_DlaA}CCSP?@a=ST=b{IF=Rl~_vI-8E;Wu6k9fn1@tRHl!Uz7lNpVRa|G z!MUtp^}asj-L`H--=SM&FsZWjk#b5lz3v}bp7lc0?9@Q-k zcIqix48R+%zyA7*WN$Sr%0+tQ=@DH8n8=)*xnIke%YXdiAAe8I+DjS48y<>W%lFNi zbwY5C8f8dV1_o4#6v&~ssC!Y$VK7;x^9BMo8hIog&8c&TYxTvTmL2QvZy)OEZsxgx z_C=k$XUsdiM{gSDsstTELneuu4UGUy(M$1(Y2quz~!8m9+b z&_j>QrDNf;T+pdAGG!gkZ+ks>oZkYb1n2SzMux!STMff|x~8qa>lZKFy?Ol~Hq?xy z8(SD4dVqGYeeT-p7oGTrKhTq&dwA%J;G#YrtkgI9-|Ry}KU+ACjHi&dqVTYrJ^=X8 z=P;S60O$J5UalM11oXr59bO5ct3oE0_Rt+Rxj5EG2QYMGKli!M4Sn!~AAH6gcii!2 z9SR)IL?M=l8`!O^Nu&SVbI<*hEXQ$(;)i3!;3c z!rURKYvnUlA?#ZRB5OTRRMv{p5pv{^Ee}|9_6|0qf(v|twZrY&_|Wv#zxa=(JJ;Mh zchA=KGxQC?Sr6TO{nB-}{$z32rU$2w=(A!b=knOh?SwAj1r`G?aQm6tM1u?oI}^wY zU3C(O4o`AYV*{_u@4hC!%y-jWmctitB|S+uM07aQI2gg)X29?(6|{z?;q|}yuNQQ0 zUjIVfH`kE@roKx2_BR&UbJ`k*KBib$Z4HCZDL}7)ZY_=&g z0YP^->0n|ZMg0SYFNcc>teE^*6+otr$UAJ49OdvehZWE^5ug`&?1j8`hQqo~W~Q$9 z|FQVkV6(x74-}NdZjbwZ{ypz`&#fTFNR%FVdQ2t&%;TWvJAU+|AALa;eZUaof2{I) zWA0&^1lnmZlH^n4dF8BeC7yD4qFjd20S$a?qr(HW8}9u1V%=`R6s>>F`abh_ZC*EX z?M**Ca@}n|UDVgLqe0M2sqj^%HdnCq>O_W zICNXt4cg=*7`?$$q08|Vc7vZB-RN|Ep+DCbI9N;|_?2_#%icX(9@0lFMyAON^x>fa zz``*dwDj-VenNkLA2+_39#o-6DbyO^CIYsx0}dvaO)&BVB={U=XC%CBJ`U~pJmfWo zt$xT5nD8J2j2&Qj(7~RbTst-66WQQcDQKCWVusxfBDP9D_5?3>Dskx--QhI z{a61*REhEb1PA-`X{4f)+6w&>nBXv91-8XOb z&%d`~!*6~ye`IJ-Z|xbIki;9EVLnlIJ>aLhiM1+k8lcta^4V;;y$T)Rv?ZUAr>vCt zq98nk9B;D7xSX|Fl#!E2;unAl^EKm7bw_vbBWr@0J%qvc@7~rbi;ej}fHzAb8MVH5 z>-u(ekm-W%YRCD2YJw0tHVDu%tY9@4^pk=+V3=cxPVgd+PJ-G47ue(}6Wq{QzQcn& zFo{V47#+@M`V{!q{yMI=+kCMDA3PuX*vI@vqud+rW1hLAsiaI^2#f3RN)JOP@aeZ>%M>)x->XX=LPI@*EDXH(m(}| z40*u8=eiQjc+?5JMR?c4_eZ0Ot-`*Q3x74c5A-!|x&QXX_y6R($824F*X&xIAXGmv zszT1pp@ZbQrjjT531m>10x0ShyoD)L6v3M3PD||p&E;+2Ij^!}(h`627cjR4T#ySp z6ofNbCs;X$A%>2e-|abT^1G(7sg)O}u&N?i!xmui8;vciqxI8T^-aa%dbtz@|2Q8A zCg=nma0D?p0u($OFunq#Eb!Ekjk4FpoT2P?O%9%rBM+P4fytR5j7dMhVT)iV_@RNP z48LBWJE*&8m+5f$jnZ){J}M<0IV_n^>2}{=3RhfWDB1-6N1Yzi2_PB-uLSS8;f5PN zp-#C?6{KQmloezPYP&S3<Pv7@2kb^b=P*u^e5~ZK$zVg91#Si> zKG(^_VmvCFE-_dcACSinEEoEyuL%X`<{m^dbCBm7>pv( zeyy|qSEw#M##D?0z{ey#rV{`j(daaQ!`t-~+Jzf-ZL@O(7R)6`$M;0f0RBn8aHFm z7v@LguCKzk42SZGXjSoMKqfHb^+`IQfrEx#r<)#-N-1!|E`uuP1MhrEo-)bvq)&37 zZ4%Ax!s@i78>Nmj`HbH#-=P~{bZn)UwKVj`5GWSuSf!G@N0d&WHcLMOaY2E-;o znFl+3vQ<<{Ox^~FTIHc52TukY89nIdC*TNn@No_Rd4e02;;T3Zz+N1_JlNUeQzr1q zb^rd}4}IuEy>EQu8{eTr;MWRQEe0b__N-jF@?EmI!wkv~>_3*Nn(@a{KbJUe)?==p zkWvn&(49Ic45`r?bc4_w9S(G85@4BQgNe=vIM2aH%JB|cZ`U_AkIr4Dmvop-sVVj- zC`4yD;h5Z0kUmoM?h1?AD1y08WROu@HuS3Mo@b|$FaQyG3~cC-oWAW==Z<>{V%Jbu2aL>85I$%*2=|N%YSr-FzLP!HqJ%?}M18_<-z24$D(stP4+ncp)RWaF~f#PC`B_&D|*<;Z7z%f?XT_gri^4axN@Hu}44qL91owUKZeTOS#oIl|*9p(p0 zgtN)auIo26_Np-PB0z@-wGE9u3Q2Ru<)bd92j4JAa{Ja!1TFjuV#8N~O^zUpy0}c? zp9DPcjZd&m9Pm;H0-XuM>tp7DNsddjtZcr;asMYi@rj<-yyi74HOAjAKaP?~(}M~C zCHQ%GY*-V>Ro7j2-9HFd93O}my^nP|AQJ#i;;dJYV%KY5``VAFA#SGwAZv?`q|WqL z4Nnc~e83{*&1!5r*mpj7r?jCfcpI9UN9G=N{IoW6F^ai^`Gb;OFT4J~%_k>=N7 zIar)T%6u`fuC8HZ&hq0nX-Fhp5X{Mm{SZqL{KiOys_^FimFUQmLe30|KgR_v&x1~G zZC+2C=0qXkT^TJVui9mm#AumZroR*4M_ zy?WD6?hA0zXNF}gaM%TA3m<$EsMz}x+`$K&`wu_C4Ng2k3%hpQ51x&Q0X=TRcwN@| z3p{!l=Nj)xMo)YW==E;Pb;A4oS{0leeBw2O$N(d!$>t7y0OT)KJ|M^a(wou&n*gxj zjcEhuo$q|-{imIF+NGM=*0^;lPNhj=wGOP+E5v55UcGvejpZwwMg$s17XaM|CG! z_l)^Rbg7JQQ?YA&UI*g`M%D+VwSh6YPUyh{Ua6WLQy{*H=ph50QJrj}+l>b<@@l$r zdGj@VLx<}!xxiEKgkCz(%@sjJfh1CqYw@QqI&Bl58rzb|6`*7U=o0Ke{j}-Z^@(S( zrJ%N;L=}p_Ba^{^W}l!UK-qx76YPTFF*#twr3XB!LKiwr#_?%I;CgHY0Ke-uJ?Mvy zUk-CvU_3e$utNmVhQINRZ_Hk>V8Mqp5xhY9<1$0hv4w92D?Zlhb#Wj4_{TrK+Fdrk zuzMhq_r-xwJ*Lwe$Pl{j`GGZS)?BJanL|SgnfoAC?$xOqRby?^GXv|rt#Y0*#U+SN zz*d%00U9>}ab{mPeAo5u+S=T+WqoV!&MmEd-8)+c_UvvO(LDoojm^W0jz4|XyrYia ztk05%T~1()B8v{WjNb8EF*pNnBdg$(Ut-@oJg9|-?tUzsG(P+ij~%vD)#-NN^MO~M zLl3admgy#! z!QQ&jp#eKM_Wt9^ztP$zkJTYzAZKQn`W; z9%$N$VS7Z^`x~|N|Bz00zfC@I3pBb&W8w30toUY4$GnCKJ@_%&6DQB;#)5<}P$h59AEBG~0Oxv^N;Tif$E#GRwV`5s# z29N=6DC`tH2#0v;>l;T}W-sWPv9NQ89!TQ7P}CFNxYPw~dpI*%&+H#$7nAU&{X7Y7Hw283=p4O~$s3dohEMM2Qc*Ulg;eK|pQK!+p%`*l!-uUf5+Oc)ZX|lDjc%i)J3^heVW8=m-^XC0@ z-kBHtd*g^s11PzyhKMcSZK45B{i$Q5s4ruQdLjp`;6v8z!vic@lFfa~VAL9q%K#II z_Mi|rY%sAnYW}K}KK0Lk{`23W55WE}@!Q*d;1x{cl8|HR&#U0R@}2K| z=flDci{*d^KgPoe-~*nrN_D>MWiR_{-3as=1$uGebj%lPADm$lShj50T0Q=_U5y03 zs*iL8ger8y)7F`AC@FI5P@Uk>WH3B5z`X!XdNOT5J!~rZ>D{%pW%KWDJz~$6^@oiP z_3I(0Pyw|_`)Ww-<7#whv3>55&sx>7^q5WB)7tB-C5$QqPiTN!0=umC*-ko>;_{83A4?kn?&|oW7<=jBa+{M40dE$$2Z_%6X zm>g+~2wvn#1Q>AOsS~hpw#PLl{b<}I*}z3`Qg%HkP3`SAQoErSJ>avYyglKki3OXs zxQ8C|nxO@qGH^D4a(@2}*mecKxzZPB7O5h(bF^@831tCM~N{|5Q> zxCFm!)jXz81EO%Uq(-38sodJ7OP78|FFl;8v;Qwu1KM;hSsF%UD>5tA>!e_($|HJP z?oRL%=$G0`lIt+`5;14ARV{;5n=Lt~wa)BU@W*&I(M|W0a~OMVo*B+m-sZ-hA!v z6v$Z}^A-!C@wvEUx@NegXXn=Ej^2A)(~Lz&eM4`yE}qXV{H$%F8}vq@X24!pwzv*9TN%Pnsbs#=`M2ba;4Z0MmX z$YK*df|#<#pIy#V*-ixN_#7JSmf&$8kq2iJfX-u$YHQS6vRou}{%bu0{aJlwXto;qR7l$BKpVZH(;>V7p4hV^ z9WS;bp--vW5KXv}Ou~np(`^9gif-tGZ|}%pe?!-%b@ovP3rzP9ru|5)Atk97K=$r# z>)pO-7KZ{lEYMOKmH$MhUr8OmyZe z_QQ99<}W$N+ao%L9@xHhx(-P#8UUL)L_mMbW+{0c7DJ*wGoVg1zv|+gmjA3x7gqz}RvhYV>Ri zuX1nFdoRw^*P=cpJ=2RSTHS20Qa^1Ba3+{v>Wu&YzU;EgenT0Zk7s(^CxEE5t< z;m!?fj~VFgK5Te+aGEB7p{ADB?d|gx-lxl8ew#(x4TKlc43Ao34*#eqIeXmxiMCt%bbN z1an5UY1OJ#D@6J|U(^wfJ%$Y`8V{XWDtb={@aR(tvUOmAGC3mz1GX}lwIg)nk%bB) zp>Y3l`6B_M*j&>dw`WR8%nbXpP(^^Y44|ET-ZSUT`bob_mA6|6q zbAHmX?6`Fb6}8M*<6!sEq++R4SXM;It)e~Uq^ZSOaQN#uD?8r$N{lcEj|C{gv6t33 zFZZdAI)#$hO+!5p>y+DXPxyi1^>UBL70Spyi;)@^zpXpm5uh+?T+8lJp%7n zqjcelwNNn#!ZT1d3Fw&WXx&Ch<3fvpl5+SWL07V+B^~T#Bg2>T0tek-*Q4D9_((Y% zxc$jZp77<~c%A$j>E8TM$ClsS^6Y_Kn-^*A&WyxHBcu&{-}a52>wkOGDFap0WqA5kt3DkH*8E z+hOC&z7n)ieU`gkd@s_T|B6!Zqnd;si*WhTt?~XL z?fAZ9grbd%>GA$~!X^MJ>g{25{`99m{m-YIa>~VOocLg7c{;TA(*S5#y?XTu9wVml zm8=th4bVVFuW#0Q@GywT>A)z%?><1cL8>xnQwH2Ty=@?KBm+^i-%0X%2VP4{UtMzx zFTUHmW6j-%>!jIYU2H@d`m5O>nrrlGv!l8zKC zppWXkfdj2`7H+i{R206NKJ4yi(xjp@%+uPtT4yiV*3{D0zh~>ZnY!#aOG9wqsnCwk~8Jzt5yoEsVy#p6*568&=KJOHv0~Iu6^S z8-TXU4B}I8sHzpoAzC-m*gEsRws}Wz=U*{1dq2~@=%e5TX(06J#fVpTc6P?=k&4~ISSyL$ z_9PrbHRvM>%QWjQ)e?+v4cO%-^f?bL%b_+ondLz%PXy3QwCI<;OP;gxo@p~@+as9@ zVvSq{*?w*c-rD+UZ9NO0`JCHy1z;x+#|-pzP1AyBni=wXh0*ajp=mEKnK3fZr*k*O zA&mHh)`hgbo~FV6z8MyO`_e`1NpN^*sBLIZ*K}QesGZUItabC29eaIEee)hoNQ9@X z?catR63wk`_jLZji?7mx-Inj>BYtY5fAYQnRuU=EQ(1j#0YcExH{L%fkSP9q<3W za%(`^OB<~vHrvy4r%1h?sXl@egv*yNU#s_}^$6xz%uG068MaXX4FaPAesZP63&{$~ zo7!gebw2mSxA*7-+kkExR`5!qke4?m3qNK}1wRZ}*THFs#_4T6T1o6^nKf^Z9mB)J zQAb!Q>gFb^W>zWp5h?ujidv%(dy&SVz*Od;OAX0=0a}?fG!D-_=Hz=@=Nz`VXWPaF znoQb?s;OSG#i>Ga`%%0ZY?TF9^oN3Au(f^Grq=mO9&YTIt7j=}HImv_E|}lZ-t>X@ zLj{l1@z{co$vT3XN=H?|6O?R%bAAhaU#f@hqQSi1Ll*nKvam^my)=`CWKAKHfcEs} zHwN%+&6+hmx|4N>7;zWy_YmLofgQt{!wd;1BqiCsX`6 zC?)`WrLE{&ay>Z2cLu-n_P4)%R3A$Cx@KMcEJj(;sQR@41XrgIj?7o!H+FV*uGKRH z+x7AV>yUh~NZtkxa@dJ7d6ZF|!3hsf%gi}_x+K@H+Xc6qgjB$8^7^rWK$pV^yDiH( zAy(hi%-w(Nt`MtfYMa?x-_T%t14Eb^LDiFjZf~t_BI@FLegv0Tx#m?P{6JH4OP8K* z!YOy7x*}x6rd#hDyBphP_VAcAb!upC8Ejj8^rn`1OSW+@zxl6eO4X0d92jNxbCn6ZrWg zfEtyBwvTbz9-ClyIWrWp*aQy!$S`Rz0r(_f{))%OCA?qy(wBC>@P#itUA!0TCblz# zix`5}Dud6$8!SCT`i9@zb!Fh1Z+`Qed+-?_olNlwP2v0#>O>f)QKE5_@6o4^uKK_S zJ}~<0U;p|`ngm+CQKO+_fFV<-%P?~uc;JBsbxM=>g{Y09~F07H|U84?%Og8Og>; zqC?PbLIaDNX&SU1by*7p!Ib$+-Cy8jQUk$h^t*JBWKWBT;o7#j3wP_C13PylgOZE0!S*t%fZ zmc1kPdiFw2`+B`hWk}youy-Ngs}g%dd@I_-PBbtPSfd(VKShw~E<+yVftQ4Q2D?b1 z%XPyemO?jhp|&^yNKmq|^mcvln)1*MJthJ6woxWWA2}lMquccu96acktl@m+VEu$3 zcwOEb(S0jDZ+OESUaNRP3e)byS4w_{@b&B+a zp92U-BBvecBu{-`_`(;yt=EcOtd8P@5@>#c0hqS8KGiqXXX$dxkyZz4B`#o> zshV4_i@|wpuve3TFP6+Kn+^6Qw7JCK3Os|(X~Bp7q*t1BdU-^*1V1!w#;gq%Qv~i< z-NGLe)6LQ~I#Ks~z2s!GPWst=E2R!Ig zKBQy!1_l57bjTUc^A{%{3R_-ntG7(sq_g?-(@%eof}gYf2W9Zfuc~_+@K1Q6Lug1( zwYp|{!Owp7v&&RI3cU4LrT?HzKr{H@?Afz7XeICv=LIwq$3$m?!*vE6IcOV9*aqfD ziM))jpcz+n9+M3np~uUJnI&BcT(IT-J5CtbvumNIGVn60ow&QeWxLjnd8-#Z^AB!r zo4<4$cLUn!hppHc@f@bt?AiR_>`iyy^!%P(+n=GQ(oK&k)DMk=Kx4~{hvpsi?4QkE ze&Pcf;M|TJB-5w%O(#!XBWE%8`~ayFe0{pTcZqaes6GEHM9c3% zNdpvq(Qry&&HXw|xJ-`$r%Qd{MTT}zrGw9-ta-|frdKMxQg;k~SjSbTszWB71n3Jr zVYQJ*igoAUb`1opt9KAqtf$if{@yi6<5mo_=y{-)p%-Q+i z@0Jei>7JwS6SQhf*6WyBOY!DC(^_Y2nX~+aRc-T+*daW#oTQ7vpZRQqo12Dux2>PK z{r=mI?c3A6aCmT_UE{b>c1QGbl6>OAam?@9mma%bgMY}5{}mv)9>ImKF&n84 z*p;q)5atZ$LdjbhcIkm*~Fh7imw=bD!2D5{bG{j+vNOFz?U=uuhK@Z&v3F z`9u&hSPFPt&H#!I&tYUJoAB6xpq%T7a>`vMbRy0`wLKIsA{iMTuIt{oW_Ewqj<&tS zL-ln{&4Vqo=61C&TE10*%C`=*k|_e;{Xw_sP#$(h^)3UwTB~Vv_qzM%4eZ=JYj|Lw zskTAS0<_QFHEYQ+8+77vcyyp&yFL@OV9De|4|TL43BQAf3OH_@?cj-AtQM$IcE7`B zOyb59cF?bs9`U7*34G~Dx?n&jGSEp8_>?s^*!!p8F4K`kC%n>OwtyAnqdK!cq_h03 zy1C~pUElu`$(|&dL@Z&~#u_>$%lQW$S{u~^KtI$m|KDiOe4b3!USgkxv3t$0h>t3~3Trqe)1FE=lwfwT;Y`D zw{mruU;qFTgh@m}RO)_!f6|+Lu29jQ=XX5WL7(zU9rVtIgLI4y0ZP zP=_s5M@Dd!>&1Yv)qoBIdh~J;-Yu|2FJkCtFet$f56K2s0anEs4+Dpk@x=fSbm&RB z%eY9gljtH$1vdNDc%|QVgVksmj<(wuU)mFAa#mmJP{vV4XBl4wXSPdx7L4d6xqkX2 zE#HB&y}$LbSd$!dbkdihgIuX%?=O0REOZ-9d+%YbBNaPNaIN= ztv|+%CHZK_``FSNz@I{oU8Z`?$Tv3&$R-RIc1(rT2jAQBTGsQ1g+GeB_UA zzWL^lYapDUzG;L;Pt#E)M;ItJ5opP_K_>`Aopn%KU9|RbD^4lJp-?DJae@^n#oe72 zcefzHDJ?}xDMf-i1lQnJ+}(qu5Zqn9yx*NWH#29>KJrI0=giJpdp+y-=sW6G$U{q7SyPGp=ys9{%n#Kn|ZDm8d+M=7@;1j(aq|ATV1Ib0?e1F+mG>~ zr8t(a!RrZ zM#HL}h zHWP~Xc(9B(ZU6?YQ!^n9C-CCaIzZ}glYhA^l1_ER92EYyn-hXn9(fQ7hpC<{KB%9g%FbbV zAjh@G^0SX|*4hMy)iK?_D2-)wB6sxAESWeG`3;vXrHJbsg)n_PAIFBsY5E5~P*fU6 zB_W#dMvgy#v|r@V;u`a7k)H35%$(r>3fy28uM4}f*Ypg@_^fnVDSC0B+qUDNWBQ0= z&1Q?@*LqRFsfTUy;3<(dBKdvEyUBP-`EfgtD*vV8JxtY#Ae)2>TbReV;ed|zm6QI? zlu+M*hJ3$8-ZXj?w+N;_EXaaEEG~1}q~lZ-W9N=_a}nEY`-?yKGT9Pd+5tQ?{ehzG zjb9IochoERfOKxzfmG{2llpJ6y0LT?)WgKchPI|vSh$G_+CTsw4fGGjz&SbE8B9iv zPZn6ef_Hejesq0Gq5kEYy}9C@tLT1t?HWWmu;UdEFpCs{l*JW$;*QL)vHNBOT`e9@ z4`vJtybJr#kBRT<#mqD`MCB(74c+}5gq$0UD0?~STOMB$58QoFBMaF&t3hDUBl$LZ z?AXC!CcEz!HR#IQl9l$O7V!Q$;xyqQ@*^Fkv< zxn9h-(^ogF#+mwega7VDKy9_8W^e>l=>(1Iy1lqljoxwuAmvAi;cvYABZJ@(+Ik)U z!8w`^X9%bID5TirL^Tu3xS_R(*nRs|A%?}wmbM3eL2ANiock7>1Y`Y`LT1lnqPq4- zvm@2YJZTwLe3JK(|NgDXCWYi-8`yS*IorZ^TrE4b@e`dobUiTTM_U-Nqw-P{|GpqLKBMLFrNZ&5gDkY9@Qk z7-LCKu2O50^9ItdnDlp0%B}~IIa8S4(E}b0P+$V9KJZ}P6O+i>$LC2c8mH|ioSXC) z6HkMCG{!%a8`z-d10Q3`xIHDOn^IE5twyA8*4f$TtfY`V`+!LksrE9$S8lU=8yDXO znQoYE$*|9uFKWfH)hSz-dxaf~NC_Jfl%Xd?q8^w}RTXd|1oTM-^T{9YA;q42V1H}V zSz=PiJ|sj#X3gb*1k}Ou$g}4>YyRtzpnFF@=Bzq$B?*vBy`gBDy5jHcCnt}U100tzBqFU842cf%=W zt;M%|Y1(^*$$Ygovq^*JU)W@QNWC8@piCYvey*G(v8 z8MjU-&v_Tq8cwe}aOlB*@i9%KAwM94o>F3weC#4e%&808#F;c?{1n6JU~;+{?V7|t z9b-ZcR<=^Pbq{F6u!)ou^ldn-w zM93`8N113h%|Io%`lyjEB3Fxbto3TiQT=wVvHj9v^**TmcR(Qc9U8uo^+v9(E=>F*QCjcfA5DIb75C*FtHg)a5E4oKQ7Wb-M?X~9vL^GJCyhXOP zh4|^qhiPCyKs-h3$2y^s@163X*{5HJMyd>gQ?+lLk5@u+Y3N@T|=s_L4B<(cx1A^UF-1|-Qa3Aje6HV=t$V3NX1RCWRsjJo=ar)M* zoj1s=yKiw+?AWWHiDL??`!Rk-XCWgX7H6x^!m_Aj3F882HYo~!cbc=RQssz{D8~`V zcD6jRG>*wy7=jP7d`lQScRx#YnU?#Yi@P-OUd>GMXq;Jt(OmVnQd!WK*!sj-E8`4Dx#B{(0*HCo1D5U#ML@5`Ao-8MHo+F z;H>RB;_S;fdVP0?3WZ;p%2E2Xr`Tt)-*?SNfut6*G804`6Y?_@{J(hSa%MNe;wLko z7uo5{&Us&5)Q~;tQ}+`S94iN9&Ucs|pL9r*UCaV!S3pcEGU}K9dD&9QpfbS~?dEpf zeLXsq%HYc~b^R0bY-2g~X{}Qc0+G2gA&qBZ?s%X@LxCc{n z5T+kyVTmyxfH6Kgr)0*>G&kZ|cs9%3w{FW*_D%K?WWC=b^vj6=?)#+i>#8Zi!JirtF_0e?bJrWr-b5gomZ}Bv)j`2 zD+RJ`<_@!NqqF+vLE-LQHv)tYcHs^Luj`6*$1E7$yS+iQx!BsnS`7m-lLSfJGVH@A z{GGEgUD+zLo5wywaOND*42lLV%2+}r(yTuPC@X~+RFt3O2tjCIKA<5oQM@dTfG+BSA#6Rvei(Vn~i zxb^CA%tXfp;nJM0bcbe1l z{%>QKTULof-y|;s8J;c|03Hh)I&9^%>JjQl6hdS(^9`%v#)iy5wFu(NsRO%e?PWn3=5FB z66DsVHj2FH!>m_tTsn|;elAt_36j0R&PlXdKeKb?pt)mP+SU+LfndJ=xQOB~pKfl> zx)Mp%J3a?`j(h_2-jfLl$5Vm4d6?EDe&HDc2s_uoU@#;Y0@Gh z$$AL)laPhi=T|LQA?F@)gjx4id}f3qS4+Dk3EyjO$l_lg;9)oS_}pqcPnBDk7blfO zJHls5LZpnE`pPrj#L)8wDmqgj$*$&`iJVWTgwc}qgQi234_!pTZuNeI(8}Xqd+r+K z+TnCMX0*Lyymo>oKckB>fqOB4vIm>PLo@CrQk%O2a6JJ-u@q<+%vg z=aZx*6lCkPwNKAOu{F+4CRukdVV)DMoBpG~_?1&+vUKjfJGl_MAMvl(m$Jb>mbL&A zOZTJ8E-i<`j62Xgzjy2MFLVS>B>jjIS?xo~IrK&*uHGCTuH{Sn#i8+lZmdWL<<);m zaA#fG&2|o}`Eu|A7wf*jFf8LOgpSN;G+=J;x&(c$G8;@%urpkXwNK6-QOw*;D;Zp- z^8cO!%V2sQ$wiLnM;c@3Le4)&i9+dutXU=*0`96D4v7R2L0k9h&rd(TsH*R(zVZ1g zp!k9&4TZ%%V^D!AmYf6CFVZqd`NN3c?XY=pl#8Z>dXqlK%@SD6rsV_LD4zCxiNTW| zSt8g#VmrXzAkPFsELyT9(0EUTChHysFSHyKD^njoF;vi>g`7d z_}nB7Zw3r(-^iY9b5&ImW|-U&&l*{Tb@dPOtcgrl+~esvl-%`GjqKRPi|YrheWNxs zc}l#J!%Jf=7Ne^UniXT=>T_{l&1{&!v;00JHFf{`Y2CNuel@GqEKn)sV%&(IaZ{Qi$}iJ`#nVJ>|$e>mT2>>1kX(j6LCi~2NN>cpo!w$&Bm zugKfCVD-Pbs;_jogxGVG!!!Ci~PJ8A^bK<{Ju#}@L>nZ!EI zk}D4$R(2#CWy`N{SordBmr5Au?t)Z|VG|f9e}r~sk`FBt#%I_!s*qKw(YZ{ISL)q} zvH@i;<$bL#Wv|#)g|5D3mw%2P#boM6Z?lE9Iulb)HOJ1+O5YA8_E7US>v3U-vciQp zCWIYHm$TDT=k^5mi6AD;9$*+Pl&{7UsrL}8t6OJxM`|-jC8O5ddu6|(&!I)LgrLvW z-52@cp-z;eY$SZHxXP!6#tLg2x3EMQ0)f@CJpH?{wAQd{RcTREvX5m#XNalMw~Ax3 z0!{iE8QTt+`dkYJ9<}a6&~^ufuh1kEff?~N{aEKL?$N+A|shQg8EQ9m@!60sPG6=c{4 zQ%<5#7*R<{B}tV+P;lRKH*JKqSTC09)dHzid9K@^*8u^Ci`OH~dDSLWKd!}Xuhz;Q z=9hx9fXb>o(G*SuGY<8IS|tJ`&#y+(g^!DSh@=8P%ggsWA>2mTQ-(diV)7~*fR)G! z+1ASg?f7jl9xsjY1OmnN!RsFFIlvLdeAUndc8 zrLtUOJsfM=;xl@%zn?BCF1}J?IW;h#P{jNAC*P|KOW<&|BClNB-j2M0@+Mqq{-wV6 z#rMA$C_iFysCUYgeT@w%xcn`Xybg%u_TP8*y zbTMh#jhNMZjq!YzuVKJH&T|UKh227q?G72xE#`J4ubV}UCT$(6M*YqPS$9@~u2;V| zI4?I8H#YjlU@f6R{(1^B*fumY%n>lVN%$>U?%D&kDR;de8AgFimR?f=e&ONaup`o- zXqEy<8ck+~6zC}lSs-68<~x|$uF`KmzJ;4V!NFSV=$|A*k~aU{^6X@#Qx!Yj?ELK= zE}jV?Y7J9cyNZ9liLd4EcsN5)Dexn+f@7XmWP6g@VvFxF8`W;VT{it{1q=wwm+z$G z|C&`~WZO_J8396sB14M&X-pqtM?p=mFmj?DExB-uwfW!gFw%yhh}sxj*bB*ND0Q>X}{!Eb+UGm+G@$& zLWf0H7&n`TYA&}1c7=JrpXhn40}OLLHB%FjX$$`Zz8K=Dbb221ZRa;U@_PEOQ`fz5 z#bemR8O}2mBBlO4fCD&~lka_%@@08}xiD0v3KbF)f*bl9sL>KZtuB7rD<*k6sJ>Pi z7;gn7rzS%s$_W;~_jtf}fE6qZW=eb0q&a9tzl7-8IRk83kB~jn5bikBk_$ONQPwwd zFOiyUeyWp@2j=C|)Ft7dEaGA^Q~rgbm<{adLe={tWCjeO)|K?ZeEeA=ru*SlTS`yP zeCKez?^kdAncI&XFDeZC%ZIsJ4(g2-*Rn6*P>->XF!Z&bch_Ef!EeIxDG6mH)$9@3 z?xHvUh~Pt**R}6_jMU!Rpo;w&DXxlj{E*&Cj2o#;H!eUtwAs{icF(5E;?<42;nmocY9ca;ucrhcrh$?RWSs`gek~Tm< z<7$6*ZZa=?*+*i@+siRv^f$Ed;p=XBzAmJuXNYKDCqLI+Pt!z?QsnLDHyrk8>E(e% zdfRF)9PAQ`{VxleS4EW1_?hR=0?DbL$w0?Zz_pHlfr5b*;`7zU|4Euj@52nK^f-k{h(;>x$+`)aZG#p6~67aN^ zl331*AVkI|{R9r#6=Bo^4>L(^WUS#|8eDAKbiogYR5Yx6c1f{Pc3YQ%h3H~TG5c0D z<_3b0rF6jwVTTacsc@-fuY);;ovsWLg7VTYdTwIBu(0cKXzhOcMos@jb;g?rcNxjs z?d`1G5~Y^dNEZ3Hg~}wRBMeD<{cl$!!aL!j>;oAm(D;OL0qLEfcKa zJ%Q|R%DGW~eq4WkB;PogCUItFPcSEJrus^rmiIhki^#wP?`)SFDX62b(!-?0cdKlb#7}d_@ z5DMrVQY1J%46AAb{3jvtP(`Y=L+-D*(ha4|Ew9wL(nNo`YJ%&Jmm6I}A2n6zVwoLYFXW8%-G&q28pFck)ZX zXH#3z`-55@!zQ;4vAUn`9l<&5)_CASF{fRVt=R%^2QLwUlhVE7bV1nsp3*fCawb;4 zdAi;YQyzF;A zuCBEOKi+|YVWHT;yU?3YAFkjD$k<$v1Sq4qGm-qjQAcH7MhN{iR-(JWeSm2Q)Xuy6 zE)JlM26$(U&CcVw5*P!$r???^t9!+(dl$0ZRtZJXMEP}$$ zM{p&4yije~40ucH{szqJgKW|=BQg#kxM3BXXhg2>9%%yOS;8dQ4U%MNPHyptByTM| zd`4I$skvC`;rRx?=;HsizGhuWd_}`PR3soK@nQW@W63U4U*gs~_A~g6fPKm=CHK2A z2{%}0BC=_?lC~#iN%4eXHe$JJ`NJPURgCyCu-LVWD&F%`a%CVK8%8YCTr;AMc+T3x zWtc}*>NutDa8DdlH?Pz;HHXC2BI)rDyf8$zF2Ttq)q&GtX5g&RSj13 zT9Qq`KHC!_OC7dBqKcJNPi>Ih@Tc;|P8EmMflov_iJyWh=q)xYME!yBBXs*P@~tYy z^*%h`_)@J~`1!8#`7SzjLH+uphK{=#56|MCG1;OEq~<8_GvYtQ!CwMuA(H~~XME?u zMVan6@PPFXk)p?XBD);NUC3Mf1V{=&lF^b=w&OSDH3^z>VvmCgsWL1<_~5(QL(E6^in3 zTt8AAHYgq|f|o0^_-zUM)js!PJL2)aVY}H1=bBQC82j2LkbnEhe*3$hn&ZnNprsWl z=vVCgYtA3JdrZ`km*PCe;JABiO<)O^!f#trhECg%TK=9)D@8HE$rvVXJoJ390cx7)#2c4>Kw#UW8a& z(mUb&$e`!>CgV8xy2W)0TW~F({4*7YB(2&(E}$f@jQ`AQRSj~JUOy$}v+y|@q6;>qCj?-3dVLli;c5g%sFF_GE+A8ln(KEWQUfQs! zAZ-Wa?w6?7Z~pS^&u#}W(`PXy;Arq5PJVKK-gUD_uPLYTy`0tWP~~{8bhymy+1mtv zS4+f+M~LqwU<;i1B4pOs!OD{Pv%%Ctb(`mg5FO!AQM)N@X)r^R2kZZQZISU!8a-Mf z!qry6blWqmGk3-IRcsvH>JVf&JsP{jh8q_RsZ+SEr^_1FaWmFS_2nwA#1p-klbzRyOXvkCVLHZK)eQ)@H3vu?c&qC7Hyg zhVUY}ALKvZn;TYB`;#fOl=pSfAry+*M@SNC6U<9;pp}K`oB8(J#A>|#17feLw`0|f zqA5e8B$K=Vlzz*iqnGZSyKa|03N4{*&~(odH6m{9^ih&!7pAbv5O8+`1$PT7x8&0_ zQSeE)6a~vX)&ct4Ux^{+Jjo|hY%xX=SW48NeN&95K-G1DD#1H_(q>>+KD{wvp(Si91qSq^QpS=*Gg6G=3p)L7-l}_x9%>u>_O)8D=3n~_ z^Iw>5MYC16T~a$pWZhlD?y)jeS#cMHkl8j|gBGH{b3=q^JEtbUE+un6Tdd0Le3d0T z2z(EhyOM-w&h<;vH{*m5LPKrgVaI7~S<=}SHH@ET@bl=yEW4De`?tyPIVkRK&{n;P ze#W&k6!ko$WKHzLFj4_dMI^Ov^1dJDDxy%LEzmh;r;l$>A{+e5)&Hok)!9$a0tB06 z{8TV@HKffdt836k&q%c!5d6aHf#>pX+rjv#z`{(pdHM6SOozd6!gb5Ta>wKH@Fn@` zc=3jLqOH(S*?VknB2avuTQ_#22^hXs?;* zF$NXyL|kaC4V4|`cd%~=&irmH7+m-{Jp@;5#b4uKWfw;%5! z!dQ~~FIGA$A4b<7M&t8gmCWi2*O8nr#a3P{4xR?))e_GPd_+exl3!&XNI(Q+)Xp93d8mW*JY zQwK;Is9G;@d{X-nxtrXxi>p}QF7*Mmk#=NKzzdQ ztZ;^r7h2|(Re}DP*lzQ1t>kN+U%o~X_&%zxlLzo@k0Mxg`=}4P)MqXE{G>x0O5}Od zb`zNQ#!=wH>tZBR;y#WE=|dYVG19YB2AS-d&2j44d!Olx;%V^!iZW*2wC-#uib+D< zb%+X8KOxU;-3O4QM!a$sBk0rldydNjsIU!ZvoPKk8OXOk!?O{~A0N!i411?eE-vIc8pQWtdyA=l?`PWx+_4)N>-$iH;!Q_>wV?_RdHO zj}Y_D?H$JDY8pyI>8bz2xSp5J1bUwIfTa*I^;>LnYBa1taZtDa#xiVhCC(vppkFQt zo!A}r??HO~y~QGX+JMFKMYsv=t5jZ#aHS0Vzq@bmB9lT7{94c)gGmx?vh&n&o{%hg z^BUbtilM1eTbbW>Z~WRSh)h__RX<%oeF&Sv#>{qpx5=wZJzm8B=fQaM+iEiAG4bL1 z+Zpn+zD+N!MKCbpd=+|p?=pJyV)k9+k0Osr(E}4xKCufiVB@|)o@a3InbM1})p7Oj z<_0_hk|GOI5pKK%;?Ia}(>cqPbFaLG{nCw2BJf(347kW(t3XrL-T6c98QNbIf+xd_ zlt_7`YZdEE%izx_Y%In;cdGY56}$tq2}b&p5lQF(;`Lm(to7=f%$ygI!&%5xqedmy z4Zjvt#Dee(=0?S$I8a^-Mh5ALr-KE@?Itb{yKC)L1L2GpvY1Mnx6=etc0D%DQ_7R07=%wVW zv&yu#&s430#ws8VpxrsF;c$4nN7hyHBG-pS?u^$FF3@jzqltwi*5cpmV|;NQU^IX#b~6Zr&$Y7cj|(5i!)vtvZtEw4)L4`G2-+uWf?pzpSk|Am_4X8 znl1?{(JCdF!72tB7rfms>oC`^Zqk{vO^-G%e(>GuFfWPn9?Lk6S|R52;2av|G-18(5^fOwg7aLp)@6F;sU+O9VU%)BcX_tGz*89;NE=Qo+kXhC zC_6rB-{v~?Tl1yoSc!Naepq!6)$~nr3H(nCvjaN823gS4O3O>Oti9k1 zmJUd%{Lt2QZ6lFzDt$PoR;2w^y)55a;hYJn7x+x@5Kw=(-s@w&8SESKmsf(|X~Uaq zzi`#8`Ei?z$vBRdhO*AK-c3a557Bz3wl zof&P(9xKSuMycMzv-x>9Cr>z2%I_)dcj51iM5^`SsxAzfgJjgPbIUKPzh&>bCnuLS zxo11!;f1u_lrs*Evf)0Fl0U0|iZQArpbGa@C5z1nn{(359DUa>8J~!(wVb`Z{j^zC z<)`UTP<1q$KP3moHt#A`rTqg49R6h-*9sbXWW9{L7@J)6@-bMcr95&vT5)$cF5%!_ z4MwB|Xt=T0-Of zx1Fiit|l_s0*2DcH^nfPoM+J{^9-TDr&!&u41md`e{d6`j3m6IjxFFTG z+sWY^=7JONc?*sJEds2U>Pu~P-UzNry5LK)G(W7_7y|WobJXZYnoD*y#W%Nkt`^Jb3rs!rLsWzkM0Y#6JeshpGc;oH`DbC7=$$1z3H}X$DSZTK-K=#-Y*AZQ!rvMXm;ANNDXjl&Lib^%Tx;T zXSCcCs=XekySbY*mpWQQzcyQ5UJp8m%jTNcfm9ZGHK?OlCj_IKHv&etjdw=?sltHGXGNL-ks*{*5)-hVUX_$I- z6nFCT*DEM`$qUdPNjp@lI1;h1&;Y-nUz}=+MnOu&?>a(}b>zmU< zo=I5Gv_rLFyhdNJuj-tB)!)tg2p*=@71sQ-!!o#$cCf;A;DRQG=|v05I{v=erD$LW zgikPQl*Z~P8K*UJ(m2pMG{%Jo{-IS#!Bt#J!ysH=tV<%&i9PMIhi`Z!VO<@xU$rC7 zP}BW61B)+_q4|>8Qbn0=PqIZRBg<=yFMHZNy(5!)k2>(SHu+(;+`SlK*v*?`#XXo$ zTqrj-Z+BJQQZ{>eYWF6|zFJkdNo)?Hm^bHx4sUGNM%PfqR0WxLj0Wq4qG)aRZc%*x zoDs*d9Z8^|g%&>g@SNik!J!p^E=H_h|3$)l!wm)1`g zaKOK0W7J<@BUekM|F-alaIWW=?sp2FryRPY#oQMWSC(WmqRF&wrbJp~6f40KSK)bA z*T?2oQagt6(Kf%1%Pv)EU8w%8EZ9jD&~bBHhqGOFCtRxcebB0i^O}XSjJl?+7jUeN z{dlk6<^3aDj&@8h21+Vd5>gbS(2@|BbEY9Tk9N_ZEYzg^J_%p4(93kxtO9Vd&OQ?0 zWF1zy`t#AF+N;DSvHP746_PYT0y(f%ihEHI@yQ^N)ES^!5Sshq2)>j#l&SbL-rHdb zA(h~z;l7;K=*?Zs^%`~*;`F!d_DsIspu#z;t_}US;dlTFi$Iv!?(`*c-Gjd>TCqqL zl+NOsmZxZ(10f2k<}r{n%avS-{Y zmiXEk-azMr|C2YCt$f$PO#v;rr50+Rn`0T&XTSMf8rDwV8^?2#J`l*q4$b z469lhaUT6B!maPnFX1A+6H~3zb%$9rdQMpf`%Wk? zPJ+F`3Klaen(sW9UOgyi<&;eP2iS_?ZeXHMp5Nx+i?X%%+mVa?YMs3ASt6T*JnsdI zYm@470iK-pD$Z$3Jr+e3*vjE>`|xQ(oPc6!RsL8=g|+Y5=%KLrZ0;#!HC+AUThsYJ zxywQE`_v>L$oG-;q!?*W&N5b>4pp>?=1(;~hfCvj^Cv<h<3tgqS_SWsN8 z95&{I59bRX_dA~U>w$0fpY5(1zmasf!S&?`-9XR(Rc%9EY`q<+mxsPFzKs*vm0bh8 zd|oO$oHaIfHTAIA?L@UWnZznVak!+-tK&#z;9_D%iaqQZQWuU zmb9VLeru|#cBUG_G#RG;9Mpgh#w(*!wnbY>AwRnDD|(xs`DRbcLnN?<-TUZuqRpAg z%L%N$0KM-*kO_T)0AA`kwA{__c|*cvw^z;X&cJMPm_OQPueU^eqUx#kY6s*jJsrla z#+t@4s){~}4xg_GI!sEw8p;$w>?~*Mb@i9hkyISEdU)>tQ*)G3{dg7$+SF5$wQ%qqQX%NSPidR+d7TsA+EIsMoLYkV^LTo5byTqq zJ5z)jU=|lEUk>UQd{uF_Wekmg z;>(;ZFKmlUZw#s+rvW=4kFBBq;|@GBghYEUTEwiaA6% zaChjpgGP5~k1LCFgP~xVPQi5G-WjL&)2A}2KT!qJQ+cZkt3&s)(r>}gT{N-VuC zwh#3s;N+towc6QLXR_!{80TdJV)CnzGRR)x+(9!YtZJ_mq%{4qh3vf+EgRxa(f_U- zA@1pxRk3r>p#S&VWfvFX_x=cVlxx$+`L6uZH&> z&-b+-?{|-ce=XKtx^15NVwm{)faOIL+8(d6k#m{v?_-lXSHE>Mu0sEZjON0fZn{kZ7e{wm8`LA#7L(!BTE|(CJQFzszoKh7}as7|S^<3FY4i_SCxsS_gV| z1YS^9RnxH+jm~N5G&fdF!$x8MUYq?>;hb#>+=cK;G$q^xnG~0pJcJr zByI>HsSM)r7zxeNFE=;^O?d{}MlD3>#z>SNJWrjz_WJx)0I>T4E0Rb&2`t3tyq!50 zpmsogls?+bNPN}tlr`;OJ2%#>TFfP9i+3cpYjR% zPPgW-0x+5AHl@DEC(&zQFZZ-=+$f3YbxPL0r=8%(3>4_`vDzi`3Q(=L3;zwJq5e2+ zKx<<`Butc!0f%L`e%pG#AT*G_$lCF@j6YLCB%4pL`i?_L#ncOuG4H(=hZvovhv4r5 z`uvzWZT{p$HXcDQGajAqn_pOY4}5&HEW}vMV11a8rUR0ih=aw$_k;cLZtr|nzXexa z93x|a>vnWgG95~g*5}qusUpeAs+`=k3&64W^{Vf>dC3<@cuY#>xiKw*USF4JmpW*D z4xPhMkl3`)|s#mA?T^h>adEmqv~Fo3jD7E~8}-zb zAfKm7HA)t7>em(;LYutrKe$eYnC6n-^G-^<{H5qVz678yzBflw4-6OpVPyKZSE(*m+TuKUOzs9ge ziL=2DD$uEDA_?EDQO^i!@QB-c^Kqfc&vMv*d90<@T4{K1n^2=r@NPXo-v06APWV{d z#@5leu>w7E*4#kz=iNNF#YeJrXXu9;5>=sqDyC4)oboYF9&><~%E0r5xe zR-6ZM=HNGED3POkMI{JJB=lPFE^uC6ps6VO?5>k#pL_szJcWPHwfb*48?T7*1PpBW zkcQ<$Kz_Aq{yltV|@|Sl;Ga5HOhJ zzcb~6|CX#J^}_F(hN26V34N!C&jsb5M^`*0+Y*i+AX6c3VNfu_W}f3m!sBGX(R!9{m2 zFDxPrc1tXe$>-XpYJp*|06vQ0P;pzoF`vl?yoYy$*1zRWv25^17v4|sS=`-_EX~}1 zznz_4(@quUb=5Cu_UII+J!H+NDJ#8N`#IhChQ>~8BJeV;Y#uRpng=&a|5!ee6G$g# z1cE&OiuMur+I*UNdQ~s_*rm2{5)Z}{D&{c#PBq8u*0`qi_-I9nGCur`Gjz45{6C#@ z9_Y#zbmfV|>@9cY|3WGew^R9=6?Dd$QbroAA1U=ysX9&56hkuE#$MOu7@6L86hY=* zAw5ulHm?%~NK7Pq*;JRqJP;*I+S->m$C^C_8&?y|F3RkTc8NJ;h&Sf*9P(z(MvCt& z79*HSrat&*d;A+nRrl5d_@+lM>iQoCE>SBfIM@n-n@Rn9G*kc}JLRRohk?_8e+?t6 zc9N&%B+^PO%4&YBLRn2(`cv56SN6fh73EuojF<6uOm^9N7gb{>rYfdR5eMc`sl>nP zZ0Eg^udPMdh0`!$1=`PpcSBH+gfS9QrJK2mnnSEyBS;X!1?8wU09cwVZC{lUra4Z!YMB3SY5#$`o%FCOYgeT=p>$nhv}Sj@XboDw;Z zHuVxnuAiPuqH4GS7FyOHk7|RF#yIWfWwVH!iRzump&G(myrb#cC(ypq{wG~-atiF+ z?SyLCi$7|1nm$_7`FlS`g)?WQrjDgvCJI(WBw3V2a~~1V&U>v4l@yeiSmmPklgEgc z@$&r3Fc*6cWs;8z%(rerR#bjEv!|{65fXR47lrIRz>1eN0}^>eJ`U}6vm^Y^mztS& zDnxS-5%dVrYo`#L?_;Z?Q_bpPiRosVL4Dfd=po`mc;4_r%aRHQsv9uS-*Z84C%i}>M zA~huXa^&%=DVDZqaz*JFo!MOb!M^-V+(M-(iR|lh&Gq+Pvy?#vwGdBO#y`(?u@-@Q z7E`)I{&F9L9gP}QX5HPwVt+8u@VTbQ4V~s1GYIRj!oJ0*($IZ$C@z&YewXA62}JU9 zQ5SonqugrG>JEg?u&t@1Xr1nj7Wg%f=VXSU2^`b>UpK4`s_+NLH{h8(rk0S&aY4f!nU@eaBHQ>eSRQ;SEgjmzQq$BEdY?|cqXMIxhOx4aI8T3_M<59h@^x0|arietRGAopP#FZ9l4z*U=j zX#;|%v9~4RMMs&)rLulUz+Cx!Sx4&+JqNDFxDnd4<+eHyf)LBi;8A<_y}d-XmZ3;p z)y~-&oT$Ri_;hCNU)v#ctaEn1w4t|cZ(#W%Y9nFp;Y}7(Ccs)wy=Zi*2hflGg~>n9 z@kOiN&Xam1`SMceS+26NJv^&?wby>lNTavgb7QFGDl zH(LGjObJh)c_?E4=)n1~z7c6n>xIvGWY`*X+WS+_~*_TUx?c?p^ZI|XUwbg#db$Z*v9k5yB-NPR(nk+l7=6lk2TK9re z6)f)Ub~>>s59DYoyNvCuKCRxgV2*JBdNuh!#$8fK)m`NL7@p@`uLtb~o5?lqv^ zNWKO*a8N#8t6hzDWo<{Fq|MSFuCa#-xohM$YrS#jo4TIOC?5`>u`lg>FF>%n_k&BA zF7NsZ2`!*Z#>IkCs+NUtza*s71Z)oWI7a)@7t`A1@C)HB&Hb)J7jb)-IK4LjCt5~E zWd^I{Ck89gv&H|i6&gJNIj=j;@9X{fO=0?RV!f(;HHXk>L(pQIjm|rjXiq^GtDO6Z zmX$KVg!r^I)}7ceDy zt(jgG04@i=>`>oOF9Dh^Av;3fIpzkfrX&5A5C0zk#y~m0`m)e(OKt!hFrVx2yi5RT zVSeEke&N^kDk)!D;Y&VV5tNg(2QH@kSX-!vLdDW42+G<3@S5@1cqS1V5kc${^nQKi z!ODZL(1pP4dHB?7P*T@6EKL?YKQr<(kM%d}?LT!BXE%yjz4@&NJ&IhHqH3Bn_*ZG0x?OF+;E&}bi48qMJc$Q? zTocSh%*m#w)qj(oi1XDS8Urk@w(gH;K$p5(x|?-SXK9(Vy|I-P85^kbEw26yT=Izz zR`#A2?JH($;+SRif?eormKdN6elQG^G&@cLI0L1D%1J#Zbm>Pcu_>a&@xasyyeOQ|{S#^4^p8c2DjWbT+XdhTq`Ij`cka?2>i>Bac4%=vQ@T zWVRN)cZknV)ma@YO;vn$z#fCCALsm8 zRp7hDm`-C*z+9k0Ms!hXg-#Rh36+44)Rk2h>4L*#Qo68Bj&<$+%KeAyEwg#_3CXCH zvcax&7T6I;T6g#Kmdos|Cs$A2rE}IXm=Z3s{cOYt$4 zKs}%GLmGZ&IOqmFBG)e*3}AFY-)Y=s#mX`JY({mp#|`N zY`~PR2<_ju|I!~H`{PA3*UYp&gB=g>Qg7_^~gWecJqipPdk-&*s8XYYxJ{Rcj)|y zZBV>lE+@TXd587b=+4i_!YJKcyZbba@ocvf`%F^ofY4rUKXA^-Igji7o~w-$!q3|~ zgnV7+4_SFAGOPrJ=)iJxsgw;Rg zm3o_dn_u1X?2R@`SB zH8|}B(5;~v|M{Q)`DZHJDRe;CI=sPRT9vbD@#4jIXm#43t|rK;67mBQ9IO1InDs#2 zqO`uee&)8?wj-6!%1T3~K@9Xcf1FmHwsZN&@~5<|k1JUb_OnT&gQR%*e99|Iqpl9t zuEBq}>TITD2=!&mXjV?u^{$=70!`ElGd25PhbIiflK!wJ>?d_0 zky8n~br*C@9x=+Jm~Hw}uCUj6dcdYI=<6z*7ew+Ek-3BVhN5-L>AJoC)= zsbgKC!r6U1(X4_LTSr1j7o&FY{XRYDvz5vUGDQO)-A2dgBq3zZsqd)Xahk5EXD5Ey zV8`5O07+VtN|W|29a*|oFZ%G*-zZLFTaA2(bk)N_ap*YSdFYG^QQy;fdgv^sr#j^$ z9rLsUI2vUI>rh#;{y#Vxu&n-jQw&L&P0_fGI7Qq4WymTNV!`9kx&K<>tyelNr=>-+ z;C+GE07nPPm~x75Mv;@U5BxYG1b)=>x(oG(ngt988du}Zu; z!tL`G&AY4AtJjQKB#QfrT@2Khn~vLD-F))q=FJ`9LZHUFw zbbafeH8Jq;6#=H#Gd?m2@I8e$TzTb{zbYQ}8S8`evl$Hh*#yjE>Hg+9>QuiiI)fj! z)rMj+mR7}dt5P0bvSi6B$+pvgfmak$8Ahj)k@LLksQtLBTi#XKHEBa_!?Ci29M-bf zGWwTQJB{5mr7~srd4uO|;`Sch+oUu9p0_mR@iL|Mot72bc0-iF?)$5wRP@H*0$sG5 zFFB+0uOQg1G=0PVaqYAYsH58UA56!GrVEL))dt5l!V=xujTKCTf2~$DZX;$BY*t@p z8nF~xM61V8h64BMNz#|74P?iu696YY96!Wyl@BQz%!O51j*2=C@>=CcA_>Iy{#pt@2lOrGCCv|06Sq zf-+_}R(7rYt2FrcN{@WRMi(qSLoijV|H)ZY*J@uFY9fUSp!@$!C#M~ zz0`K2v~*L9v|cO?b~ILyz`n|4E3)E39c(aIIrJPs^LeYz+qvMd1viFoGc>~2%Lw|F z&}!f5Yi6!FxpP&gYR>L9ct51P<~!SeO^(<$8g63imwxG&I`uBVzvKZ)gqes$s$jSy;nW&!#^dw)CzTwxps||AacVGIhs!L+5SK z*Ma<&7`}};FqRKRa!y0m)A$+=D+Kh!Z|cirp`pg%w47{|lWdLEU-z09N>*Z7os!4} z!_=ztuqFWi^taI@XL!o6{hy)9#BU=)FA7H2;9se>drIxVxxZmZxGr}8VF&+;@Cs?J zlg2IxjYDCKJ+}$dZF!(K@MhSWj$CR7#^-O(R-a^SQt zUiHOe=Iom@47TBfQvlN7<0rO!B7m-Q{PNXTUp=Dw{*vnOzmQSjU)G2j!8`ZTi!Qq8 zgTi=DzAN~wP5_}G6sF~^Z++`)lz$hQ5UiAGS}W3%deZM;7(Spm{@e!z^v*CnMA_2&sLzy;tA;-#VvhP9GoKl&sc~9D-!R~gWO#^Zi>})Y3WJHbP(IMjZwVYy?B#d;#OE)ih#2CVGZ zfECT^4>s7kIMpV+X{k*>bAeTn9gIKXzy!ZXI7$AE}`zp7lXRnx~I=rrI$+++t~Dp zKw7cjsL(4vE6Mz>=@vMt4 zzWDvBfJN?-^Fm(bDK+W*=RRHaU#G#}Orwa$VcUArY7nPc?0J_h$OCV`bEk8%CcRhg zubmbT4fTzd!Iq%~y zzSAnF-IuL*#vPpmbV{Zlk?cL8bi$LY{`%lU;Z_!GX~s#&ZKSc=53*y*kjj$IAnOL8 zLBLDOtL)hN2sGz0Dj3{rwHj|E4Um}LQAu;Pexpvc>}^VA-9K2C#wKbEG7avnI=8p) zECwv(EWp>XO`Ub6I%?hOFAQWHJH@p!fgfbX$mR7sk9~Y|{}O#LEP%`5S(jHH^~fWG zK4n10Cxe`fDe>VLy-?J2!p;-+9X0c)&l`3&N-&hwtzKc)D;xbY4x4e~&prHeD>pCP zoV{a`8IIfk6rUmClZ?~x37U3i%^KY6bWPyjbt*<%j@mK@tZw;D##TKb^kL~8laZhK zf8X{VG7^QrUv;vXdW7+pbRp@j&_alCuRu%EV5Z z(>0l_Ek`laygQueStm?n#EQC}jwq`}y)bNjvOI6QJXU7eg)nCV#Dr(dOutas{S z>w$oSE&<;N9$Q)~*pMcS-P*wosYA{bmc1oNd&eAO2t=w>U2XMS`6q&-v)jd zcyT~Rp$3UmSJ)V1mP)0m^E}P)b8=?iY5ABs5-s95Up=g(kFeGj_AlJFW!{#Z`T^0S z^d6T)q9SaTMvt z|Dz99sPs`rgH({0c%1m6qrC>@-IcFYoTp(nK&xvK37V z2Q={cNXH&JSPsMWiPJP#HBBV^?Dt`s1g1#0MOfXseYjIt41O<9Uf1&zjj5w?Wo3v# zk-pJ4uDtLlDE^roG3AC%8Z1I8gAW8^@lDS7O6j97)$Tprt=~HDTgUHd*)wlsV5Gfy zQuF>J_8hV4!j%`UTQIPoSFauGvVT?%$I)P~YM`4Pa2XHU0a#2v*tfEg*Mw{K_5KAv zax-7QCiDT(E(b$=D}Z7GK63rwsdv8fo!2S+Z$>`!|0(#>MxoxQ;IDn{Ye)Xezx>M| zsS~~<=X5N9D&T+y|97=z-4P67J3ZXK)5yDjjcBP%OyiS$GhN=T)fasE6}VD=Q-5RevUO>wg5>57#%RKo64nW_@1{o(XFHB<;bgJ*abn=KfS!H ziFi5ZkIpo-(Df zjnZJ`Ws7J<`pC(y%#GR)SaE=(=lH2#=rVv^w=!I*9A4)WbY8;6p4+QF_kJZ-I@Am=UhqaXd~QoZZ^CUrUnUh0fH%~k*V zb*{s$4$AMR9+58~PZP&9HY8t1bMv{Ftmy@LWAiC0{g$8VQhirludk_3U+z$XZa8Yk zGDaA+7ikkr$kn(yPEe&z43E6r#!xxx1jvN?AXz7`PDHPzUTsI9odD;hf*5TN%NT^! zDHsIDaajsc(JI4W_fFg*Y#YSjCBZXwe!GuJ?AVEFOxEdwPd&m#Uv|0nVErm+xXpZD zGj`CoKI8VqV6fNG$U{fo`i3%;(QSHp`9YJl$FJ?s6@R|ZQr+FWyG_>#%tvkDYkYEC z`i75g&^KF7*MPM=#@tr0Zyg32dDS`BVTN_A*s){BKWRtsJ2;sJ{KYr%uGXo-9pZf< zV5MRcPLJ9CPE->|2%r1h=a#Nqx$;9GoqM0dSsJ;u$%SGhN~PMja=J@o;3g45i8qk$co#rY;& zBp+;8XADBNoA720whb@Q2e&Q+n}*}IJ(i&R;c?V;d}Ihg2YYse!Q*;q3*8qkPmQuhX`Q zzQi=3X9K=2nfu+0VxJU|ujyLNH0=_u{@cI(+mnz1^H2hvZvAej5t_6kXe2Cq4 zzJH9-mMQC3!LIAM{W1E;hhPcpDR1&2O{Myxq-2zLJ&)0e_{cFp!(fd{&;q{6qLU78 z@+QzgA6fizIb=!uB!FEGT?gRJ!7iOHe@cA2&?nL82RfWuXxv?*N#ONvGsT5Ak#I;8 zfCInhJ@2_lANRaUD?EkriiRDhBV9OJtJ{80sql!zP9_;^ERR)i3u)fd`503iDLtQu zm$MgbV<^=PvSVm@nep-&WPO?P@;SRUxKf$4TrMk`MCx%9p4S611j;}#dfq3nTo)OW z%>JcmD6UVO4$6boQG~>{+f$6$adnXi$|f7~(6R~`s~>H7A`=;14Z%oo5v$9KS2uv+ zBb4d{3@Z!rAsCMHoT%8#VDivY8EysQBRG!5q(ER2utfHc>n$UvpMLu7S~zc!jvJ13 zA^n=hU5maT^t1X^tyd+wPb>MfCjcDxiq?lCUau?0XR!J!cmZ(I(wfEkmMmHFW9d*~ z+_!cacappv$as1JF@DDZ9po)vgcIyWe0)i5I6qHMWe%1uvRj}dQdVAUqLb5${2bkU zPyCE>Bow@Cp0*ea1?z+^BO2}J@*X4a0h)EtOe|vKtIHfLwsK)7*oz&$kz!&i4iaRO zGUPGLclaDBE?BiN7p0X;7WcLVrx^EtX6@Fru9`eecr`Nu#wr118)zx{IkitqWl zMTEXP6$>e+hxH-EmAat8>!-+AgNbf2`7}*l6&(j=nszyr-TBxVgBNU=jO(~vj{{xV z%pY(#8p*rd!D82Uzs8eyo5-kctQ_O%CD>9K^}8sIfC88VFI%jyKr?0oo5qt((@Emk zZeSebuzry07THQ@X4C(P9tR{cgv6eUSqv*<$NpsWpywCeT;Ke10PmNJ&uGUSoxg1Y2t`hxaKjj{g{nNw&lD@g)B z#?qwsZeI1KH@)csqdd)jHZmuwgOj1MQMp=InqR@Wh=Mt;IGZ+=PyxF2Q(pH=r|$cD zp>n)I1gFww`f)Ij_krQOAm^1E`JvJxP97h9(QHz1UXjgo!f~4ujlnI#PW4k6FI%8d zr?ET%$7t@SXqHd$#8WmKh@^v_*QN1XAGrdVz&7R>eCfnG3%X!VIJiC6CC-P0=6+l3 zbwKR;==y+F(&g$Psiy*-5p%j@^xP(lfMc=K6I$IQ;PNhqzsat_*!+W@P6E)#hyF{} z?0MepiQFQ*Pij)y7HE{+XCY1%*ae)aodUl&Y<3b|NaKd5H33iv!ey6Tc7<+JET^Cf z?hI)YP-PG3w%;SVQaKQ4nWFh;AmnY(sKD0I$cMrkFHNgJW8MZtp5TMY<&%8Gbsy*i z!iqZ$(vAa`%cU`N4=FuO2fkg543!_Tifp*ADK2{C@lg?-!#V^s+49xF_~aFg75EnA zY^VBO&QV3_gTaB1LD%@6#xy*);qnuW!9f>{ypG#2gSmfFfnq)d+a{6M2|UNILjeOm zw$XE4=uSfcI(5zw+Qo2?%ME0svpY~QOe5%DUf*p6J60I5z$^;xgWpC^Wzf;jjP2G+ z|L?NH6P<(022)S4A{{Z=y@9X zM)aIrGb4F|cRg^9bqGO1i1%JIEEBH!x|>_`j=+8}Qe zd-xUF(#j1DIcVT{2)dq)vFoB2P9;pwbyGbi1=4_J;tK7^EJ#K4Q#ZcB9cWwdoMIEv+% z7B`}Mxq>gQ19rBA*86Js*v1dn2^cYtEq$S9s(wi23^ni^$ud!ms6%Yl`xLxTwOhKt zc%2xozh>m};9RNa4K(@zOcC++rK zM>Ye=DOoJK6D%PioW^#(UGjX_v$88=b&4*S;83s7sb{4l9(-uOiRu?pwT27S7urW92MMm6;!^_9K-X7Ci1Rlx?p&~UeHl;)W@8R>E~&oQ6tau zZa0sY_-5vj7foWL*E?K>@(?sor>fEcO$tlauU~(@wtb7#5&1Dr z#0?8Pf@sze$&=>!eqmjr_XUoZ9evQs>bgY}%MrSm`x@O&Izx8tc8&oF&oMlPKGEPh z9=o3MvCc%ZbfCG2#aaP^m-{K^7pKSJfjywlTIGI4hR z0=zV&vYt+HUB`KfBVIy_knokUiNyJyFTjev=Xg>bEhlN`;~PgB++XTX1AC?#bAk9^ z5U6j@Slw&JpR3&fuk9Ky;9&%L^9h;;_Y7ez7R^uj#$aiOFjLQ#`vhQZ4vzHGiZ<-T zC+rl4RM-6qg6>zLp36wz>PLAhDf$bRXt3+_$p@M-oUgcW0sduTz3SVig4YcknL;)m(ofUA>_u8CTa=a$ z7T`IS2+EGyAgvJnkX%gX<`P(yGjrxU6l4@hQ6c2h*m(X=7$yf6=`=u7o}(zZ?>?}s91^UP&s?xNix}8p;KK6* zJ<*~JlLfQ}KA9XVI(%U$%6v~__!x1TgZrdG9-i+4xEQFNMCIn2Z+=R5*Z6s{{rD#t zuNcEpcACcN&q{qN{DTGWV1;s{*iB8BUw-*p1iUbSy3wd72lwe?A8XZ#8m|5lwnh_% z#h#a))Kl1zpQc@&7#$sPP(^Nc&VfCRrJWpG!UBV=tJ02~%w{;mjRv*L~uoucxJ-mRL`-% zCmkkm7>M&zyQDcBKRtEu3FX&+{nz<*;s4SuU@aIf8_I4EK4~|%NVn>L-s>Z^ z;WUrEQ+U2EPQf*>-=+fRSAXOsR^m6}w(E7@y^=ZT1R#gJp$lX2;~-1Z*y1SAA0v-b zE}xGZ@d|LqU?4LQIc%nO4x%G*ldox#ZPSl)EK;6&95c}(s9B^gOQ^%u)3q(%_{KLL(|Eg2ePu9$XUc{pea7i8I38Gy!nhNFD_wZu zh06tcqJWT3dw`{N(Ql7#C2f$=I1nX=)iDPJ&eJIbAy3ce6PdgniPqaHvg0yEeg^D3 zZbP3EUmD6Z@FDe;Gyx2o0k~DC^Zz5sD;PaX*8MlSULD<`(=NXF6DM74DwwbaeyeWT z9-n9y;hDUyJnz%nXB(w&pA?gh4G51LlsADMO$vjI>7z$J(2Nc*9BH1k56~ztJ;NDC zKk67jz?NAbIOaO}G=S^*M7C}~LT4}{hkbOEcQwNYJn_wVDK>-HbzF`(mo^*NW0J_r zdmeD5OJ|&MMpdT)KhU^)9C?MhF)19r=WvSTPJ=mKFzq4%cMzTm@ryES=a4B~EOVTW zsM~`()Zw_u1Z})y%peoyc=C}qQ90}r+z;tRn ztF2p`2LC+OH4o^djf$)XqpMANwF>N1N9Yf}`#|skSJqvE!-dK3BTyGbcupHo8$P8S zzyYvyn45~NBBNpD#|hZ5Kv_6k-|?L9F)~Sr?d7zvVmdtz8s{q>Gx*?P7n`JmFJ32* zVn7DjG`LU14Botq=urp%kaJs(115A1FGJ2wEO>%p^4QD=27O9<{p(-f{-rN{>2AF? z{GbLptU5jf>2zqf@C&2~Ir|w={~JyKI8V6ZiYsPlU|%5syY(l!8?&0z%CTQB{A^cj z=Z{i>Kam4?3juQ?I{AT&exaWHHQ7A2(_Jsmclsg5QXBP0w#>KGhSO3x(h5zwQa@QM z_K|=bEa>aKn_2zCq-)|}gTp^{j5clmPa;1~K$I^BZ`bYH_0r+V7xOt_k*1yL^mdSL zaAbuD{G5IrPx=i*@E5<#aYgZko*6`?U86^w=+v~&PE zKVX_F={!z8?>2~2UGO+k8$qVd-&9{)f1KQ}KJa4+Z4N$JAw_rJTh%xCR=^Z=DMwMT z(&icNpyIMR#TDYu3*NX9R18t)pgXj6+%Bi=*L|P|S@?xVo*yc!PBxWE(~eoB&nirFA7a&dX(Lm|)oQEXTK`KYJro1Zg7!Ri;qBp6-t!)p9(TD9{ZS2Z2kp-)}<=i&* z6Ta(35^{u84jO|3Ea)yHu@uYn!oNsINA*yr7Y0}=Uzbkst<0?AV5A`(;Esnag2y@e zG#h2m#ol}0``!+{1$dA8!2`j5ECZ0DF<~###rxMNwsBr$r*HxYfH=^sE#$R|9o%Dh zgsQfoyVQBQLg#_+GM+AsaWKeQ9GtA9IbXayol3~lVm{@i={!!tqaLFEvy>K0hMCwg z8=emh!h%!zU@LBzjhc{k;uhpNy&(mdTU%*9I zKIrNn>NT38T&@l;U^!ltOA@}jh$JuqF1$z&i2ylD#$HNHbn^Ojc^^>e00lMCFFX~% zHad7!zruk6~&%I# zxxhEN($4pMiet2(=W-MBG4FGlcRvnBgYRXLj2ThZ!2Lj!jv0tzOWCF6hU z+&Y1_{+zF~`tz=Z(U1a*y3lRJsXCqT2eypGza$uz^!WxIKTx?->3ID{7>;HBp$B%O z5O`Lnh=%go0M6-|4EXur7_J-mw*Al1j0G)^Lq3%SlfhCT+qf`7N6&A;DJ%7{{s#YG zdU8xm{VJG%;}ywc54z;*{1VOb4Ej(%(T4gAX|C7sn~x8KNu|yi@#r6yNX~vvERSIT z{7ZurEUUQn=YRg^uaFWijX+DmjlgXqbso+`;{+gC?*Pc;55tB|Ncpmtr_~MCAa9N7 zy6AwRMz+}VqNRgA<%w0lDodx%j`PQhvBTkhAWLw%@dnLr)>C z=Zup4SDkOs>c1a3$5Pts(w_O(ZA5<*v>}#s?c86J$yWKmqr}k)Jo4cfQ&zW!Tu}&g z^sF9IY~;mH+oTQzR^WR~IX!KdZZpW4e+kWHokX5=wBz}_U&==rcnshiE%K99Jkl`2 zAP)Fu*Y&}Bx*-g5YlkA;kAC!{t-2-nuuj464*b*?ueV7$4Y)-1IYl3XMdz;z?!1WY z+FIBL2ZKNg&bFvu9dVDgkbJZ-9dO=Bc%mmZs4Qv!lr?ZT5WNJJ0j3 z>oNKSVrYICG0;=rQu#dHdFVQh$3Q_RIL-Clx4f_7H)-%s(~9lq>-bp|jIJxYo3v`% z)0VPfoeXkJ-C(K`nio;JtiNSe2XNNGM`f}S;wV}uTB6^o9`VmFt! zi9&Si5Sgg`#+~`2$~V5_61(rjo=*8L15W|Jh%LBI!iyayG<51KlW0wYb-K>~=K>(? zaf2q?-8%p06Km`(y=-0&{9O1XJL_8Xq_xdC;~y=uSh>S%uV##ufH>e@$4%a7+K zGd6Xk~emUQ@WMe3FvbKd?%Z({>6HQpJKUQs&KG0?dTZ6W|3Wk zK@OQTW)#o_6&)A_Ce=b!g zv28<+ZJuc>x>KFeFaB9UlSZ(PAU!XAnzu9+5%?D8b*X@)@~m?xZ?Zm^$b%DPjZI#B zTxPHlgX4NsuuleoY$EYrCYoi_bQDkmMS|PHK50U*X)`;tpyzaJScy4CRTutdC98j< zRyVp<|MhCHqy!Cs7ltjUmeT^Dc+@Y4|N*Adahh(an_NJ|Bf=P0mW2L#{i)Ah-_{&?r^F7Giq z>=N>L(8mc@vGg0x_3@`s2&;Y_`wee+L$gi;*6L#5y}`~H0F|L#-wZroiacLZ7wRSe zH~!6UezQ~CQf3VcqNkvA=0R=$_i9D5*M4P~655fbgL>q-jNlNfql@MbTSpw^TnBm2 z%f8VQ9DA?d^8uU6j9B1!P`d6xo>b0d(%60QSn`IQ%8&*pG(L3{eMb)+WJre&#(*)v zyDkHtLF|47d1u$zMTUAoe!P&M5K>wE3;iJ_PdF{x6+Q5^ck$xIkLikkpZtyG6?PoA zx-N8;vfN^>3w0Af!r@nbE_D4A6dA4l+th)&<+yc3kuYk9bUclyr|aT?M^r~gHzUQ) z7xBeQ)5xLgAN2467xRH{_^ED@PdQmShaJe0&g&pgNO`0^G}3c<S%B|lqwG~pB-}SIj=*VzjPe&{ZvI#%RKvQRmsFNuY=Aqrj{Ih$ZF+8lD~#yR65lY@nHb5kJVr z6+9HuI{{gdhv0G^7y0J2Onh{Jx{k;2HCuORm&JoWIl#fggq7BjRv7>ppnDwjLw$0Hbz=c*qzMku7 zx>CQ9bAJHw&on}PGbwN(QODtdUW8?M_`~Y2_Tx69h2W#5g&nBbDglqO5S)=Don$h~ z#PY!aivwLSNT;EQ7Wif>=(>KYYP7r`dHj?gc(DwCrF;j+Cr=YIh&`Y3(Di%~j_VY~ zOdja!C}NMHxt%eLgrLQ^q95qptM37>&`tnO^gD>z^AtDUc;k6r`N~&(kua8bCTlDx z`ccAZ>X;YdpbD1<;@KRtj*^G`b+3LN!<50=mK^0rdhJdZpfk6}dp3-S#o z2jp^?%GQ-N=3Ulpc^&};zT(=V0m}zgcuki8c0NF(;fD0J*G-B?m!MI*JVey2y9hk? z%jdobMOa3cKWrDDRQs{|+p`<)W6+Cb^c4=B#DDL&fduTB;26e05E}|(2AvVdsAp<9 zvfGX1;CIY}uaNxGjcr;=1o~5j5Nb_OfMmD^Z4@3DnyeOO`f}dk_6Op>4%hwTe znczoNySnX?f2=@<>kRyUzy;S_bB*on-S;>FxRRbPo-5{=E|A!=+R^HdlJ%LmzSmI_^`$Io z;*-$Z)UbWZ$ALr|K3LlNa~p9Ud4;H#W#fON3+E|zZ%igsk+*r2s!zB*8+^(+FWOhDn6cZ)C^F*)==POZ9U!snwfGe5f-|2Hl`P>UbU?ldA(wF&XrT@Gq3b z>VkYeB=+*GiJa%x>9F%CaJ5b*pV3wRW_|Z@kJ|Wde3d`3+{ls@?zviYY@u*`I(-`2 zKK}8KpP~UyrPKi^Zxy92MJ3EQNGh@s3Nn8Ee}cBi5^GYAe$fDW-HW-!&!_SB@8FnrhMeBACh!>onp{&8Zv1B zLm?&Q({&22j}8Ng!PvkqIL6BZ=JN-eJo57HL!Lff{@7!WEr0vl-`>4s$&!1JD=0HR zDc<(s4}X~J0P*%d9X|%WV?1lss#Qg+zsaZ|gF4?hpbH9oirNPaJa4>1iO1EKorsCe z(3(y|*Zpu>VVu)58L*Rb6zUy9*{nRF0U{=O4z2v{I=CH!-*uf2MFpqT^sp5V>vW-q zuLSY!AgOJCn+E?h@wkoXdSG~nG+ndVquYqPw5kn*B>@|pE=ZigkG7@q=o^O8(XRAO zEy!CM_2lruYBrF|$)bb21?M>~MAyMr=z%A4R4c+XJaiI_Q3d0U8MJl$FjyVO>OE5% z`#<3#&?o%Ni=8k6O9>(=$2bIv)dwYb=hF*Ou?ZF=aThn8uP_d8G7TS72# z_>xO5nf|%YeQqfaBq)q2m1`Kb zyc@@6RQ88;?!N&n1)~KZb5VSr{Oiy)fH4nuco`%wv8)VwUVN2Se|zc=8n~r$rKWQd zeGAaODvTjapk%QI1Mdh>b{(RL9b?HrmjGAFqzm8PPapzI*DNv|nqp*VfK#dbpv5_4 z3j^|*`8pZOB=V>lGSE^G<?nZ%+lXU$DukT(#X;Ume`qz6+cqNkk2jk&(?o1y92XyFmZJ zW}{~tLr{q93U#&?S623HZTjUYkh0(906IbNdvEi4^!GYt`XdHrqrCYm)S!d4Mpm$+ zg0jvI^IHDDD*jx#i8i>U_L|_>+E}Nla1pohp{Wg#Yn*-5plE2Is1kfIFex-Lo65~g zoi#TIEBfHb=-TAr;}-{qhW!c~*i6!8+mz|9bR_BEl4e&_$UJ%KJaoW=V0h5LsjKF1 z!|0~H`|)x~poG(1qV4i-K6VL40sgj*UVQy> z*dXd8XBtK|`o_%h(XBCks70{C&bfGtygF!2XY5ym^Q$_exw_$WfB@7k@)xsov zbCSQxOZyLxjbFLr!w3KC(B9c4O@0ke{H1SnG!+yM9Xc!v8n&9AV&drv!lu~p3$`A~ znVlS5l^~>U^tb61Yd4rWyRr7M*CgF$>sbze+0fPHWKZT@klGI1(PzUKPMtdSsD1)& z2PbwkIqd)Z=RbdQ66*=zz^6a`>HC6!Bc%huNq8%-|1}HxT3jf2-t2+8)ZJ4yI;7C* za@AP^J#f&cSY01lTV5F3Sh_yOWk8)Y9O~i?z%itIa&8T*uPo|SEuRI&kyYu*yc4;# zp=Wz?aYkR?8kyi!l9NCx;&IMZ-TXV3%CpXNAc?+!rZfAxuIn%84M3hMFsrAI%=!Iz zbiJs-#e`MvJ81bou(`54y1ulycXMr7n~_ok3vV&?QL(PYfG5+K81SDuWuiI_stMr4 zx9aUlqL!=qk~eYfyw(qI&EL;{TSr|+hE)3lE>{RO@3#xqBtQ7YFMe_H6QB6Rlb`(L zCz+788(B`sKOQT0{_gMo?p-Q=PRF$pDSz+>e{e{5r{5J7>k^~_I@?@fz=;mc^k~Q| z-$;%siKV!KE;)#m4bv!-5Dpl>%@=q^4!z205({02?+SSul{!m}IH_ZGXr(r+mBQ=#q0pz) zKbJ-0+y0zl$=5X?=A`SZT>FQdvP`s?1Hnz#_VX>3yWI;zvZ1ROlM*B6l+uwMIW!Ga z*Lw%Cj}F?1_Nw{8W!lYN^7P9I>RvP+6XNIFk-ioG(!TuUNe_EH=7oDY@tMm8V`@NO zi+a~@|MqYD^>aP~>A`jE*s=W@P+I9Im^^fbOCK|kUZlJR=zcF#kJFbi#JhserIM3*H-G4zmc?m=1 zs8Y8p)o&K6+HGf|@q&)%L#~IQp;CFKd9dU-$Ldm$3Y{rs%x1NgwJc zD*?zljDts{90T675OO%ZqYZ-AD=Yk=Kiko|Yx})~zg;+dQ$M|#di8bfV;}oi=eg&e zTh__?Vb$*)v}2tp>;Ax<+VFQk_~-bodDE58D9CPW3#70n05*`I&1YZb2zoM*tYNZ{ zcNsblgh*^dSjN zWaEZlX;__M<}}E>0uar?mpL7gaCBIRJ4+qrN#5Wqaw#A79r)msP?8ft(UJ1W-;~V@ z|G%5mG(fql+!Uj}s)PslTdYj#Lfp+0ZTS|}y$xa!u&D{Bl(Oi+j`3k!(lRfMy8tPV zOj{0GjF(+B>`r<+m;Jk2dTUgjs5?(T{q(AC2tJb_wgMH=s5vQefi5@ zJ`oL8m_^Ut+0q0sFFLdwSY3HEZVA+?0|Yh+o|LcQ#F3Mfm&i{V_>^hG$%EX#$E3w> zwwvA0Cdm3K2VdH*A56O_SqCy4AW~krbtI1&zm0!9cyOpY=(AsYdeX%#4(br~N&Yfk z(Oc^dxX@GJJ3ZGVqbfFTXO7P`+^-H=rLzK9)z;wWb$MvEb{mRkKyMG;D&nZ00(|(x zA3mht9zWSnsqQ3Sms5K7-F%){e7g=tIcl4c7v69rJG|g)eU&Wk6rQNO%N0*O7+4#6 zRVyU2-&(2$=?+D2hyGA1Pg#olvMTDBfvar@&GUbjqg;L^eTP4(tMQ9Aa*6<;-`pU` zgHztLYkec&ZLCw;Z}O&3x^ewW;WPe~PQ>r@y@#a7faJ^{^)nkXO3=%_h92?-)v&$& zmlMUnTL730QcNpw*CXncXy-LfyGOU~y6Y~!5y<6Wz9pLc=bDs-yQV|TVblX zmjKQ#Dc@XO9-2LI_nC=(`>$+j*Q4AaQskKb=Y-VwA4peGaMTH1_CYPx2ofsu)+joGO?uSc+h2h@lUjSkU_9g)oems4FzCWnI=H8x=|p`q%p{^#tR zID$Q3`A;OlMliKugdyttJnNm!9$$Tl`qSnPE%H_>F17G3il1n=d;`jn?X#h5t`AM_ zKeDjr@Ud&+!fOXMj*6ehkYZ;7a}y%W<2aF<`iP!S85$n(s!rlTuFaz@sLPAGuti04 zMgzcxj-Cl64NF7r2e*aohC8jl?zYU^RmMjhee3jg*?A*9x&-KGC*X!I8D7Zy0JRKl zM7-vJbAA04iRA#)Zw)k#eX_T%FrC zf6^b|hSl|fcSnK_f2LYCahbPy6aRMPY6~y9`{_!*$mz4FS3mX}!q@fgCs6Zf#Xg{W zdK-${m*WdTJH+JI5l;M`0Q7mP8BGGbC{Q!f5pHoN098gZy^uoo@gPFFYOdeE@OiR3m(IPYuij6 z7Dpub>fEX-zr$3|EcF+sB`ne6Ptl7sG_tfAII^yZgR+jI(+tvC%hfRT;7GnYH?qec z_|efPHGU2bZFWY+);oH!h)I8IeMNVscf7mON5!{}W&%hb>&XD$YZ{isCv>Tk;l!sW z=z=fHnWqiP#3g##F!pME#xIk;KJ2rpZv>vzXW}iVKPYhHBBMuvgSrpk6~HZ8F6> zu`XL@tsgy{NvgrMgTL)a_@E5+T%R{7bSc}RVuv5_go0Y$bq~EL?UD<<1s8nv4nfn7 zKJ)N&02qA=Y)=^a4EUx#|8-uE1lOdO?Y)iT0#GEo9qs*@9oBZylVbLd2i8o2acE11 zm&uh-Ah0U{j0?F!57`@;1k75?1CwNL2Q6&tq(8j1eErJU)icjc&tEt*y}Gn8stI6I z6Tr&e!?(`Q9J_6PXmortCIKq!$|GN;u0n<10ft@U!>=|E&RQSz;1}2o;J{^_YT0%q zO0;R;Do2lXhF~whyY#@%5d#RF4npLGujPwe;7b|%;X~8;P1{*lT>-)9D{|OHE)xPZ zJ@J`iSESIH08r zFb5Ky+jRupBOqnkJW*EGEnAgs5M33{0i@I6!1~(C@P%g{K6v@Xrw-{&HofJ;jJh?j zc=`O)wev6STU(mHaQN=~ui~-@B>N+MO)1J*FoWu(Mm7U{VcRSz7xl(B2UL`Ohdy*6 z-}u?Ikp}=Y>97pCBxjzGsWaGICg+e(`2@g(uvyChyM6|&x(TY#;T42nkPH@bZ=GhK z!BZuXaIL`wF9oqSXFI`NJjq+>0K^|F5#9Vr@57(ul1m6fO<8+T=3aXI=$R+J{vXx1 zcWCrkIR@sJ=Wkn@pF4H)*1%uvzxN|g>5D7P>9uIOaiG|{agn~9{dD!ir=o11-T2_C z=-VA8B`L30_XnPR_F4FNFPLvemNAmHbO|ssteJwZ(@v#e5+lzQ0E$uIBOR!5Nh1eO zs`%`1#gF=;uLs_OJh8WoiEQCip$E^M_edpGI1`?e*s$`~Ha&_q;MOv1e&(z3bBlef9PrG#%6; z&>k(+TQ2r!yEm;X+c(;__*S>Ip4_n)fTlh#1BEAz;fKcYo?#7ugIZclC83>b1<=0! zhlNg*z3tAW3_g!62cH??SK0E(*UnK24|xyTfIieQeEH?4XZ7;Th+oNVY^F|?B&I=n z>Gb2Xv&U{<)Qv$0b=ckJ6T~1Vn02FMSocB3bxbh8wU2uF9q)L@qTaRl-KCU;UjZ?! zx2-1i1=dN)cJw;#%E^-_7j!AL!bE_9tYg$eSrg34-3}EGU`gU@y8#( zRlhzvt1+;mmEyTmr%qkejim+Y^P~Z9rtl$)T{(5Rk%SH%o*-)e>*rrOvbr#Ln`$Y8 zP4EXj%3Gb4)#Vcxzxgj8IPpC{{<+QdtG!=ot(Cq3Okbzp^h2HMy5cT0aQ#y9^x~^& zHzLpSA6xi_kLepZ<+P#x-O_%4{Nfj&dUk*=6()7_Z1A84eZLg|Hyp~l)Q->dW>@nV)EOxaD zSik@N`!9XuBOke>hUfcQrOl~3T9rHFPxt~@QX5y59q7n|Q}O^X5d9juMeed|-5~Xv z@Th(i;x5(o4%MM7k)L?tiM#K+@4j#9hhU%7!1CE$>;o^p_~Nua8u3xd`GpY_iT6Ev z)9{?Ojeq6dd+)uVRRQ0Iu#NbGb6toeiqAB3_eecuYQBX_=UKv*25f0@1gbM<7cZWD z@9OgMKM!exRUcPswKoh`ZBHK*e}U^d)ii=J+lS!HlrqrZK|b}@@&tOy3r_Jj%u_~j z%Wgj=h|4*-w}pv&JUbvDf1skx!(B@5A~Ldk;II;Ze1HcgZ_|<|=rms8gSX}nnpn+N zbXGbT0i7!^Ju|bWv%k2^%b%S|Kkzs_!n(HTsr?JvgJ1Z<7xwEjXh$OW>DW95^cZDA z!G2J3sPAaN4}9rMUz*jMR(m7(O+ZFp;~Cb=REPik&;R@uEt`3?N_8w3cI^jv4sZ!) z-o}M|wo%C|d4b(2bwvFyN z-_(tvNxdlY?g;);M_JlZJKe1I`eE^(QX331NV`4gUCO%jrn*h~kQ(&J*touO>-N;& zW2P#~)7R#(<;dhL?|Poy&HL>ysbAi*QDocl?J~+~V**{5riRrw9rYJM z$#cLR4xod$XX6Zme78#gJ}80GGI$%X8O+$uLwvy|OyI$}q;k*;KRoCPeJ+Fo^8k~O z*IoY3<(Hn~2A|IU>Lc*mrPazEv%O1}f%I)$%YJ|UYa>8@BJ zw{tV{(d(;Pt_DDNDx%M5s{frFxQnV)neI&yA`r3i{bI(7x(dql4RmY)CAxa06PHrHQ*gQbS{?wI6+eG z!6V+%VL>w<7HGj&iF8jA@Pv*XdFseqeAc5GVBpg8kL_PyUDg@a=65Dl>-nf*`d-3i~_Q=NO(Lw8I% zt1BxvU-;(d@6*lU?K_*TO1zn3A5%A^f__T*y3Y_+Tkp7jS3vslpMus^B(ULwA3fmP zdZ6`6F#({531CM;pN>fagy8pR-N7Y2AGy||q0wOV}JSf8{ms>a$8@^t-^hvat zRLCjASHU6Q>CC-)dJmud*4EV=%$dXEg#4gBS~7LurlrZ*LwWC_=u@L~bQ5gi>tFx+ zG&jXkOnF-u8hWoTFAg#*%Q)x~wEfEP(7xFQ zjfiE1>KgBj!b&HyO2(s~iAt-Rqk0Tg4~qRQ{mhw$=lB1 z%Oh<^<~=!^ccrIfvC?6(4lc;N|`K^!>`0M|1F*MCv{Ka9?Bq+9bHQY#DG)h&jMrnP6Pir#)MTKISk0NL#ryUYRkxXw_naM>-20-|cUp05uRtpU zQNOL>)uqLg=N|v>cY2%nTMVGoOBVpw?N87Wz~IO!ljsBBnm6U6e+r+0kV&|mXP>t5 zjLo$2E}#nl06+jqL_t&`*ee5g33^@LmOf)*5zaps+}080Ax{7*u;%E=L&suFbQ;)4 z#arXV7JU%QZDazOw8Edd>Ky(!XvD(1aQU@~#VhBhboS5Nsl`w_ZCiuGTjSIFSN9${ zt_!ASD=_*+APA zcJ#BK{p?}vM#?tm8X!r;hF~95okKXcd&2MnX9}4tdLZZ;eq3ke6Pkor#;1SVLWSFt z#U_vUbXWf(_ck6B@Fs-D=;Wjg11XgP8!by#4?~f1_0M1e|SH zMC-|tpjDq*F@3B0NvyF`jU8X(_ZbI{&m0%X=8ZruA$084FT-2{5DDZ}RJBQ4%w_12N?Aa*TU*AuL1IJuyQg$#|JF8BtL%E}lIB%CzC0s2nQXe5 zT zdg=*(_)y}625G(&figSUrARoXEiHpr-}~P8E^$VLk3_D9?&yrUswMJbZu$|vI2O9# zHI63?x>+_8^@p6gg0-&ewm;(c;0xb9K){hIU8#fI`^mY3uV6eRKbg?`)zSPKEbH0` zbXFUIu5qKYsiOD%^2l>jmj!%b_#DhirA|$;8>dH&N3^=)SEcgusAAh4RDIg**DhND zY@=i2YkJq?;h~}7YdECTgEv(dvX`r7yK)?o0}yfxgVN9|Bt>KDN9&|cwsm#%C_ zl)`7_JE{n_q^L?$MkfJ{?Sz?F(aRlwbV4J@!7;JqGRr zZ505o(^F49wND-D2?-UdN0N5rVZ$8@5#BZ~gc9u{e9Zp3=P<4tkZhXSE!hE`{m*M6 z<7S`4yU(VSwe@#R^?YJCMWVT$tOE3_(#N!7deaj?>PS1ZQ6|Bqv8dz5^8CnwcYf&6 z(Xp}fY8kP0`yFytAi<%sO?Fh(vh+bkQTnfBfrZpJzc-3l>BL%iW)be*MMh_ze8vLwW0I@eb5PfeFSkV z&gjVQ(33b_18=c&=1lcJai_#vcqiwgN+K@4(&afWw^s;SH zY(UQjqks=#yK8WQhhC+QRygB&vvWFdZF;gAuR6ST>eQ*Zc+8nJ=h)N0*?iZ#-gQnp z8~K$P9P6i#!8@dS?q?HG4&p9_Z&N{$(wRJXbZ&C?$P+rV&xJ!h`oJ55I(k>+z{RH? z`T#eF<$e!7JJz>e={D_A^?}dE(9};H*=a7rN8mxLVaniBE@0~du4T*=e`rtikm|N& zQb1?m3k_VZ7|Y6`kR3)s4&8vXqFfM4|N+Ti%FE|V|V4@mb z!Jjg9ZaK`Uvj_F+=N`87hMry>NYCiUIwv>w9J*zBVtQ7Oqx=F-=xOXJ07t58|6Y2i zgBwnPy{2n?zbzMjLZTk_(||xGfj4*to_0FgXfqj;Pr-%mtUET^$tE#N{b|>JiGjg8 z3Yq|NLsx%hDbXrtS@oRL?!Wx0H&pNN1-kbBa~ZIkKGQVGPU)Tpk3M&dC6vEiX>;+~ z=*(U3e^{4bXB(Y6CPL6rm(IYo3unJ~b^h8UPDU3tV)0kFQn#d&Ckz`rlp|;@8L;v6 zO$4xY0cWss*3Q1G<$_9a#Efhsy<40!q8x-`hlz zrR;9AgwM`$R5lw=B11U|@4AktlyS&G5BZuu;cS2`+m6ouLl<9od{$Ewcv1nHVsmz6 zcAwaHV0GqJuKm4B&-Q}fu{*O8arN_(JmE(+$Xd^<$`HOI=xhvw1DQwXrrhed3+3P3)a{Uca;GeF4(f!$14n z*;-pUcKP(<_vj`f+ZMa{>Us&Ly=AHiW&*E*?J~iZ2^vSH8b(*9mJJKQ3qJYCGl-GH zcG6Vjva|4~56}sC%J2h6&`W*uBtVlSlSDr9PM7N3JLR}W*sfVk7AytL^wQv|87+fD zz}q$5rW;@L2u@sxnK|V>IiL%b{L#1SI(h+QeCaAL=xi^u8WZKO8dKL$BV(IW2X9`{ z*57sQWGOn)mxls_dk96aAHd*MaBQT%$OGe7!sKd`j#dd9YTz3>+wlr6GT}q!)D^u> zVYA>Wnn=a>#*s=+!hZJ8<{w>)-_RadU8^tXSi`3<-!o%i=|Cgdrj}?)5(8xU~>QA)#;m0uIQNubxEDMYH_aM@b$cfcKO4#la{@5rST>8QEpT> zbyL}&UWz5wE*cw>uCqM>g$|JTSvm_ilJQv}uWZ-o9WbjF9lI^}ii~b>uIbPi+kFDS zUtQ)b7r|Ws`Nyf}1Mgz`O#g*$>j6$0 zXK(dExvNi^F$fQV4xF~gYgrr7A9R5y_;d9I4j8<2G6C!uSMVtL?ld>E_@D)dUdh2D zI?40^cAW%z@F0tVlq==Lo2Jb^OV=)qUB7T9QXGJruH9M-E;8fbv6ls z6LH58_>kN^W7bR^G+zTv2bPU8G1UGrndroW4}DJx($ic5NU+}ufa?$M5kR>FJZO8s(N<}M`7tSpY?M)6 z(-X$7E-QMTL6RqP>DtslZGR&m$!|I544L&8?7@z*jpc>mnR_05Rx6Zev{)8~Np{C# zG1^tH3NKvy;L4>lN7QGmrFX4&I-7lfeS$g535P%6%MCeX;U@qyr5xoNPCf90rw>yG zIPlIBPY#}h43`Jk;*8JaqAlJ2mLNQgd!^kj3%#|L-w^BjtdM1;==I?31;gUTmSF~D zKOXyy?;P-jSl~OI<+-aP*IqrnSG7xC@~+g_7#Ns3cyx8@z|CuX-(C#p^JM@^8=l4w z-K;B}*QKacAfR$dm zNjEWbZ^EtyG)Ts{XHfanOSK1@HW&5%Rzxi%UF*89kejCpN&fZp1-z2^$g@zx5T&=s z)2*o(zER!q9zS&J^TT5kFL?lLlanoSE!Q{Mb)sD3(3vu+AAWS!e6^0`2M3%t_25^3l`}qgSTsqHccs*gye0rnXw!nb zo!yr3tF9MS_78t-;~NMi8st2N!|^&8YS_#e2_DL(N1hE+2YjKY9NTx<^>_8v=lAMP zZ>7rWyZ`9U|K#jp?Fu`#Iy|ZgE+!m=&{uS-j1Sz{gVe2LXNj}F?%4B{q(Vd|I?$Op zI9@2y*>PtN6v=Hs?-lUvz1lvyN|J8iFjdeu3@`!k$W9YYUaxoQZ!6Nxy1ndAX!%t9 zlOu-FtF6p@6=+v|=$EcleI9LI!9rVEKC%)#;Fa3$yivKY?MY|wV@^8;1MchrW z6A~b&gR^l;upu0L$qUN7J@}!aBlYQWet1jIYlpAt**{BqrR`Ruw4L;*e`8?!<`c`h z_FvP+A5Z=wr(f2|;KeRU4Z-iE8P=bEdbwueTX^0s9KIn_cZPM)$l6%MW4FH7S1E^p z>@U;7(LUCZf0`!9QdjPF?85XZFmQN3L67$QBd&ee3R-9NS?!G|ckBzH0`QAARD0ag z%kPTS?V~}vbn4WpOB&o=epBg+_l802>nO6o;7AE`-)DT!^pc(cy)ZB`_F9+W9+rmn zd5c%izWm;$*I(S%86IVgj?U7*8Y9IXFs|Q-`}mcz2_wfO0v=q#J=`j&S{5W@CW%Z6 z(9sKCdXwY{g{6Pm(JIz<^@0|C$VR%JO(T9!0G9>yTmfJ~9jcFSs+F2EtBs(LvJxzP z13&06ncvLYvKBUv{_xy?`P#)XeeW-Ws;ASMCOe~hW;e9_U(?c$2C{x~5`F=zft;&6 zsNHM>+W3;IfS!88w*ft}8`773xSO5w=1;w#34EOyN7Xjly^spFbL7~Iy`c$Ug_*ie zp|3{0Wf)xy5Uq5UtIL4C`ozyqM;+kBA>=4?kjR-(2!4G;bXqHgH(CL>ebmO+?zrQQ zD;nrsZ4&Kh)lHMSqdb^Fg41E+H4H6N%4Ioo`?@?oJaPQq7pM2lJThcY`c3c*jje%& zxohtoxO#4OYiM-)Szjt_<=D*tu3>^%$w3GlWw#w?-t-rHg0pT-14|H{8NlR}Ytt#8 zxX_a~^(?EC6@A19dt5K{touLO9(--@{=?6#cSf{5xM|~L zu5w4Bem(l8&dU5a6F}-G*I@&|)E|2h%*F#(J`}aJEXb4%n2fPV-qjvP#Gjl*IJ3j6 z;4RB~uKfveSW{0M=H!w*Oa!|2r~eoajHh}lJ)$KM_tf-~fW?CC2G~bG!r4IRx*}zu z(f~mdSm3N|24ZTpo+u=&me)k#S&=1A(^x4`=km2PG&Zrh=kTqoqmz5&md`dtk9ZSC z%(ltZz#YBax305P&ie4RlX2?k&gs*qNA=|(uL7u4-SAp!4e9H;le&)1Q+h95rNi_Q zk*m=;z4+Qbyy-G+j*IepP^+9}z1_#wT~a@L#%rS6qpiC~wGx=p#OQWG7Xz67)(U5@ z=yx=#`s#B%)vlL5@PQAU);*D2y``Ax=pSq1ud}f_ICj$=XZGxy z`9^FU?LUaL*wjz0%2+cLRM#@uV2@zT6n@)z+PK1(p6fter@53B>U6MpAq0P?!T8_=XIaI5DE03nUb#X-#!uWJDK=f4|O-GAkD zd5j?Ac$EQ>aG;xj3kS`U1UUiN)TkMl3ES9~_CgGeO>XLA9&5UlL2E!S4IUopwT88U znOkmKo}4+P-FhY1?FW9v!5PbN*fgx`p{={`zI&ZzQtFGm&P-z!pfBT2sDYAZ9UACc z`qIy&f+io0rLN>72M7O_whJ$xI(2H9!O$nc_pK)TK&Pv28z)YjnA4kn`AM%{{$bB} zy`ylezUXsAcki2r)6$_jZ|X8=Z0Kam$Z_r?>yMa3sQb>52J0EZv{-;bn^1-;hP`Txl^~udygM35k|+Sp4INL zxj{`DwccKE+D<>Q4K974Un%D#La@S1FoFjr(377saFo&Gx>3$RuVH)wAN-zFauOl< zfw9F21|QJR_$Jp1mG3&>#8DkP#u+-bQdr=o*DG2E_TBEOM-F^h21Syw9{$t{YZ^|# zXCA>+*1Q#-dZmuY8$LbKTiJKZZSx!YWfxxR5uY0fJ!}si*)y}T|HR$PBNO@=gPmu8 z>%~s$PZ%H6P@M-Kd~i*7xOsWne>77nzCS!jTDlmNTz(n2qwV*8Wq+?mj)U|KNWk(Bo1d z4C}_3)aX^2#Y0DL`NHUtQx^x;%h#Z758Y`CSZ(2eBET{Tfip$W*S>96QcUS1I#UKc zz|g{8lDcexWa5Z3e22$=DVshZ51hL2m*6KS>HbaHJ+9(*gPPj>(LI7IgL>?BTGtAE z{)v=Ac2LT>1Ypl7&(|^5R#eJ3k|~{1IVT76Ax}!a$SF&?o@MXZw|Udu@1IkUFAV9& zAoX&OUg_k=em4em)?YjNt_QA9?!QSNDc#D@kO{qRo67?D+I2BbGF!UmaQ&Wp?pee(?eXnM*wTcv zA-k7!L+<4_uxY0>sonIAZ+zos?gcOj@J#_-;@qym#riTG?^#c7{ApG7w7x5FMH7J6 zqqJAFSq}2lfjf1;6!(&!c8a!AR^YU4TnH7N!Ozcx4~@(mnLm8j`@W#JLcg@p8C=(- z&}nWA3K*Su{-$Hc|E~jgzV9*JJYLn9lG!HcBbal{movB>mVwH@9d=74DnR^22ADui zTpPxJf}1>GYl07a`jCOm(m(wHM;RV)$a5J0UYDo?TE+2l*a6Y94Phl&hgOOn%;$8i za7D8|gqjh>l!w&0nq0O&vmD0ETfx}zV3#9?^~ZOU$wAQ2k&w;9D9gz4sRKvWj=uZD z*R&aEMPC8tr&6_VV|;)|e)_FHE$^_=rKg|HoP3h*SydmoSl4^&gZfg>h#DCmvYyH3 zdf|`Gj3b(T2RVx~8|!O3V=9|2=FC&B=wa#qz2E!2m+8Q&&dJx#-GOc7F6B0VSDA@U zyW`eA{_&4Lr)A)@9{J^CpyFTXw*RaGbhhwyqUyLQ{xMzuAFFv_hT{ z1CBt4pKZ#tR>gK!*<)Knd8n|5WtQ zfxLBu%)r>5nf06Q`M`oc2hH?3s5kzkV{@?i)R*_0TPEz~wOr~6GdujWPr740pzr;y zbDghAj|wA)SHDt~`*ON?>w+7sM)ZOE z@wM@CwFw~EpO+s`>BFS&)+GzO`TEvVgNEIY*2M&(at@ldJMg%Db<%iJ?f8_&&T@Qf z!Lu^i~`Dkon%0IVSCFog>9gGV<9c#r`DsFLfQJx7keK6&cBf4{2VMp$2& zADWoGd46zZZg6vHj^EDKc(F^xE;`Vg2P!Mr0i3vEO9%ouCxY}zG1L{5F%cA7sW<(n zOhS(`%M#q8duuOvc)8wZi4QL@Pov-imJS{VdSVa{er@TKZbLfJ-3ouCGQP2?Nqb!r z#Z?E7I($w-m(rP($Xo+?Tuz7_-ii=#DkaaO&~Q9uLf$GXe9EV(W^&QxfF9TI>$|$k zGH7^9_W#ow?R@$Gp8az?~4f26V~5E5G2pdf{6E z)g+m`BHKQXT~;4>;DM{U2A}5=0>Yb2?%FQr9_3)O|G{EhX&@(kB_ch8=BP59dxdpnb=yoHma#3>+kjn z{q_%il+)J?Ztw(D`UyT$%4a!cDHFKl;0RRYfYFmWfYCup9wrQA!E-ieLJ7K85y-%s zve1Fy4ceA2>j(5zt09fSdIGQ={=lc>HJ#ArJORk)H7R`!La(G{BEOnz-r%7}tq6TB znJ!xJnMbh14R-N_j?@FK;d7vG2Yt%I4-a+&XOLpAL%a_DhF$L)==ER?-c2pj*WUTg zcV>{+ItKJjybT32r*PX*8+8=e%Ua&&XO`2JJ4t8UW&Jql)sKDbV{>XR-!nnsTTSxW zqN<<31{T6_mNTzyM0@zsLxZBDAO3t!k0PJePQfdp<>)QGE11t{u$&{1;n#NFCAG;j zI+O5zi0huYmeLEyj~{>fM}PE3zobuxUq%LplA)&J>+jc{j{Q=IvL_xyfGvL4zoaE?B7@pK$!{|sJjh|9) zf?UaEc%XqGr5@l|;tSPr@TX7UvBQCHtO9Zck8b^t>z4YQ*RyX&Pp>4o3zBQLvg*3; zij=-8L+|Xx%o0+@vIV1Uo4|x0TBdL;i!`M9K|}=rEfaEvr3SnwhDx6+S@FApumOL? zXSrGja2(3YK(;=W`9aUl$&)8H*+Q$EU_9IBgBqUXxJjrFgRbffy3EXqJ?f#a=&tI_ zcU`}YHFm|VjkLay9LsPzagHo!}^lq*?o z3Jv|pkNn8zh^W^*m1%N=aN=JPiVRLx-N;l3x!KPE$v@WaF0IujR29MH1*qu;`9* z(hEKiE~m~IbA_k2EB<09?3oWZZDfuff|(rMRbZR9rbXZ;pT|S!w~HxDA>q&o$~NE! zM{w(AtIzNRxh`Q{1ufyd;YTX~^T?(r4EVKyYe0QEtbV?ywu^ESIE~x0x<_=ytt{r_ z8X*6xl>RSL;An;s2Vkc2`A)n#-rtZDjx`Fh0=HqxI?CBLU}d^Lqtr|02ISLDEe~Am zpj$S4V1tylFs=m69VI*Hwrwc(WZ zMJ(x(hNb^HH}M#VO7@RsrTThJ+knS(BXm}6v8)vn?~H6RajKqf%a%Vy9(>jvohqy7 zdH}mFflt_Vg9bij(W5f5mV*c_@DwQ*8hGd=U>%0R_@NJdNPYdH13tNN zo}>Z7M=i^vKq)t$a#}cHSS8ZTT+o2|15fY)r%Vk)cK{=ka4JNWBWchR#wJI~KnQw` zw|wXmxvXY@J%g$-2ecgKr6D&cv#nr6O2Vc(#U{iHKtHhj!X}-OKDrq4=rg`3x^cid zgMByHG+e;POyLqZ?hp^^(a?x)+AZlCpI)YW175xq=9UkB zHvl?1)nC30(8&n?j#jmMq_Z9TsCR>D)%ud)i#fs=4On3Kn}Vq5p;+q!)?wKeT=-LloC8(-5ljLk z6(IDKGJ#m}Sw|h5!1$mxu^yE@W}<9<;Pf+t8RiUN^rs&1bwUn0OZ*6a?pawDTfq1X zoGJZ9R&rY>Po5n8xLy^u%0aWqomvcbY8S=*0_WMy6D zHz?GN-4Cu+*ml%Uu9eBB$col;;MYo8aFMO?C|5EngP8(24t&5Cxb!D-;}eEnCHo&b zEL+3Ks7$IvxkdX}*rAMU>d8D;0q6uqPr@o2mJaKE07^An`((Q*8#ZcNJz*IC)YJ{G>YQ zp|K)hq7Z*s1rYq;(a&W7a)0$#f3@|)Km5aE!oQbtJB6JWw4%QPEzjr!x-oQFN}h$G zSJDe2dt}Hvg@UJN0Jr430<+TFHd4xx*KI{Lus-;yy};VCz2vQ%%oyit-v2LHW+i+Fh7Hps!@&V;amLTT{y9t*vbx&Fv6TeW~ zXQvt#%?VxsO+^CE;Hdc_sSLaARPYYF6%RHjW^N#GU3Ot2p|`S&!G3nZTQB~WG^pPL zoY=RvxU@QU_44JZweh{W_@2}~o56}{TW88)w;hn^C&0*|=ZYZV+Ach)3q9~qPw>EX zf=)1_kAvVw7q$p~UvJskf9svANA7y>N@sY)jf$)_Z2xf?TO{j?ciDkKZL{`;3Qwb=DW)uXl$t+{ z&RS8Ct$FBZ3$=U*UHC5A0$L-gif8@5;pZ>;w+*n@n zmgdgT;QaXPk+0nRzVG`7{e;}2c9yvz<1FpEVJpknP}xDI-2Us2{R*E8oaJ!CeMnoO zFM}DFo5~reTm}fX2zs+^fzd}!%4I$NWYD7vdQJ{J!D1Cad$9#rVjb-Rm=@2SR?_{) z!J#KtkNxb={_F)v+jkNM1}^{55B-q7t>)AoX>NF3227|@UHgSakgbNj1=~^4EQ{8{ z*n*R$=W7F3UVe7`#eeQ5=$9w7B4CA(9e^lst=hQo zDF>Hx@tHkj%%?y04?h#%hS8O>q1UXbpp~aS*PntCaM3UR(#dUE%J4@rfNX6y>Exk1 z#F|MYZ6O1k{Eh0ymr9>yLqXFR4P*M@&P`j8YFYFn3$6vHylL<#m5KqUU!l7nE%BLK zPx?^XT~ln#Kljz!U;Vc){io%H`TG>m2RYVO*G}rB@}sZ((_j6k^>fc1*cxqKf39Uw zn*IZ4A~@kAn4tqRQ79QEAUWWp9)gRX@FD{qIzdWGJuc`E^5|q0051U@69mESuRWoQ zJN+q(3<*4Xk=2)~HudCY@(=&;58s*cX4?May*NMq<3IkmP;;Q`31Hv{e&7erYG%2P z(mG|C`v5TkP0TMwYa)jUbN~h!jo8iD`nVcli5=bsY*&PcEPcV{^QpTOkvsyi8 z-O!De4K@|2GdPXdCwRjzcczwO=F`qYKI+Mref?}0h4A5{QjxW_=1%z(zxX8af(u(NCmgwbz*G))>?##m7s9d5 z*wotk`DYKFfBxzJFtD+HNVW9WWeW4w#?<1%+y~D-{qXlJzy9(*y6d&*L8#!4GTOj0%9?B`73ZtAh z(Np_Z+8n;xAM*_kZLKUVj9xu^`p)IW>+g0gHN;Q>og}HPA$9lMl}isEzWnkxHjkXT zJfL3~f|mXRD-}PRqQ5W6?SB`OH~OUb2%TUCpJ(%sul3ciWwS2G2EQ}t_1_7^%nXPKD()lJ>OgCCqS2}At^LzMon+-Op z*NwpW*UyeDUb(Q&8-r;N2JB@57EM`$3xN6nf{ZLBY}L5bNg?3GTOJ7`lqEw89Y;M$cT|>iLC07zzC8Gt~N6M{%aBOmI?Ujd)UA=hz1N!psfNldI z+ckD6(}?=M#LbHhzcE1u#*r6PFm$Pl5(GHdG=yd`QK#nZq z1UZh33C0gF2e#l*ocZlP!EQhB(9;KC^l{R`u1*-3!QWZ&^tu5EAD@qZ;wMC;7-p8aJD(YwJUc7hXE4>;8M=wVHa2HH`6BwOG|aV=pZ>T^C3g48P5p zcI}8U+y23q0bKh?P(njC15~2CUhQB-P1=DESx^Z>LoY}IKIHr&P%QNgvpPVQ;LpiI zCuf$!Q-ARne{r`?;(W!+deD^#J6erC^qar=oB08t?g>DQtH1Iqzw(4`HlVECh;~%V zhdpwpyaJlaBd=v@xW(38RAqFde|&Rn@5~w#0p)IvQsQ2L-t>HVc;U*0W)FiZ)lPJP za6Y7qiN7vWk390sTIlGaaYF~N>)oKYVanNA`nv9fzP_?w?-J1PB=mJ9eN1E@pA$!~ zuKPFjErRJP_>({V;KQVc^e+DieVk)lG9?i3jf7w1>1V)XCRH*!0vI0XjU;j3u28M;#+VnsG+h0jV{#jdk!`fl05(TVk?Gfy7Adhz0YBiarx z_M$I+id;V%#Ww*bp5L0By?pr6>J=G!sVIV zx{-^?!uoTvfHy7!Y)gS|S#0IRfG#Egl>f$W{Km#F|MD*%)Jfw**zb|pQMmMLzxHcS zi&nk_T~+`oq?=K%OYv8;Qk5dtQZvo8mZdoXG&Qf7YA|%xja8E?Sj#xw1f1A+XnlO& zL8dooy=$R{(U)F2*I#>ONUH$3*?sL4a_%G=kt1=L%df5R^yMXt%2++&GU}>+8Prf<_hJQdG?L7Fo&wcK=Rur^%@dv-c z2m1-H60qfXO+$ak1xwFK1X|&1zer@p3iA#eUE4c~I`f-Vaz9G+` z6wFOX2VdAVA3njGIO@WIT+&hpXY+tzchCmE@fegY!|*Y#-~*=sX9nhMZ#nQ<75dB% z9vFK{8~XOceg*l5(4mxL3OIfGl0bhj7Fkl607A)tmY>)3`r&`0ET)Fbtj!-?0!+$C zeigS+YSx59haE}%MW6-f6W{tK;Pl4q@w*n)71-{oK*g?=|H#1g^DhlATsqfmWQxWY z5B~a)JgJ=hWxvqE0G>c$zpt#HJ1*qXO!7K7qz8QB(Cg)wUacL{tHIpx^EG@3*M3`2 z_zpKtb^XQ4iq7Nb%2u>g%b7U&LWMieIIR?p>Py5&H0yIe#W?Ioeav6Op};=2_&iXk zyHahhz)2(Lu#y`HVCqvdj1ltdED}`8>KUR@46_e#sfP8RxWMlE%3;Xqx zUw4fRY)q+Dio%*tum_X&keok!^!VeW`;IK=E3=OD^dao+2w?op;7py!WIYHrd_*36 z1Ue`OZ1x#vaB%Pu;J_s4DT^J-oYjHh%cVcOg1H2+KdcUv{3W1(JAB_!df%D4VTfcI z-DLj4Z~fM9`2)b%B$Wvu7Cqr5pfwKjkHk-M+^>~B1@9!c!#n&|^KeP(0k*ww-H zMSlVagDy6XT=7=?n(gA9yHwo?Z%G|JEt&OTG%+V|uq$YCVVvBN=dle5GJ4n5|< zn9la*1J9Ws9Q?YM#L4A=?lZkdCl%1`#_*$5?eqEa&;8ub`T0Lgq^=17#Y!8x5Ae8V zm8%q5N%iXR^I6lnPcTYlTJ)}BRG>n2cUIXpy^mY?$hVA$8}vlsbHoJ(bW#( zg5z1gzD9hB6#%x>woCxm^$mt=TH5uS>@wJy`G>#!L5k1~Py1$=kj*Jac${Ykdu$ia!LAh2>*AfW_y2 zAW%urqaJPtVB|xevhJ6O6wJPHhb)1ew&=&ygYL8ooD%_bZuGGMC=-wS;1!Q|1G2LC z`@jGDwO{!S1t5%8(}vAA*%U#WKKMh(9(Y zSyBsjIq=T-gKq3_0Edk>>~ioI*;*zBwhde1*q*g(PkrUy`GrOOd>JAc?1ud(8&s_| zFg1JVvqLjSuZ>hgw&hRpHJ0EuLjV($Bmx+pND#v(G(&Lz2c;tscQmAg7SH7 zVEOxGQn^S7q!L5A4B+hNrBw3u%Hi*Y4;-{^x-5;1Pi@ZLdZ(NXQZoy8sj*(UHGlEk z@Z7nVhIB^ov*yr8Bc^T|+X0`r%#)Wqa0Xg<70uvIrnB^;A!B;hKPDO4rQ3gV7u=T4 z`s@1a*6XYSA{g<9Htgujx{LbK&K2Er$?pvI(q;4f(WAzjwAq7IKwa0yV)M6_ca^Xe z$pbQB*jup6;x{SCt}_E&yoQ6`hFwMwIySAOl4;qZ2uu1<_>&OyEEb*U_9fuz`tb7W zXWpp|WJhCWE@RY+n|=|FeE|dOM{m3Pi~2>N#pdI(&5|A)_)D%jmbU8`z~IqMjvVcR z9A#i84*WwO!5zWh^}`-1n|f5vw#|UI`#BMykL5nA0Q6xuRs_EO*N@k*f;{->qmSOF z`%K+m8&P*ynf_@1|KCY=KFgVRO#q2hzWmpJ{nwvSC3=0=T6z?C^Yc?Wctlkiu97bx zyd1kE6KOOjBGJYH1_;81Tj*Edz( zls;wq+I?&)6_|41$X)lyvmFxOuB-LvkJz_Y9I0Fe09_Xwt6=yk#({j>7WA~6u*>M> zppN8`EDu6S8-J$OF8$l*?^{?}yiMVQrsS)0AsgDn^nrh#ICP7C1Xm{lP1mK-ja+&}&$> zoS>7EuU`&J%2zzb>G9l{X5rm;ElEgiv#Ccj{P?O();fXdaJC5R^J3S<{)S05$8@Kc zm6tm?{X@B6?jQ0n@MWdF$%4jJ$%Z#Z;^c$qXUAG`^>gW%@~-Nq$Mp33{cc07%x z?a){2Z}f~!Z!BLp{qEJ(mE&>tZw#b@hD(2$xCXWkpSt_g1LM=HiZnmcOCKVbQ~!wSVK8|w`(uV{vGS2J^*c0KJb)j4607+gXMcEiOaN3O(u$T8f0c#eeIPV*4eMUOBu@iyJX63$iSXOR zWKz4r4w$kQ~ z+?}7i(C%&1Q>P7v{?vgjB^Mj8z&V&)=VXExcsKu(1~0G+4CRKx zQLRYdt5xO%K3Ay}^!V>Dg!gK`#j|q)s4BLq?WmuUL(2#WUmBT8U`PXT4_jANArD6Q zg17Rc0n>2i!WIW>xiF&!9@K`d!|VFNP;Q=yrF3?!+dkl@lj&Jrlh8tpIMOVmkS3XS>+!3E&2yCW?F{*i)a7 zuB+|=_{T|8Z}f#t07tnDQf&3WdjKcCC1YQM=K5RtwpXPHK!QZphNS~i(|Oy&$82dE zQTQmExd$93Aa8B%nOVL5(&Hc0iRYGP2HXxl7$QkmGh7cGzvCbDyMXKUi(?wo=>v9) zZDeUzaG56zt-cgs;y_9CL)R(*KF;3AaOOt`DRokxgacpr(;t@qB!Zqh{{*~beC9`1 z<$>S(z295ao&ERdr1YSf)jpAvx!q-JUQY==C%wMUl)fZi4&*F5$H7SaTF~cpI_}Myi`@8GFD7>i%d0o^EEYDpT zy8P19BYHdtPdP$A<+3`c={;bfoQe)AqU3?132#Up-1KOUvXrQD>?*LEUJQSPOODj- zfulRPYnr8#H+g#ITKbJ^aA=|{XC@C~F{h8nCG7UacM?7UN4db^m&+}_Ef^&b+i~z#gyIWU`=6q^x7YiO({5B+IZ=M_xh%D!B{9+L$V zO0ELX0bapxb;!aGE@6$CY|r;e?tbKzy4phiakKc-!h7=%^6k`f0;rhQwY2!pRk>)O z@@gD51x;!tu;XSRbRDv}J>Wu5(Lp(!%E~xL4ifqF%_mmIr)PQd4_#dq41L1!I`MKx zI|GLouU^vbKnF*cPW0s=U7ifGOpbmX0vkTc31<#nvvIwJ7yiCU8-G^qbm#>ZGY82q zD77)aPL#U>8)~1w8ceJ}>UKbF@g3O8x7*!qocK_iK6KF#O}>EX!}O%s5F**aRJVO( zIA996i$4{Ti*8?%FK|VkF$Ry)Kxb-pXAlABiq2`uk`5*t`qk3O(*_Q zo6Ed{485h^VYm24Sx1=!2&f1;FVT}8fo5JN4g4Y~$tmZVA2@6%D`N{cESugYO}S|? z3D~wKdha>G53c#q&6%I40Kf1Hzp$pq$am|0)cbUQz_O`Rd8wx^Jvu^kd(?oF&f;Y8CV-SB*H61{?mv0Y z5@-1&Cy;rgPajU4zou2dQ=>Xl*cai`Cwxtt{qh{Jg|{t3MY7Y=cE4P*IT#RgTPcG* z?Wbt5mx$eRbhPyZ&dQO+Hiz)mO+DZt7rDTc1BaMl_(;N=5oUP6`;V#qQ|eLE0*1kg zkU9Jn1WVVEbCj4C>M6)mNT7xHNa^UFrmX`%0{3cCw)V`0T$mI5K+v(7PV| z8b1TBpp~j72*aP^NBW1&gi{wX*hpFMH5`0dKeq?tgMd};mwA{RC==Mo0&|Igy*%?X zsQ`Af^h8D1y!lhRHN2ToZN0Bs)mUF4u?S;i>|+^z|8tQM%Z5++Nh zQmzj!DRh(>4uO72eZeolln+#hujmb1iTsiE002M$Nkl61ry} zXmIE(uAhIL+JE?;wfSeB016wW4bX|N;B!K!4#0WlhZeBg5f~hDI0rw6kxd!U?Hx8< z&H#oKforyurNCr?ZS|}5FF+0fZ8{LGy4^H4=BF{S*0@2Tipc$)t8?ctse=7KgjetP|<~#&)K=gryt;Tt-g^RgV$`+3 zlu6VfXoWvyOSzwX+6Y}~j=ac*ZU-i|l9o2-uUwwgCEf=#*x%^vufQ3;wEvzDe{plg zzh7wI2{QC@q@M|63pkTt`xShyx8RgFErJe_GKmoElyefH%;Zk4qwD%VeaNwdet5uh zfG5Xq!FCN;`Udpc@A6Om)K7gxEARJnNq|i==#PANMWky<^#8NMC)kzuod9Ys{ix*E z<-`+mh?!@*r2^If9@q2f=~^Zl(UqVg0N_Y9Uj@7IR5lOwfEAg|jrD-B(!98KC`1w&DjqrmqQOkAx4T3hy$g25mNQ29l2) zM9RaURBQ$e3(2$wYgr7j5mll~)^f;D zJMk}1PR~3tbK;&0icA6swEc>pbzKQkd?h$h0E}L5%6S59q zWJ9kf3uKTDe;n-K2yTKM*<1xM*77DIHwDonS$?hQ2edl4Cv;dLN=fo(U3wnX=jOiI zVEX^vbpnWrSz1p07ajBIe5%ADIWwpMJgMsu-wZ?!zR25+hNwHCm8VM6BwKQ9=sSRG zdk!64;mJTSW}b3QBdf!g^c7+44%8X733{pWb06uc&z#oZ@&R8l?Sx{0Fksw~BS(0R zH*czRHGJ?nQ^$1lF%K?{asb*M>adZ#TvG5Y0X<&alej*)W%Oj>I!_JM=GH6TqAOs# zT-BrWg$YfS0<@(fFBuT-FW_VfU8X@#JP4&7@*q=QyyhVfIWiJ>QURJ`Q?BJD*|~P^ z^heZ=hM;A^;tX=p}{y62O!RJZS1W@&ZSYp~}Gx zPx97s0h`7IgIy+g^Z|3EF8qK8rHO|Y{GJT(L5c53kbB(dhd)>K@!t0+-aep}VDsVt z4mHX3kq$0>{&PWYw{@aQzUu^#jRp6oKJ}^pTLxdj5v8sUfKRj0xHhTG$gr=G;Y+8L zJFpOZgJk8wQ)H0mg`Y!r+_yL~u6ODi-CaI}j8_4gkvdmid3Iba=8lwq&e0>j)N7b> z9`FTEsA~p6;^-h=>D4p)71a~DehFGf6XMtl-LDH<1~;%pTj?h25EF&+e6gsXPS;lx z(3~zq))-VUX59p)KdwXA@Cbqybu+)GAb>M?FNd1xsw5Ea%@ z$$)~8hs)SQ4!-NJy?j6)fjJ?9*23G9CybG-SgpD`J~8#o-g`d$y!QP2{tJ52mfAb{ zO8`TsFN3etlfI5VE*}KJAMo%dEQJnW*>FHp#t6ZkFftq@0vz6i$-|cIAtxU5+gUYP{T;IzdMAYro=uS@HVk1=;jt7Q6E87U@EF7sBDIngG~R$Y*$9 zXlkJzp`hiWdimfsp`G;2fJ3YT!XCVN z8N;W+HuRR?9(@ROW*1$MY(p<}T-GIsei&gpIHO%dyy3$xG8LbLF7Ral!&LK7R&x7f z8Ze zCB5q^xcHNk1A2jVn1-Lopf`L-*uOB$i$B_3dP0-IM`dq1-Ni2@%Si63+Tkx%z8-WF z`~A702>@qEfAcqg^G90#o(W|QQUw|boE#g~E2{^xOioJqklT^L7cy={7?2}N5W0R3 zVC%rCcP@-h?$vV?#Zhz|{3J2M@5F$R+t!=9!cVQ<>i9uz4SOVk8#r1(WBH`)M+e9 zOZ{~A-~8q`zqwD7!vXOi(pLvW*;>{Yo6p7OqU6syxg70UXgM&cw~`+n29K**!PX-l ze6SzLz@+4X)PRkPJzx{yO&uwZjet!{JbWz}wb?(l&Cc}EJ5DPAG~rSY_i^J$G(ALPnuQ+=a|U|xBt?)q;c|P@x6rn zjiei%0C0w+cj5nwRspA@oDR5Qpfd?*6|g@WTzsW6&`FhZt~97POhYDd78X79(EFQ* zZo7AWe0u*X6N2dO@Ftg((y;Cm9J=E@dj9FvhjpQcl)Brn#LSoUEJv=a_{iSu&I1oT za7AzNC>mn4MA+Ml6d&xhYwdzPfA;c67&_EJ}UB@&i*UC&i>(Z z_5oG%;K{mVS^AQeZDLcDS*sz`YY@IOvB}~9!k21Py zm@;^9Bm&%k{-l1&=&NarePqDbck#jJBp}!?{V);01D*p|Hoe zHT|~4&uDdUD>iKaph+^-;Uw{#?)?7|D9SgIZg>JnWis%EnVFeyD9}q|1kFyU62n>r z>{pKNdS3wi?ZXX@vpU>q@F=;AUK#*|k}Jja{mijD7H3c1Ge6=>fd&un|I^-?!1-B~ z_kQ-tWG0hL7P3JyAp}Ham7=m}3ZnK>6<4fOalsYqax1s``Czf)(yAA|AM4sh?8lE6 zE0kh;ty&S$s+2_*1%XHs2-)|U%)aFQzR&wSXU_kf|4b%8AVAK{`#;Zl_Om?aJ?~DM zHe>eSlINVYqj^S0aq3h!^m_-HqOgTdCG*J)6t*jTL^gOLXZGg-p5u={ewW%J?vJR} z;t8ks`YqO(Tf2v!s|Y$bFjws~6Xg@6B&#O{cWDB6n3sz zJyqq=&*b2`OrCNCKd_HE`!pCvN#Kyh2E0rJz{01)0q9Hw1U|6F3w!_B;(LwqS?~*A zbOuV56ptf%qxWrEQT}&<+?un$SZIm8y`HBwI@#}6E#+9KJ%H+44rk>Ss#?#ABwenwTMZi zR)-3A>SnyZ*2`lbG=)?AvD=8I$ZMTJ1@!H)|J0pGzml=zRKe7;(nDpr_nJ#vbM&%{ zot){GOz>D^sDq+xjqM#~4OtC#|4?HcAs(~SGHc$Tf}K6RWU;J9)r?9ia7BOzT!Z_&r7YS<&ki$NknGu6wGoW-8jp?L>bW4JQRy zHWBRdCI@@yQy#FmchCvJxC=tLY_b+ z5a}PawFM~((T$(r;c?jZ%DIfUb>fqpH8MHLeGGe1H}V9-hfbF@nBYb?lLEocB)~FX zcq?fMqz>GA!a8L?GAu0o`3Vc_N-A)55Sz{^}OVP-pH>}auZ74e~<<5_cb+qUL4Ymf$VB-n-z>~Al z!1awywgRYcoHkNl%(g}gUNhjj!J#W~IUG7YS60}VEN75$IZz*D+^oI3eQ#a-R0bbN zk@H;u9{IKJ8LDmgEf>HuX76 ze$`s!Vp4-I4Mu!j0a?pg~o~ioB|qrt;WJBim_M7?RftIRfxpipV!L$?AmLu{jWgoPrhG=04Sys zRGM4^`d{TBUlKl*3KwJ%)KN+t3N+{p_*}IvLojLn&?+YS2vHuPY1N^%0Q`M<0DOH*~;n zzPMkxPgXDdh~zvec(H}QY)Upz4an*r@}b}9rWC^=OYXd;Ct&AEPPiUx!%W876`5QP z+0335a~$${{h=v^NJT+NqhTK&O~Db-I_ z#-TVFZv0FL(D6wzVve)d=TLx2Kr6!dabh+wJV^ z>`^dt2ET$|GrTFpA)8iF89wp4PAg}=Rrmnj$A#%aPi`;Qk=Xz&+s^IgaMBm@Zqs<8Pp~7{+Q#{e zp2^6~inIC?%HzM+*V;*NSr>bBy@Rm0#n}6i$GE}M9tPtRWyS$CjREUV!6Ui?P_GYt zzDVQf@1>t_aELu6_;^O3UptG-zV@}ReFlo^V)2o zY`R?DU=x-;c#wkztPR+b>T64K+Ml}POTf;OWT3&14tSzWe})V=U~FL2@n+odMuQKZ z(C4r%@!?_5PoU@Wl(8e9Z26DuRaaeAbKZI9&DIsB|0z9j)*rdl(c1ghXy@`noqM_t zeaPeg{-#HK4j_!Z``z!pTeHyBx;ds>xYW~fgrYgcE5x;z>rf-$p*2vJ<8zKHmvh=a zVcE3V7*|3s9S)r1f>zF*$8?lwlu7U?S))e|&1LCmj?HR0)+eX)Lzf9s@;bu{A6F98 zhW5U}+|RHTIOGKv8j9acWok!jcPAu&T`t-sbWo1L6YXRb#U>jmWL+mBp~vKf2bb(p zM#k}>CzXwP?8k)No?$cCY*QAYFjBJZYElqWc6rT8B!5(c zY5Rg{BochmlY%*LnY_R;n^S?M&();Ch>kP}avShYqSNH`ll*hu7)%wiR44R>1Hm77 z6lSmue0T%rFl@Q*ylgQ1+N@3!$wJSQm!r+C4x*cF*|l*Ix^g*qqU?OROu*((*dTWp zQR6Yd+Xy@8VmxXCHXh0uob19M`pBm$FJ0C~*g%eQ*ksbrV1m|8{4oi@%N`tl{O9-| zKs$p`oeyfb_10TY)=gsX0!MN_gC%PXuX9M>(Rrrp%XDMfkDo_10k|)m2Y6UFt9(bt zBpXyw9E`>_XT`_yO@nTHnX5e_cf;8((fNXxJZ-9Uf^+<2Fm@)QPe3dCf!PUllys{& z=C8xx=&+DB>tFx+M%PRBh|;5)0I=w7RP&}cz3CR6 z!1^kcQOYL)D^mx(qNqc&)(r7br}CaJ8voJc6(_)OFKxATqr6y>jlm}Tg!bjzm|U)- zfT_=9bZF5oF+j@vp@TfqI3C(I_r;VIxLhXL3f_=|UyLS(faqj~4qnP2Jw>pZ&fr17 zWy4mXWK1^qJ;@>?(cCVt_T~$)Bf~mJHaO7V$TlQ+Z+-JfT|<)wkNIpe=BN<(fgUCE zBk+bO2*yL1z=I##1e%hSJs?f52cYpFjy_~u9-ay13BX()nB{xOD>%cZ9rK5M&hSIP zFJc6LLKo%x?z?aJt#5s6tAhU=@%|Aw*!dyhqcXcKS?7%Y_I0m&-7StMd&DUjc*Ghc zh;LL(`O#;eefBp5pGE~m%JowRu4@kHgP7~IgxMpWn1F)Ma@REu#z$zL7!?LO&I*A` zOxCe_S72XH{iyE5V*+SsX&vUBfqG6*Y=xNf2f~m}OgP!04xu{X%Y4w|OpyLWdeSafY$--4`f=%3a$bKA7Tj@Z&Lb3s?_i0+Rn+6z_K!*$b(9>L(v*9<10 zbgz&dOS7!j@Ujzkw#25O#NOES2sVE7Awv!=m(SohiD-JUE#Hk_HVsA|o8Zx{J$Qn3 z^4oZzfk&PRL05+CN`a2&M?dwcPmTP=U;M=jbmPw#gg+b})h!Kn>M2_cz#Fc={`!k# zZ#68+MSA4v5nTnC$ef(HU(1-wfBfSge^1WZOBuu)9*SJc_syDhLU4{6Wk^>B22_a@ z$f38Wdr`_^Fj=MZ1_Cx3c_bapsdI;G^~Io;9qaCIAL{9D=DC6PMV-56%saeCZyM&R z1RX*{Dl63FuyldUw@{zs_6cWxhplQd=pKj1G5KVp-i?DArw3fnLyya)W8tz~(5W*r zWgX6Mdp&rZ-vXut=kf_ghQQ-n4a0l7rmes07cbnsdHo+Y)QqGXTNogEfOfEb?%L}Y zo%n}8(375fc<77ZqCOt1)HnLy>_bC8TR4u4r;xXz@UWXc0Qk`7Fqx?U=laZEt{d0{ z^uzKUUJ0SALME2>&>c3pIMzo8Fmz-;_qopveei=He8wGj-0@}|3LMTvA(n_6*sZKd zqyOA<&;69-R)a+T(Wck~KPo*qLPL-)z4X$XHOqa;oeK{OqI{;p+##rI{|yS zYdug@){4>*a^#RL4_I{e4mP8L3w(mL!|mGm(Dc>6_>ZMK*W5dI&(`%b^bNsT58ZtI z(sj4~WO3J~2d9tdvtlOa^4QGngf8I)76UGD`wkb0KL3cRmU}7Of{R4(C zhl>fUnEY53K&Fn!J8Y92>;-EP4Yt$)q>KJ#~NUN>{?O+P$x-EBWz)YrA6 zN#2`0dR%wKk~{QA9)3(Q7n>y)w+;+DsZQbuINCGH;ajexjDr?9bX(aC+TCI-aT6$(nl;trpXKR;h_P*!Z97R^zYh!LVtfB zH@=u2RG~*H)EeL>0=BUO4knjPF!BT>_#9?uB)n}t4(<3n9bkCS z!JeL6J2m4I+2B|yXqlhnbwb?ggPkvb`OCvASFU{N+O=!ng$(uNhlJfovU8sv_W6od z&35~EP79t#l0Rk>KyF;lZRqUme7{!+(pXKbUiOXj22B8SH1kbYBNbC|(b>^a5--}K zoaeT37(U4NTR$N7M2 zf)F}32+%UDU^N%?lY%>7m}7}f@FI^+g4zQY*yJe_+|XIR!-G69iAez%9nNR^6!_Nu zIJ-g^fhj||MtcA|Kz*JY+ZfV>{^{5R6j7PLe9*ggXFrVk|+5I zWKfs_DC!oxg(*}N!J6kzOYH&82Uas z(s3$2DkU8`ESXQ~cHdtLS6pH!+64YbogUK(AQ}X(1n;@wh8sSiPPt7Lq+)556=Vx) zyELff&tc+&ZfBS!3qN9(1IH#l!^6Wy3Y_yW$ZW|w*xTDA9u+MmAj;5O2a0M3d%9XS z-u0`c_g{b2vHGq+8(*Upui1tVIP$#%MK!(-zi^q63!Uh8}6OK?#K>_$N6Fiw(utmLrCU_+Y)ZU!el*U7|UJSv+mF<2QN zkjD??*~3TRv;24ecyTU|kdJ8T->jFszC*YBo`)=Yv_-oZj3Uu~t+W1Ds4hLmREz__ z$0R+b69693=rn-C+w~OOdj;DkzD0`)I@toaRGcnZAyJKtnL$_Xkls+^XH)GHj=11hNufn$shw_PN zRqa?UArH(WC zjNdNbp&MUxY^9gAH1x(200X6Doh|vnhL(1F#ytE&C%jPx#3n(R2RnSSRa8n$-Uf(T z<)I@7PX-$qJ?Q5r;0Si`aSi}^f*Y0Mt2hV1UL3wW*xBP#Ch*C1|Nh<&edt5IZ+zn$ z-=Ra`*9uoH1|v@PtX#SBU9!2u49XAeKbEPQ@yAj>mpE?LW3Hc&QVyojojNECsnHsA zgU}ou4s>V|V3}isiOvW(&%sB^@eW&W*Ecqg&RwRLbeK)4DfTERL}xkSnA}s4K@qPG z>grqPF6yQf8#V);Bo}EcNYR;>Cy`6KF%xoS{=$VZ{Xxe!$*4G1Ki3mD8}#7VoGo$48g+kAe4OFTJi#tsK^3c}0I8d21QAms4_|c;f4ZloJ=n}u#@c=cm zVap0I6!o*<1V^w(KvTvamoXR`69rrFIc&j3PPtYkQ8-ZPfJ^}1z~S@g_rL%B zFRP)hQ^VRB6%nk~%EemD?ph|bXabn8iJ(oqw)A!yy!*2idoJA+(!Q{>d(ktW`(Sfh zN3VKW7Xx%cNCQzlhi~Bna7r}2-r_jYcG%(Do3(6JG1;DiKj^W6HCdkPtO5%qB}x<7 zW6=1(F;>`JBnD6N+4WTLIe!HXTdtFxw86Q3hbv^9KjAVR<_AiIv&qb^>o+v^sxa{) zK!*sm4UIhtNpr^Kqb{Zg-!MpW`_@hbE&K{%!&iY#jv$P>xJ==n1U&GKPq0lK@KOf? zoe9G0W9ETLj!U$xY`(>D|0h22iJsTI<~1ud#@{YKj*>~!g9-p8_<4A2SQE%q*Ijqr zKL}SGABY#dk99gA697))tXGg?*K1$<+K;FqZl?nvYm1Jg&h%FePYvpPz#`?%YHT~$ zcRqNhw4p0_8=9I&<{owYw#6r$zIM@Zr>&lK#EPvAEq3#f=GS34Se!)4d@-=Du3==( z^5ZsXNF-el%*l!U5K9sK#z=*#@aF!N=*W{o&J2n_#|16VgHCR3UbcZht|xdy-eeF1 z2%eCq3gC*W6n;4jd+0FP;BkJV1x&75@R3g)$JS1;0>Hjji46_Cdecwt3vkkBhGi^p z*ac<_AAAz1*!vUQ!3UiC4?n>TPCP*iyLQ|Uo{fnCJ#NEzUDo;wJbD=C8t+L)PkavO z^=`{`!u$PN6`UM=;x&WF03)Z#<_>)T;jKBgm<;5o4lL_ObthW)jQK}&sf=$^v1@!@ z2jd4u)(54vfibyG=)nVCshS;AAijy{Ap@OJoou4pjR!9BYPxcH^EG@!hwC!Az*F#q zUOLdt6+uLSBvO%U@ux33Z4;jw+mgu@pkxH-66`?zwCUURiD$8;pthhy6^g(klfi&y zpP(W@*?_?l?1JGjIbg)42Ry1m7dlMF@o7cidTa#%zw0+W=!cG94s%#wJUSGxLj=)= zzwwQ4%wDiy!G|;vyg>TnGDFd^g>MEcKGy1WaUcEo$3MQ>T{ge4dmxhc#eq;grqdh9 z5W4R9fi-K^T&hNyLqiIg`yf{C)u|g*V{Oti1M9u5a-K28C5TSIR+dr$8aDxPW?wga z*Y)k%+T62ceQWQ|Ev~0&;Jp*-(&BKe1KYi7_qmJLK&yt5-PGF59iw?Pr z-tk*8I0J7ZtKgGgV&6MFsD+2_ek`0cKKv4o9kx`}>2~1rfmfd7BsLcOWgRq#WYgr3 z(E~RoFTVPwX+wI`F4xd>tfadvgDx|m&W!{Bim zZJF8$KJ8KCTD|GQA0KztF36b!)TKyvf4=LR103qVyin;LjZZKA=Zo+hj{Ai z8%J7ZFX)=FuycnVNaDRv)Dzyg)CFvNI5S$%4Cj0ajzKRxDd7d%;H2I;9(^%zbG*X@ zFm=@2G+5X5@T&O(+a8`bIy~4QJ+NpO2M50fgl;+wTu~X=V<$wo2#={BV z1D>)mjF50kuf`YDn$l zYIJC^eeRLZTGg@im`&Q#+Uu+(jWXNhrwv}p?r)+654qPD77N~-=CU?`b9_lADq!}s zs!_c6*Y8~Yo6fDP?>%jxx9bSKu0rCT_EkBt!GeU2eEV8w&Aw~iiW7g*vGf`1wTeQC z`7HYAP;K+xop=8D#NKTWKV$FEU@KMS+(66R#lM|-;)`!@(VOm=9BGRPUgSvx7;xaJ z6R>c$$2BJXXxt>(z(sIUc0DLf?d>*FyP+37;IpN?J>jQ`1)H|IK$kY-0q4VcR3CyF zU9)CQgTB`DD!mf#ujH$J+Z!Hj(V{jHDENooE2b zF=w<@ErV2>Ejg#P&g@t4$9Oi;P50cqw0q-&3$5?;DN1>mcVb~<0>>PUom$-vJ7?2< zw>RtCg?$}Mj@has)R00S4Wq*py(EL%V7V5?N<$uS@x&Ug7(C_^_0tBrkaZe*z{^QZ zY7Lsjw6`oKPx&By9J7uVZ=wz3I_w$gUh~^Un}7e?mHM{ceC_WP$XOlp77L;AxwvGy zX1Jwi=ho+r-g{fqj73L%LvOY&p3g1(tZm#oFuLH>b8pg#mYD>SdbWJ}sb^W^= z^i6j@jAv~Rd(_YCO0XLayu$>u;VA>lEpHO4TAaxTm(i1K=%FgeViP`sn6k#7UCvY4 zP6X=s92)GF;Bg<32WJz2&SQ;gYt&n^UZPifeM~Zw1%Hh$lm9?GpOyUM8vHo?xK02V zj0RKwYdr(~S$$<_wi^0WNZRN?8@-~_A-n*gUNh;Dnsry{g(JHiFSa6~PpR4vO}LUw z!iSvGZ2;(sZs>z=@5o?(L)WHt_E824O!p6_{Yb1KC8-xc_U>-$-M(oShXOh*&{9u9 zsUW}y_QFGZc26H3?5kJ!X>e)pqGR%=8MFH88=CY+3At2EbmlAe!*_w^FFD8CBRYm2 z*uHhT4p|yUbyBUaR);*MtD~o3TB~l5(w-AtvOS_za^JQM^G6l@3M2GbA1L3SLKj`Z$os_om|s8FIF=C>-#YzRy;Jau!~6x?6S*#Lm8cqXL{TxfV^_LDdH#k>gnI;DW}h<;>*L%h;Ot; zCkORp8rU(%a$EZe+eDy1Zyp^SsIQ;iG|1jo1E#jGYkN!A`Ue*5-uU2>fxbPnvYHi;>bK#OTGZ!!4*xWX&m*u)SSGW_tM}27v9=vJk-mrS%&JAmi8R+dkYU_WUkYs@QuMewn{k zf3=BL7c}T1zz#bPu#`@7}(2_vVKmUUckpe$uh*xOEB@wai%K zVE56aVyRPDRz%6IqCMrLsl{1v`0F?;JKp+Aj4%g}1t`L?m)1BjTIeQ-%lhDt;1+0i z=W*(O@QQPhv+@XcGxD_kK-Q6`vi)$%X9D)Uc zOYu^yI22mk-Q69ETd?8~JorhU_xZka*7^5jt;xvB%F1tM&(5BG-}iN0p4A^D#az!F z$F5I{A)o5zfi@!RG`KLkc{KR3_I@1Ltja5GNk;{KcZI)|(yji*KzU?I*OPLAjInAq zpSOwzR}`XXd>m5Cg6*t%Wj>JYuRUlCB(JZY9|anx6Wbn-NB7Fp<>UFTU&mw~`uof< zqZo_)cC(?$`|C7ZCvdvn)~2@0k~PzEwP9W4n$&EM`=u@y%ev8eeuMn<@e0SYyv_RM z`UlzY#Kn+iiKNs3fx39d#~pa~lWIG*y3~o+aACEdODDH8jK~XyD08Iq0z%cYsxhiw z$~5T2_4i~gn{SQmV0!3&sm{d^e;AU3d!nM~k02{qF zMA;w}-S4xcQlbF7NlEz%r#WvJ=hwmg&UZbh;*t$g#oRX9=qsXa4m57`D4I3vO6On< z6BQLxV>cX*_T?6fvDNUy{KZek_OhgRC5tp^c9&mj@|p!C3c-iQkro4^e+4EcJe|DE zvP?j(qOA%0T7t84}xYIh4(7BUvp?P_M!4C9H+J4kl z7sZmC`CIzt-5lE2Y17H!E)`CB*T%PAsqZks4ob<~^3rcw_HItl`CFpVyt?dmit@@g z^Rj}*6p*POIbne17=g8g99{1=Wsd8I=9|3>##m-PHjFC zRFQFBFRsm-iFa1JNydw+!?xL2L&egkYz(W|dfFEgsb~L8-7%4`%@*C?o^>L(O0F|D zqoRdjAdJ8KlRTh)1b0*0xv=>45Uqj0^n&n3d%d@U^R6iukB`Jm`(8l|&g5kPe|o&P z>F-~HNJ^7J;tK<49H@7M;*5A^r^~P4jy<3)9FX(F=Rni5AOf$PTq064%B?sfw=ur4 zJHkKdd~Z02;@IsBs+$ob%Rq*foBRZI@W`&j^X;h?YWOM>x7Y@eq%F=E8W_F2McC%lCn#!Ddrwvk+Zq0}8I79i@RO6^`sn@U#A zd6q4Y^)g*5_NN#lv_(Hh?6svkTL&?m?AwfG5Skei!2s?hNNpy_I*s%k96EI-lxxeu zk;=tAS>PtnM;i?fnG3CL&-&f<)K2=w|9)ETNXgmDrqIC#I1e)RE6kj_Ep@+0ru2cR zK`yA&6hjJ1kJrN}2*=7CZa`06Q5DlctI4N->HNOr`JcA~bO@QJwDlohkfbN41lA;& zzcCa27`!0jBtk=qEc=0)!(u*wyne;-JY2nCwK%axMdsswKFPut{Cw^7JXdAESp8fy zzkG&OQJivD$zlPJ+X$juMO*R(kNA z2$TT+gGu{A=p7@#_gC4Tp{tl+uP1uP#dSjm!mOg+iDYQP$Wr-@?%u|TxRrLZY{^KC0EhiG3-s~xIpr4`D^lm!EqXQPo zA!^)8e8^bO6B0!dH2*$$qMMvmOy(|Zec9a-n&#wpk?sQ{rOs46!&2LLAUcpGDbW1s zl6X2*5LbTJi6PGUpDY2DG*p8&&AeQT09x&W5l%NMgw#5^yK=$__sXC$z&H!_jWhBe z0x7o^(xHB(pE8q<(kM~swq&(b?)o^WU5U3UtESM;S}0w%mo1=gpMggAD{NXUKLXP2Sc z4onI0MQ>5e9dYlWOO_UJ&aD?jQq-ufy7Yj+(#|LG#2AsT>opk_sD<9b@|LeiC`9*C zN;iCW%pOB%yo}e#rywk1PF_9aCMDru_CLc=*~Ms{c$j>LrfD!kgQ38!(Zk||-!<6= zeww9(d*o$EHVUS~+XBjcdLYCU-c8(IHXmtR8oL=nXyX@z^rOB(d{$uAdf#<4-hdAj zr2V|Wz;2dOlxA2F)#YtpshbeUkvz(pj(5#a+tdri77ZS^?FxU&*G&U~y=5CvC3qeB zOYz=lqn_xkc2g70j7{?iYu@;@ZGWy&zgzSv%AA+4y^O7A6LytZ&baLeCDvBgP5zGA zm*9yvV=XFp0n0m?FE$5cE4fDWzv?va!mLSjB>L>01N8LP7ZT{QTNSkjvEUT=6yb$y zeyGaD$+S;YQm^55t_@$btfS4iD>Hi|!G#V)xU)?3zamOV~(7u@5;6 z==D>^MiE%oYz6K@oXMJz58~LZS9-smb5tdH;LxMR8UY&ygr+MRFVTRkb#RY6I)#u8 zx#|M?UxkR)=!zUtU3aPkJj&dGk*}!?#@I%cJ5M6&Bnvfmxxcw#+{KxVEuEGvbFtnf z#G)4jj*jUaAaYNXrM>X71(Gw0-}6U{56~ku&-KfPEaT5r zJq+AXmfiIDv>bc9Jk#dv<(y-@)u`#AaOs+OlAOGsZbjuXdb*TC)nXFtKN$P`nx=`W zE3}-8ya<0Gsoa-Pl9z*=LsS`Nu(%Vz;>F_|nsGNjyw{1CRWX6Zssv^o2B33rnIQ;55Y|IFHJ1$u#_KM>zDJfO?;aa1W zhyQ$ReOr&rmAl$lFk8)Ek2(&6_K$(X4fwU+nUU8Yr5g4%s66Da*iqUHN^C(l&G)-_ zM=PRsUS>H(^->eawG*p+c0*j`piLJqP>yMfI8mM1(6$VLdo2xCM{qc{pku}{G{Oi` z8m{Sqc$ie(>?iV=tVpCf`xS@fyRX=6Cdq`TCwd7_#h@}EpGA?B_`~(QZZqLem+_XmHqePL zB2sq4Z2Y3X6}}k-oU3|b5I(!XcGttn+{%mxB7YcQL_Wi{CDhAPG7HX{_^ZlFY5Mn< zg_5^8?PzBY6Akaqu21-!}z7G?6MRuqr!;K z$rovAizC6=EvQ0D3wZ)?lZMYj-&xw>eH`bMxGN%i!Rx-fz-)SnUtz|@0yvLNu@h@F z4-^&1Y}A2x!^5=m2w!WH6fEj#qEL~>sHj-Hw2Ls+?Wz53A>7PBs&lCZq`$&Ml0fjcczgAp@K*cQ+?HM(;RC1m@Ka^m>Ks6< zSfy621?&f#uXQj!N9Fh17hW%jjvr(6A>;HfAGWK7ezrYTZX19ypF(C!bh9glpcH4j zk0Opn8;RQuuI@j~006=eC0VHt2Yvzm)9JqD8dF)jo}!CV+2_iXm*ZijMyg_LQ1N8WpP(_TH+Z@!!vS{aW`3p0y#3tzRZKT_Un})iFKL=+~6DCN)K~u2=DW zgD6C9^1GvFTMw*h>$s}YOP~OOrc-i*jfy^r*Y~~dvC||Chyy-3Z(#WzF6&Hga;+@(d1O>vWyg} zB{Z~{AL~bHL#7(?;QL1Hx`O+sJB7_U@zCqfDnRkLnm0Px`AX1#<}+Fl%d4$s zq&;BYchhT@`6*#yeYB?ld@R3;2&mN99g4V~#kag=bh_X;R57#Hq(qan`jtJW@DLm_ zOoXEZ!`5n?Z-?dQFGhfrX5v(*IltD6{a6sm&W#BJLgkYlS=p4(2Q7i zVN^={CVVKS@1^{@uta~Occ~0Qo$7=h65QX-T83WgcbDosIyheG3t#(}1{!Asnv%Oo zm*mH1mPplV`UzxQAJcWu-#H*Tzjm7tyD@I2-Qz$zY`W!T;6caiY;A|){;FwMc1Paz zOvB~33((6!Xo7YH=p~}jS=UmGdl88_bFze%e*xv80h2_BbaU0-vsfI-u^lje@1vcy zG=idc%nU3_p&P*DP9B=X<3~dyv6xc|*e(G0>D&33Rs{AlF}PqMDNNOG;rMVl9v{L1 z!DF)kwLq4?cYoVdb-jlUYtmC`*_?K57^OEwGv4#WB*D#|zZy1Uc-eS;bb17>+M zC}He^Xu42{8I4G6){IfdnHuWu9nEU~86&*!f+Ppf zaGgN(bi>1BUNX&rd*%>C-(W!6%Szqy`0B;rouoQZz}9*7J}Nar-$v&>hF_4;9@nA* zKzDG&V^+*#53d92W)v!V8Lguk{)KnoBP>^!8I8wszqV7svy;=Cb2-FL8hcN)vn!tQ z8&BIL-%H$mG;X&B`^9s9%H0mV!qlb75xq_cEpH>e#oMPi6BD1Ng$CkMoruV@H*hAy zEZw`IzxRUvZ8d}@JNwPbFl4ry_QFneYKu`}2`^GqZ^ONq47|tY)(f99%#)d5nqV?n zex*ixvOm$Z8(NF|dkkL{BN$DrDSLJ<35{qCe==kyK$#L#h-^8G)Ycv;b|qTrr!0aB zVR^DV_Y6jx#Nx+onbs@xIcC-q>N%+$uqxdNCL~{EV$n|etM#u`3#4m}E?cZCYfK37BokXwmJ(_nzBXIZdcv26?Z2P{$PMAo?QSTCt`WFC) z4!J#W)22+=lCnB0CxqN;gnDM5pPOeV1RU7%XZq!w7_2(Vi;HcL?^IpH$JFys;lrY+nx^Zf!b6xhi~m z;~$)ttA34aADhLq_;%ZV!~e3mkVhZ}lS;TZG&J<#RTSKMCHgvWFPM1NQgq9cqPYEBh0 zjix`m(5Z7!_LCgV!?&zIn&y&@LH6wH=*tA?8D7?ISrQQpWEH+XJNeLn|Fo8Jv~s@wLere z=Yc_lc(r~*pnZ?cnC4WQI!4r3EdAfyTILY}(ksKzPYLbC@Ep3FM0g-+3HygYj*Bk3 zHOyWY@bH88;$xadeZEfyHL2L*>+#E65&JF-BL~8Oi8EA#qp6uD8O)((2|vk zt$X1%RI5;NKF@mO=T~fx#5fWvAImJzHAm#Ryy2S z(^q*1IA-v1|ECtycOG`A*~d5Y9demLx}vYW_+$?0Bm||Uj&Pw^ z$t+X+piz?v_udOD;?ky6Z*nsf4?Y;GFd^7FGq7O{42_-qI2<1X=$B9Xs_dI^kfw@H z*1WArDr=G#Y~Q(p^CWWr4fe+7dWY&I}2#LZki%z%A- z;)q*iYx#?!Iu-n9pAwG^)M)soYYfA^o=ca9E1ID}IF2v<8~785aiH45Vpn!Q+^JE5 zUs2x2dbU~wI%0_%p1S(S#FCm87j#^HAIEY+lB*TXk>~S1`T%p9wa7E%CAI(KhQ3_c zLmT9}G>O?L8i zlf6FrDryUIoiuf^)Qcl21)wUjK^j4XXrUk3Y}ONI-RYU|oPT}2^*dPH2Tp-d{0z-v z{`#{Ho#rnfaT^U?A3x_6mjUBEtcSaQNmGX}rNezueGT#pfNC`-te(|t7xmKXE?X?+ zySBh{Q8YfF7p*x8BN5&UQRcdAbh8S^AU0vmMkRqL`?=4RYAhjQrI@@q4i+#A!-(vK z;hiDI$ZtazF6XI^Gjft2v6d#e)J?=sCg?S2P1TZ>OCX<4vkw`e_T0G+u=MTQLgXZM zXrrHEptu6WEivekM69SmTIJEY*aU~y+!@naoaVh)5l|8=ZGCihQ*7!twYYeD3YNQZ z2S0DOMeN(YdHB;}U?Jxty5mO8S(MeB3CG1N*WFu#@$l`b&&rw+Km>#Fe)fu@e}Iy9 zreX5)yxcR-D;xH-bFb8HGM1kX>14;Z-B#RwP2LsYWa*o9{=rLC09$PEyzM6B{L=(V zU3Z5nu~&)eN&1YNh`C7eUDJs#q1mkTBmv8$!XILuM2@-K*^QvMsjTP4_tYg9oNq3x ziJo-H2VUTvsz9>lJB&|Z9a2P>v*6hke>zoZ;FWh?jzp4w3Ezr#Q~Sq59V$SD-&F}v z7iOAcC4 z;ql>&$gqh5E}D%E9OvM%B`oZ;_F#dHo4y<*<+x`08OoM-A7Ygd@N$JOGBNRWC0^;|0`^BxGtm(Dv-x);AREZqBg5j3z$S+V%@{ z8@qZKq{@m6P8ODE`YdH8b!RBT;~jFkSmh6W9DZkR)(xE)_-maKlou{Bw;=nF)^Rcw zol%T%ab1tF_JecA|#yjH1 z`Xt*$h-mXSxP2%MCAS459Lo?%;yXoysyeuU7whwbEi-kamI)VDA^vY_ka)w0c zX97r1nqx=~*RT0mb)gY>6J}odf%M&o>2-BVo7~87id{vWEQ-46L{Ztq(wAwZL*EFd z%aOTnI>_XLA0|InM!XL4@O#X-wc?)arz`B)Brb{DtfG-;6E3KZ*>Z>6u0goPP_4bE zD{~0e6N&bI>mZp_Bc?`Y6!iYwHq`EaMd;^nfR9aC6-&031zIAs=+U^$E>&u<1Y zf75~6Ym<5t^Yy41|HFrg^iZs$)?fP_I~ zUunkM2x?AWB?n@Jva9K4JnPdLez`8CX~J7 zoHl&0@8Jbm;DZR^k_W5fV-xlzLd@Zr8!RFVuE_yZ9_fJZH3(7A_u1%oj+AempUk4_ zj}7>o3A)wUJX?f7&bN_b)yR1VSKhO^jgOjs-ez0!X{e>pr+3a{9GAhm+~Sn@e9WEJ zw&{5QYr~wRm+N1Q=;wrLXMQNseq|M$DxTwVdCmXc>qR2Tm5g7^(w4B;(*4-7W6QAs z?QV0P*SmEEoDaM(aW8^+CfmT*EIOl;*Kd!H*Yc&jVv#xg;hzbI6oB8w*t4%}W;;jJ zJy|%xi?yGis1|W%{3j+98c^qVU3?zbS@lLK7#U85+OYFSfQgH71&!l$e*YP`1ghhj zRA7g4qA`xb@9=$$Adm`T$v8#hb65H0n1F8|vUR`y{1o#^4Y;TF*5fO$5)MTgfYCN% zNRcf1H4Bngs0Bnta@6Z~#MCd$QBw@qsLKLh%2c;%kwhND*1j*&d(t6_&(ss!_OaE= zGeXkk;dpI1yJ4|CiNZ+G$V$8exkCtAFg?M5L~0ceZ}%!@2%jZ-2T+7P;0Ys}K7-qE z8Q3;kWd(kQ(cOz#1GAv6fgz4H!I|=VY@IJfcLQXjyEbv6x;|@>|zsNt@K%(6cz1r50xF6&ZmY>I!e&J z)4nZDR{%ZN50xT)-sBNBT@&ve?$zjXx6gm<8XQ}XhCcBA@(-*D&Y|b{w z3mw;bu;>p+51s&P>q+xr)-M&CiD@Mv_Dsqmr7lO&ZZC1J z&pS+C`ZTH(2C^|hX1C*8^&)(^Wph}AAHfGF4Z;-7_t8A#3;7pxA|2;R6-N&%yW$Np zrPr8@-1%5bMKn}*5LH9yBr5C&|L&ipV~cMSf8K9YBBD}bb6Ku$fZh8ggDN1EL#-|q zP;{$eSKqSZUpv=ABA@|7j(}EYe9D>T_{DiK!*F~LIcJj&8>$e~4nNDJfF0p-PI~Ix z0pB4(nNgE#CX}+7yV?zr?;%oKyZ+tbTHtJ?%Y=1%1 zWn0j5t#Q$>G$rpEG)X0L60^rX0oiK$TsW>~)T*p&E)*3UdQH1D=&-a{`ZS#EtQS@6 z*e9?W_9=-Zv1#glzcldM+l{abd?v`4c2(FKMX>=OUP^N6vgOidLADm0yZ`{oy_A-M zv_Aj|0N{rFtSV232m%1eh+R}j!wKIID!^__ld2OU}p~D+kx&ZZ_VVzxkNaNl36PPzU|JE*937#-Aa{ z7BZ5709>Wdo_>Deah@M!B>(YY@T+L+>8i?$1tQQf1m%EQT52*PApmR{V^B~;n4hbj z9Q(hs;20VdWTtEPHOxf@fh}hr4hir@UwmDl?d^PmgZ&MRR-WLn2p!hgf9PMFtz7=0N9$-s|3g>sv9$Py zuK6+fzvxbS;wlRK@}B=iSF`eT1BE2~-{?|-09y+#UI2>0VuXge0v~USexIs zyoM;^Tfb9Yq5uA!HT8GCpbl#ffpRp47}8L}EBXKw!T4%ve^ex7W~oosfyWZ|ona0O zU$;6ZUVJhPql`+XRB@$`N|cR%C6uvoB(^%k({|di18Lu#YcjsMetc~938QlvG+e#W z{a7%r<6ff9*5J6RY`8y6_)f)afML>xH~P0$(b13kfE?-t%=x{i$9o0O(>1Z_ixenOhlB z33A~Ex!+d~7CbMs4l1*f-jt?f5K>BqUd23{>dN#sPJMfOdt-Gqw*(&_9}gE77s?55 zitom1vP{^N%I2R!Mcj| zoQlGFaK)vgu#o$l2U0>seMw1hqp-XC-2u|hGJvKRZRVHBG*}Ua<>>KJv|m>*<$^f3 zuggin5yNGl#<+QM@#>GHbZ|78Urd*3Sw}~Qu&8J&7!KR`h>l!B%wb}rOO}F8{EI~; zhc)oj4XcngrJOae8dVyr6~AT(N$*PHa#H3ID0cPXxhoh0(8J$L_ggB z3~I#w5yDa6bjxSy5^=cw8(^rQCR_9TSviw__N+7yUExI;E9P%}zs$<%TGyOPUjjoi z6h!rVGh;_hjayP+C-+X3C?{uStKEFLCA!!MF1C)MVUbRW-Jl+AM@jR$?AOB<-oC!R z`v{NBi8qMh*y++2l=JP=1+>TINtc0I1}S}Hr+&hBhTZ9Bh`+Vw9m2*Kb?MBbcRX-N zfqLc=kDy><%D5wS=DIkvWgk@AD?w3i97$*Q!gS;^O{s)!>2LXXCYtX>tA>JK1{if4%ju_hDrN5m z%Q^>lO}eAYCDhc^%$s^`gdTP>HeF(xD~#8WfEHdlL>MJ^rdOeAp}?$0jZzD$Q8y94 z58E}4sVaymoNoPp3*m?6v7~zzk5@8ZY$w(jy>FhBPAsz_FQ`U zS*fY|eh7Js6u%8(KPg|3ZAEu|W{NHkq+zU3mQ@AH{x0x$%oF=$+lMOFK+2>}HZo7K zV2R$+CrqZr;@yr9tAJdpMaP!Z++jU)J{dU|$_}0Xs zcPrKRd3$@i6A^9^xI1?8_o3c^h~}+Nl=^Y-+^r6h?R=L&hHy;49r&paq2@QgQo>g~ zjUx=LqsN^>`S(%cR87PVPfF}XkJ?j+DcdT@Y$Q5y_XS82S3lQ58G~yNMT1fWouQro z9QpW%AeoCTo~J*rDJ!)qN1ou+7<+}SR49)^clE0DG z)FM-wlNr8o1TILjIFQR5h|CkL`aeGoER=c%>};ceXfSd`FdqQ(Cc&D;OUA?4Qf6v%Ia2{*?#jB9iK;^$iS!JEzb5gl~h54jyi} zNJu6}5fvkVF<%%z_-ja^y{U;;!@l-kaYlRI+g%9CEZnZo1m28?tQt%lqyzgpU0U;Yew|AurT(( zY00)+Ct#6LJE~*XAbz*Sb6%V{`0LF?9QTL>eq5fB!Vj#It%KcZ7Eiyc@4uy_2`J@e zb}ymZAGJjZSeJD*nOBjc&)F#ey`^dHt#5apzJzsPk7GBuefG6 z!c&R}cD?y7&OO^NGE3}FT9JLoVbuht9Pvejmx|*E|!yT9-p)YcoiF!9^TIDqoeOG@;L7=R9O%|pGiCo5Caif zuyR>f%|Ek!aw^LmB!rz8Cle8UzJM%NV*e4I3%N4GIl~M0#@qa#@E1~{LdrtWW8kLR~t|J-y6>@sf&QZqzq|O(ub?+w!a5;H8ol^;4gpMFdYDRQanWv)z zv;pT&)JumA) zCMoCKhJ;BGmRP>j$~hDOUux{8S5@v<_A`nHAB9Dp-o$!bvOYmO9vhyo;R5YvF*BkA z9n>fg>;;I?09RuR=Vt1Te#(}(*8wZ2zs;R&(pO?xc105+vGaXLAmmdb;uI1ya*KC4>?N%JN?$J_&N>@=LqQrk`N z*$YTbun@PSdWxhFpmB!5=p3kGh7ks&tUmbd0Xv*dy`sy8_cEPqP@dfDPx}M%9srdM zE}3RJzj>~)7{_yi0+NlnA%7x0@KZPu!nEW`cVZvujSmXK?2^P61vA3dQ3BNAr$YH5_s*3H|BJQ7bsJ?Ad* zXb&Q;zG%uic8Hgc%i8)OY>-fMWa%6Obo}Y?w*Ip1MNDPCU>*a&XgyW zRA%75>bMdKI0QD6ic22O`ogO0Jq7K>hpJsW^ndP&k$U!x;()AEN?M+WghRli)%sGf#A0LRrBL z(*pdW2P+*=W*GdsdaI(+j0a0GGlbzcKxtO5(Q)54Fpn_o1f zN;J+bV*HqPU$i%E-^~Bd`vJ76Rl6ZJi+A6=#@Bg!00of!Sa2)rUxxe+$14W=b~2#T zEGUY)Tsqt-80FUhvEY8OWKLZYa(AXtJu+0hkqQXZryoPdQzoKH!K3<`9%t|4psm~+ zd&x@{j^s#BPeT6s-LD0gPVe8X(n3DBBr>4+;eeBPe9GqT;!Xx}h_Cm0J49E|T`LZ^ z|KDVl5yE`vUMw^nA5&B!_sFx5P#f2rGyNor^kU7wSq+;V=AdFyANK6^y zSv~r1&m=|P!oGHsaI}K@jC$E?l(p(+NAB_djXA$);_8OPLvUcpxM_{u*xK&?w=0Gg zH1^P)!@6qA2g?VBQ19L<*|n6}Kp6|3>zwl4K9M&IOz)XjEeUyP&i)X1Nvn9jd%NqU zH0qb>gdORUkwPcus_nZWn1w<)u@6IXSdrK?P}fskJo= z$?8$-PrHnsyI)1cT?~)7-*!#x`pX1TY~ueMuVJXjN#Q<@Gr`nJ4qWf;7;JmO_tDQ{ z$X>rY(CxV6J|~U@!5*Zv6OFnNcXt`#JG)tj*QQFPgwAw3zovTiiioIh%hvD8ASBl) zt2TRH?;BAzGk7;*viNu-r7RTygsJ6GP(uj<7?errnxhwbgc*C-gTUf?t7{gG$YHu(Iwww^ofb7 zX|Ex-Tk`btNG7t2?!>70Mpt~NoapI3b5kYb zZlE_B9K46~Ovye)IL&vMhf`92&yda>q5JQVT>M9Kv?+XE7qE&1J*eLPkWQ4@epOW+ zs^fiL9ivfC{NZ=VzG&|-$7K~*)g+XA>`{E;7I_!0IA!N+dyeeXV3cRFaD$C-cL3T} zNNyBMzM!T0>nLMvt$F9PLD;x6{Pc#shWoIIaN)P+(nYyv+abM54$y3YI=C-*l5!U@ zJmIbpug>$lcYkm!0q@VXyjEB5QJYE@jqJ@!x7u|haWt+WIn)<+GIkr?B!&_HTx>;0 z{cb*TgdN`K8J+%+le-^UsD_R6!pmM62TuBvM0cNSLXd5u;VZG=v_KM$y1Y&=U3OwF z5%mT-y#*5K6UGn6+0mhCGi3@(ToC9fjf$x1ViBab$&RSrdFV zQuiD&MbC{+WT*@#tdws=c_6%EGeLF?Sg9O#+C)b<%KQ6=Sl?TS9*TBKi4CwDH-k77 z&c(lOh=*2*NQK*qz%#A)P%|<;xz*4FKjCyR$LTo@?M~yaSi$mtk)L4RGm4CD6NAk2 z9fTx6cTorMrsUMAGQbS!#dRrV)|~f{g2Lg-X5}S5;=b{AX_Mi-@<5(|zEx12#uw^M z$9qq>JvpI`PHM7gG0I=Cdxonf5g+BkjY8|}+q42jggnV`A$43;>bq;>U!*uFJJ69H zLooIp!a?!;y--);cJ{tHS2G{1?H=j$mt#yTIL~VCI9~b1Xq1&$0&xp(vo>;@!|i2s zNivrP2i|VX!*%*baKD?1`aQsf&_`3eWj&7n`8GTK6VaMA%Ypro+GiCnZ|O!nw3~@A zXv`%ZCu&6`BumD(11Wi9THWGr;afkX8_S2< zyrgmyD=8;Cw@#ympGPaoX+zNqZ_X55LJCwYyOIX#yn0Js$8JOdor`cWpaNUj$=dlS zpNP)JwQZ5!0ZY)37wn=!w5f%#m-}T8QmNQ3FBaDkEvGvVRBh2&r$yt>0p|y}i{;kk z+#{Vd7m$J;DB*_ZlD{QPrk5$m>`j=~cZfx?ykVL;~VxRZC`U-9*O#$ZkD; zEbh}bn!>-5O7*CY_(bNX+hSeYl&mGx3dF~bOa_{ZXAp-vT&*kqFpqznK`T@D<;jYF zBE$63Pd$2<#V9BpxQ<&uYQ)NIJ6O}W%lAFL3kN33N<>gPjU@F_EwB|guGNo=VCwHB z$RkWX?SebISJH9kB%W6d?x$1^qYDFn&gqF3E((8I`bn+)xq_U#=ETC8v-?+^{4rxY zxe??om;fZKOm;ogIpFSMdLHCzo2intD*R&Rea87WQK2Cz47?9@=lKLgw(eiPgYU^I zoifFIu9p#sl`A+o2P~na#QQeRyQxy|=`67{kZt=|RPtDnk~;Zg!mX51a!TCR$1pV2 zJ7C>7ab~jX5of-rjcdydyBYc96P*J5zJv`#4aNpzsI&3+u5DJ22P>AcyZd`rmJR8k z2an`?C=|-e!-|JnyjRGuZB=t`IOR^H_6`G&UR1(6Lk;$ZmvrTg7vhwxIvQn$U#zmn zY$ma-Gj9Vn!5^Suop>n zQXN#Fm*3Y4ck*HWq|&#A=BO2Wbd}8Jv1rRkG#XY_Wcl~nmtq%E=4PW;=@yo(f3iGC z&q%(_{3lys{mm`dj?_1kyO4m;k^*eKxoOy3jrsxEQtjQL)Nj;!Th`b!-)Blz74a}l z@K@45FMY?dJS+;sxHvt`qHts2a-yq*tIBQ5vWH=#5K^TKleQVHCp@cbfgV1Ef(q*g zaDB0L>0#QLTiL$WE&;)x+A;9v2G4yo^=^+Pc2k5KglFhwoC5)Jea_IJi_s1fo!13G za>#JQK56YcMza@2=4O*0vaE3Z_ZikQ(v{Cm6rX$Vx%0mZ(Q2B$|Fg(m?ud>e27+H> z2GF-97e1oMhzd_W1wxuTMRJ7kf%l1^7l{>H=yL=o^@l>$(;t~;of7BGbewWkH5&>@ zFpWNO-aqV&q+~<>rdpfG{-%2QnSwX9(JQ$e(E=p(iH5;u3{d%>5iXOX3K$nQ7i&-d zVxI)&&RLyi?F7N_cj!ggBe)+qwM>c~y*;!h>SgFCuCCKoZ7&ix)2=v%1g96*J2}nbmFv0JyW-d)zK=>s4UT_ zdfQSSWLS(W1?h|5a=tOtLXhpdK;$ehch0M@I`MeMgbA z7T4|nt=X}njBswC_~?(U4Ud50IoMd9OTHNKxp{VJbH5< zF==c;(i=?D6FeE?y<34i1E6sw-Fn?+h=ybP8NO2gDPZ|q)8Mbv_TE*BRK11eh+a_*TF)^W2;@=IMFMqwBdecQ;gXvdN zDY~k2_Q7vb?Bs{xRK2o_cm1HDGB8sTL>6Pqc4XU41lVm4MT=u6{~)bh;O0=^=jpm1 z@Kz-ETk|SVkLlIP^e`Yrf`5`Ocy$sFZ1~NnL-ot~R<-9RPafXAw0e{}zHR<*MFcNn zc=pI?lf~aG5r(UBbzw8((9$n4s+^zpu&1^PE%AQRY7R<_@mj zhq+!Ns0e?@f^t2EjfY(5DFZ!>3U~b?(`+#7urb8fqogI^Cl<%tewjQI38>yB!4;jj zvRvvB@Y~V#+Y#~2(xYZ5enb@XdSsqDE?DW%ef5*h`iTFs7Poy-C8u@S=~~3-TL&9i z%R%oH(Eo1chR4nC{_1cZcuu-TMAB?A>Khx+e^5hF)sIO1Z5R^tmL^(1OR{(8atip9 zU@>a{J5D_9c*1!mHU2b@ebTxk=lM){mbw6lX_PA?3EryF2B2pBTYU^ z!0*9axA)576O4CXJy$e^yjdtOY;V2720XR}@ppdgCiQm>?b52@AhS`O6io7fz3BT9 zBk{lJnpLg5#;%`eVQMp03Ljm?-cAA}sc)x-1KQ0w6?ZF6iExpr z-->RQAcxeYYV4XE<*GA^)h51;YYtLD=}n&nBEo03TE2LIME}c5DZm+dZ72>dfIT)g zHfz@`muK(1+y80e`S#-v`z1P>{_+HP;z^k{^3JLs&dOmKS;O=!Y{wrl1tW4@;D1*T zH(k_DKzAdBJHU)POq1f7Z}KS}H=gMgyi(nILYckTb9`dR5_E-~g}+_3qh@uNa-~Xb z8h%lVIVIx7)ZL(8y*U=03Ua}Sl?%$AmfwH#O0BVU3#U~s{cqpxUvFWKX*Ize`Z|d8~61edDeW|3fkdE%Xyb)PN}c{{q@TCBIX^M6`)X`9*0K)K8#I z*Xko$qZ1C!!Ubt9;R$J)AK|8QoTq$TCQpG*p6lTEHRS<~rHAr0)$9kTV9HmxYU+F$ zBoFdL&q5ej6$OQ0@A?>3|}q|Cy)(&JYIz3Y3_R-3^(YjwjsT= zM?jw;{t||LcE!Svbm{<2obvL*ARFJ6`GE-6gP{%5`_=u+%;_^36(P z=+}Pj*Y4%xJP)$uf0|kUDU8`EW-%ur7-j};hCoI^hAy~_(Q#mr9~;e(p4K}zK*8W> zhqGq(dY*5m@nN{^ynQQz!^(xS3E1ERDK%X>C z@}l%O&w^W;>Z2~UtvEt~?=*(1vAXmXPjpaNZ^P(7p;veu@G{2?zl{Il zKl(@i=rwpXJziLH#HVy`-V!M9?wj}Cra5!t(xfpDzwK>ryXV0NAAEXdX6A2UoE`vg zAD2!@GeZa?qMNEp#^|KN3Igyk+=#~}W~AxB6CKKP4MTN>nf^GN4kz?npES|CJd+S$ zo1}SOHzfdY`5|96Qw%US@I_<>+sHy@#lVcL6T!>!1+MApen?lcmxHH!!KSEbAj}T) zG|nr+OM^kYc#3~I6AlP~H_Lb3o8a6Q4|sb%O&^z^gQxc;=&~J}G%wCewD~+lX~r|4 zr1w3qk9gp`E@%Ld!3E#ak(1(yhXx9|mwV08HHtOktm80{GQ22Su+!M$|KM@iFB z!~?<&{EVI-*VW*pZ)z)!82L_^f~ve56SkysJteQ(^8Z%}ZsQmVh^2M<{5-?f?GY|NBGCqVKtS_3HhTlap`b*xpAl zQ18G%9H0}fXcoa>AT~~gM#g32{6bvUBj~5)eZ97)B}$#nr)T>!%=D+}^mRDT47-`N z{J)A$Hq*z?zrvRjyZvZXMsD!8Bz79|;rVMt(+p>)aLL#SO&)ir@gjL!@knV@M!E7a z+E8|JS;uhEJ6$TPpuFR>O}tErCh|$k&!ZyCL0ob8Gkzg}T4qhQdiBXC$OBcz)ljMJrCjHj@tJB@H+n1>xGJi#1aEb_1> zG@zyOjV6-s>{GsuTf|FrxI7Q(W%-jna@*lyi2R7w=>p7n<#`6wOc}TwPYd*^e8B}P z;^nw4()^w^<6*1=AJ2o$@Zo9YDg8p;T#WIGU@pV*B_y0G0w|RV^#zyel;Ld#cxjNYng1DJ-(*GLncw~0-~BRi zogt7q=@Pq;&lpsO@8S~JR6*|Iyu9UA_r_Y(NEzXeY1WUCIdpf?MKH7JKpEX+A?BB}0#cho+m zw=NAt)ZSSU&}WEW<#F4$cog{84?OU|E9h|PAO6FCs8MUtoQ!&&W+4=>c}Qs83@-0#w*PB(}POX z;S<+ud#mW9B}v;%1&x+aMVHEqc;xlFt$0p9#AIgTg}ie(p65bbfEk|Kq|MO8jM3NR ziI1Ei;wv9Hmv*Era1F=P#jc1)l&<7WI0g(zkscX6h2y%5hwvi4&eMINyK@-m9?bF* zq9^9%2PQ`7@*_UZ(EI`(#@cxV-i8+AI^2*0^PDWd7a~h_QIJmF9&16XL2fr~QXeK7 zW>9{Nm4Q=q%=dwF0)BmxBbvY>)=l9}6+pn8^ZahYg{Rt_2HrY9L$BF>8@XR*Bk*7G zv7zVSvljDm9i&s~?*0-e@8Vs0595ZYa6yA?XIKBO1Gr!Q1?@iNZyA>eRKVPqTh?^m?|hS^fkw4ISE}uko!R!Zuo= zgU|Sjc-`qc1&;5`fobneCxE}bW^ijb|aXI7z({}_#XFV`TA zw&{#N;@hllxDimg!iFb9ASZe{em&p6%!Vt9NjGL_dx`~W$>E73@6H8+Hre6J*_}aQ(9!@ zWm`PY)A54tE<&ot^l>;&Gq@8)`FDKx?Vfo)!~o}M&Lh3A(lL)4>!-vp0LZ)r0L*yB zxRMjcV_L#CdZ1m}iU94jla5$lAk@c+`dJOw&l?0M85o>oP;d%fqmnBJZQA)7U?V?U zwcUWed7uDK4c-@M!;@U+S*`m9?e~kn@f*MKEr>F&3`)N8C0{P&(Zc1=-BAL~D$3oV z{aaAWEgG9XTRQy5fBeS>{_M~G?A{9(EpP9cs_rtiT`9y_4T^Yysx>Zefk?8`p}0izW2TFodj2V1ImvKsl@JbS6DIb@;tq%)epwP z8*DzW2Y=!xe&RiJ_D?dCcme~W=ZHF=e1Jx+-Th`D15w=m#jjaiC^ROHE`7p`U(fjU z{{B@uf4$OYAL7A)*mHjHe0Q_tSU9iz4=|q3W1%X!vM;2Ga0=4{<7R0)f#-4aaqC(9 zKIJlGxaewr4kzXlhn+BKyFXIFyixbj(5ED?ca>=jF z+C5S6B3>#Nl@ZQSO@1gZ1A1bND}L%kl}2Z6v`QCTJ}#v#hzrM71!%jX@1i5Nj}Z|c zVj!@W6}=O@vU@KBf|IoE{j@)mAw6|De*-2zg>75GK#)@>4kxFQEvojwVf4+!BDrG6aj9$#pXDEKYg~k7+~L^B^{uF0fuaiVgVd*#ohyNy?J(mJq3B`Y;eYy1|LJ?KUAy)auNFO^SBmIx z4*(yg0n5nP6=(_#LBuZ(W^mPrb;)pHm~N=kXU2bx*}lHWr)U29AkPAqHvegWAY-QI znyO=O=z69y3P#HF9G640@Fv{&Ucqludc>$%+9o(Wty7C=J($PcDz18v=d~40K3%d6 zru^YtmlPfW(!^$RTfmK9xF<31lxGY1h7)uv%5Ta8#*SNr7t6J9o~Or^D1CyyDNn(J zQ&v+P;c8_dz*0E48QQ>8e08S3X!MF~C!PKP*Dxys`XupQ+Wm2@2oOI3&wX*bmkj5N zznyky1dgjb=~BCgmj)fzXz%A4?7zUHfj|GbpZmGL0#~mLrY^`#I1TC>JOBOCmgpZS@?ysq;gjsM3n0w1Q49-(7S8!Y5*P%M}5YIVOe4c`bheza*o zuM6q)zIhCQX8D)c(SMNxM6PL>U#!u|Uu|k7XM<}L${UR+X;ZLuHa4Me7hw4h`6#4` z($aE`b@4m^+r%qR>jH{slm^`IhoQ#N0{*E!LXOiFk9moYbP-rTdA(dt3m&OnThY3V zJWt8R73#bd+|$J%(-LDXmQqId)XA|nBgUSqf%hw);P?3m08d!W!og~9jaIw z4J&o2K7oIRml%fCJZpy<3@`}L9)SVv5#V||VI3%>#{wflhqv|wb$B^RSa7a)t9I%* zPGkE6;May+y|%0N|3%&w_~PNihhP5u=RZFIq95DsH0Fy&u0Riimp?za5@=NcesEfq zl2ap7)M!qgJbCQNC!c(nVtSJ2agVb!c$!9eghtsNjD#5&(yir14Y1Yy_6Bb_lB-K2 zfBY4e{%$b4*UtV4{G0gtIL{nm9p|e7LOSC|UMo3G@9uW#(8qOc%Ig*rw##=byjJO% zG`}~}w;*4)j0?LAZ9!Zjx57!&rCX$H3Kx^$3?`ghK2lsUAkFdRJ54jV;Y2jf%YBm- z>6P+y-UetQH^Ol}484WCRBn`)l-Bbd=pF8Pb6Sx~j$9fRt=g^tq0MFDq9I+pM64Bo zx~~Y(>F?q#0ex&}4}*aHObGPdfqQ@-0e397`Pby?2bZ}S2`K$dl?;${03iLibhgJO zzRdYDlYwuc*Rwo&{Pq{V@P%_JhY*nNa-m!TwDjHxCGbXmHv2{>pYOX4TQwHa_kR52 zAAcwB_&<$uPZNJcOMbfKM9<}oH|@+VapNbG9>9hxS~XO$(1p>_d;B+;^?uBSO%`Wjyn zGW-JE>tHM=gC~Z<4VRaRcqWP@<&e_2Qjl3tKVhJ5v_!?ybuzwjoOI(QU$|Vd+u9GH z$8ilh;2CD)({%c;F(J@b2JfX!&V#dtuS18%#198)($11-0^`?p6~Oc0z9I4B8z;%O zog}D_h277}!~N_JxQFnbg9i`lU@@I6sMUbf313dKKyvQKn*@qr_=$kyAd={QJxKihN5pC(-7$s2Ni8sc5Xr+aoQPUF)z#k~=?qTf*(JlAN3p2leTvC=C_P+p z2V|rwOSu9XFDv;eZXQpxu1oOqxM^>fPYW_CA*J z9=?3}@}q3{dy-N8DLUvumgT+C2|qQ4iomDYeKkCx2rqURj74}((b4OjUwx!!l7oCE z)%i0RSV5+qIcj#HYZHCUYpZa`cgmx=x?6EdtmN&`=OlRf$J`k|8?5 zi+Bf^@WfMZ;Z#{A>|k^70PR+vAwJG(fUctq1P-%5;4nD50^hU@B!f#XZJ$Xr{q=MQ z*xmr~VI@GXF=Ahi>XsSV&{6qurhq-OQ6|JzVnhx z32~#d(#SP}k%u3C_%U9!d5Q-76ExU&fTUBuKufGaRD{-=yipaTJF2(3^u7n0bsFs@ zI{a7lE959IL#M^lb(J|C5!=zc_pL z?013bdjjUb^Pu?=zYM&L+}RSy+`Kz0s^sn^;FZ6q(zA5d_h0_Yf4S$+|NPG%I(P2e zyS2-ohWZ!{X;Ac{4fNiETHV7 zJX5(v`308pj(LT873*i=aNk8HzH%{K`gwx;sm=*{(ou(Sj1%kOeB*S7RJu42&DOs4aZFWw@SEaIs=rN#0U*UBBf+VUDR z|86?}y>$Ls1-PGm0rzp~gG2k_sZWC2hlX5tDTDL8w`#X3j`Y!`ykI-DdidAu9s1@y z_uTXB2R`tD7g&LK?Wca~rxp{|8^0m%M!NwmLwC9aTHVw;E&DCYzg1=bPygvZJ;*Ve zAECXzp8|S}#&`()+kKZez0ck_Y3z$S%ty0+cJ`muQa_!3{Gp!A{Ruj2%4Bfy*`b3Z zp>ZBNq~C<@c?k(_gf`)|0!SCv3p_X0DT${E&o9BaQhBX-2v_NH_-UuriY65vXcTun zT(0wU6i*MhCeU&4E$%qm;E|z^c}kx6IB&&s=}ps`(d6OchXZV^E#f*09w&O993J_G zwoP2;Y3LEplm`J|u|bR9}cb?x?4ZaXZ0?|qP5w5}P+t{10 z{@9QG*#G?Wr$4RLfQ$>erS&|MSVrzx36!q^-m#+H%(zu0CvERD&pdPTcYf!0-b?5I zG}ps4MmyL?4N?sp2U^nBXjnULkkG3!E;8$%r7=#i%s;_KKON>XsptIgRtIl~`N;Pi zNR%$YT8njx4IdhB)al@1BlY$|;_c4EJJm137qd+|I$xIqz6;HiPe|XyBcjg~UMsmu zgU;j-PURp&;7nXPM<_;<$B7Y|@sR#Oq~9-ro56V}OvN3dafPr37j7hYKV zlRx>B;UE3cAAJ=Wlfcq@B3fk2v%FZK{JEngP;@izsKB=}^A?r6k8}J#MC157jLILS zfgS~Sga%?Wf2X7D2&N6B)x9fhtTgy}Hus%lNlu^noZy;f`F{ntmI>{>e!oAG1I(iY zld#M8ge`m{%JJHQWar7QQ_#`#zH>$!My?g@R{UF~H%lW6netZI8>~Q)Jgz!})Nq1d zBx5Taqmd558NP=dxJ5iAj_?I*1{a#8DX$iZ+aMC=6xV%j~0!%9e zO4C{Yopk#BywAU1=l%1xz#|L}o*->E`iO^^m}imV0e~fmp#ni)D=38p=8}z>fv3(9 z`St@3Jn;Wh#yY z{`DVa$L{+WDc?h<-04ek&|0H{ks1_jC^bNF>BcyMr%2$h(dd>L`Rmi3*VXwm>c7l& zlfi&KBvN7dPahIVT6^G{le1}N91G8fV_NtUP1VVxzAo{IzsliOg>8p+E1Xv8&C(2> z%YzJNQ9g=r<9kyi!(bcL$U3Z)2Dy0}zhQ#Q#d>6TMYKim3~i9_otb#LT#}mRHRfUZ z2sf6ihw230Mrlyoj0~t_bP)UT3s}_x?b&Ld0(6R&e7@X-2MfY|5vrikA|*kfaGYSpQ~Hs zw~}3iA2-~zvnfP;{edkrvW2+q&~Am(D!o}+9-fcKYUk5-8W%5a_XZhtWh0U`?lIhT zFqkt?Jqym^il!Y8rex2*#r2cpWqiW`z;KFaf_<=bnz-|{d^iy}CXn=0u5`}FNyO~f zM}|6B3FszW9~v5EMc~xUn>XKuT{;EN!*t-*j-6gigG)2+fXMfi= z{vYA>oDa|;r>il6K5abCC+D|H*YiDX=$lsO&#eFA{{8!3<5~Zdc+k*wbgw%7%&b4h z-#YQ2%Z}?wl;`i~004Dw*>HGy=8GYYZ-vt;y;)iwo{yU`q&zplQ7jM3$ECZ$R4y?O zFDIpkdu4bEhqRPeo;Kzw0TJJ3G#Pjijq6juD^Kfj*IVpTm?Cm<9wMHWWC$BHn{Y!J zz#?HA(dXq@JjRP@MW=Y8PBPH&j@g;VyaS&Mjc8*YVpc$t=3y%yqL=Kz)1x{{TsEVQ zJ*u)2DW#7wF?kn{10H0?eiEB;0J47I$(iG#+;Cnl&Fn;)?sBCkJXf$yUt%B99~?h^ z{JDSgZ~o0WCMY^DAl-#1yx2K?3@gL8UINW-*sXIcDZMeKB@tKJQ>RXyADeVkGC2=P3f*ZgMpXj8i6sKLN%n%DYtH0Kp|`P;L8p1UnE^Is!f9rAWR(+kVA zLrC+p%|J7~w@H3$Xv%*mZ!e#nFxrY{t8~d~hSLmQM6(H(e8omP&Ql(@X}o|(Q`{gR zO>agkxNt+6E7**t89b#4tn&F3T}tcWX8L%#nBrW$BA%9RSb@LflMllcAuc3mJKdOu zuptRIPwR2vXyzPnQoM-PcnDv-U2qgPFmdx8$K#QnuJBHM>7=CseR8-?hcEhG{9*P4 z9Aa<4NhT=|Xnzv$y^<@L1#+9UdDkbCPMPR6MNLv@TzAf0mK;6_)*HXke?F^>gL#cb-7B^5V!4W|5 zxQOIjWzT|qhb0(W{%)|`5NoWrqzni_p2{lAVQU6PBL$T2j7zvt5_V4%i=80{#hc09 z1ov_Y_uE!UV%>A;D#ui*P`-j0Ur&m8NkOG^iB3tGPEcu4CM4f@C0;@+7NQlN_$V!5 zXD~~1xNvaBBlvk5PdB*Z$d7mmCv}1ceNsImYcy1yj^$QLuX;ULwW)WNs&y! zE&om=e5G>{+>q;h07-v;B39Z+^+Y@ZJZ5(CDmpHuTqldB8BK z>9y4=$=`Zqy}eqgV*R4gK~T(c~j7hp5%t`rhIZn8qyP4(qo%$+lUdr42|^R zkLM)zq{Kz1IIN{GZQ9T+@JZ7nz6x%F#27ap002M$Nkl$O5qzWcun&BfB;mYg*5v}wMJT0uBoD))pUr2YD`%V_eO)nDc?USIF(hWyC z5!NNWtn()9F2xgo^jJ>=1w@yZ_*Q{97^jWRZ?FwGDZcJwox7=<>^Iu^Ai~O0ap@Yj z*QiXLXQ8jMl&&Ta-#TL5e>zSN1tyPu>mK(DJv-SD5 z`L4yK#eVF^ZaV72tO)2N!AG%S`mVqzj~T_@ZJ5cDK62=mu`#A-4z6;LgTFQ^U&4lc zo7I4?96562|8OSCUz4O`jm zn2j|bqQXB;Mc=1}L!}p8%SPkr_?gCJgh@lIvVUM+@Ab3Xf9}A6125yxpoZ2pbPL&9ZJ(>w_q z8SU$B>+&VqMCwNo6^wjC(=S2d1~Oxn#NF_x9a+#xYFb%EIuzk1dcjuC_~MB$q9bVc z)%hu1Fg@zgX^tW`27-x=U*OrmK=@oHKlsi+FW<{2QAmt8bTiz*8*qXmMT8dMhL2v_ zhob#3g4+eY@Psa1d~hHiaGG}o6F^iB22ALcmddmH5#qXsb}yq_>^D@MqW(k+jeL`0 z_d3WIDClcJk4tYZD{x>L`AJq1e#!^&q`Z)jRFs6L2Gr=rC>V+K`{HeUlUk;lrb=ft zrn3-mK_B5al`k}<^V{GvLB@NzvfMG(H`jS}_-duvgLFP9Xd-CtUDd97&w5Y2cdfVD zTkow6>>gNLSzB4UK6PE2i7&H~NR_H-Me!K-aTMMhSP|&Cc=6)&v17+x4!qKOrnt&cE|O*O@@Hoyklv}Ck(JnS2{fyW zyxuqZr7wNyJukla;(Iu8>xZb+Z-;Il9kz_$wnok1XBv^@x*=gOp;vb%nCXu*;~!^3 zjXvO`cl+0brgp}ancazAaBnzf;Appf^}bq9y{ER=w%C2W?fSrE$K>Gk&g(-MiXL^& z%uwp!tPR(Pmk!qt&mOKFUgVgM+FHk&4HT>cmmN%OfW#C!$*T>> zqq5Y#)V0vQ(8U_V#&nyUceQoZhU!D>y=}c!W-pCed#!DyeWgRI5V0XF5a#7pkkk~^ z=xSj68a>jBZymR{t+uUp%va{SS1YTXWaHH!jC28^~uL$rSfT8#YLOqP%rcm~zR?HISEYv~28+br=<6%kMA7OJ1YyXsx_{`LN9&stBtd!@T=t-jWAqvuBV zLdQav2Da+)tUhuthpIzsV{2op-R<4AT2HOM(z8-o=w9etr=}sr<+!i>cy_Hb^ZciJ zgd97PbTb@O?BIJ^18W1-fu(_3|6G5gvRrAu-g~`!vTw3yy?vdVkd(1#rT_l9{VT(3 z!)tAWZT02h<+je@ zPYEyYzC1GBH$A-Cwc3kX?H#p_^?{Xvg}tkLZ#;4CiK`F2^3eR;JLc+B`=;8i&t2E@ z!2oI29F}$`ycHC^V5!hmBGdut_EC{NDGz_W>46F>c4X*Yz`Z%zl8-%2Pf>&Zff)p*U`ztX>oUMmA_18W+furgw= zReG6vzu|hg@3MkkGKO|Pq=@6VAK_;5M7rxO-}9MtG7S2t2VHdh0~lzX{l16r9$-W8 z)5l-b5!-hlfL#ODPF>OokyYxcJ&(%E4>BYxDcGRAqFknC&?)J?vT*4qXDbrY4V`wQ z+dc*X`xyl6rgQHVJ(s>bsn1dClsMJnY3j8;MV&4M6SlemZc+$D(;$*8O!d|vak^)^ zd#!h^eR;&{SkFw`%)oMexrcjW9lP!k^{L+1-nTN`HoRo_lR+JW)0(OvRaJuu%Ohgl zPh?1uD4!NVB^8ZyvqITOH(IMdj4Wq+W_dq%s(WSMN+$!7?wgI9{c}~m+}Efjhkr>p zwW+JUYi+oFcwx9Qyu?6wwVxr49?hxltKF$CN)(qV*A7qDrw=X9E$?HsZwRKHl*Q_7WA-Mi0~f0gS1UJ9+?-(0ztZ36ua1rK zmU4Sz6&WvMcP`;y=U&dkzQH~0C$0fzzHFpddjA!X!t#T&F!$eZxc5rlPkrsXbm`J4 zgN)HneBu)`3;>=5KYdmjvye==7-oR-XUh_ZZ^V|!CBjAtw5oK>_>cVF@BQ9;Ioa=h zJokT!#-UI64q#wy)(>r_L2Pi%gf`)*f^IJ=Ux)fE%6Mzm2aa{3 z8EzYq%st1TRAuL0>w0b1x%PAWu2!z@z1eni-*RnvxLU9FV_?)_h+mx_##pyFn#0-QHI1sr0Oj)y8J`)%MMtsGqoTZ2cJXm`Y={eKi>kY*1K; zvN9z$iaLjoi!$riz@jnUK0a`va$#(|b9|H)kWmIF{aD$gOugjbEZMTZl*ihx#;*Cj z)xFcKjNCX`Jvlv88(LfGU?o70Pm)`m8t6!DaUmrL`LwO#qS8K)8u_l%xehVt+{do! z{dBMgsDGmj3I{N^x(l9TWb#r<9;O?NF?qx@V zWvYrCfoRS!)(xb)!o(fOl`OMOcn40vt85OST$3UPUYIot*TXzX8w(l zrIGcSo|&%i4t#gd`JVF!t_@r}FyAr1r?y_}<0(KVbxo)9Nw0((NAt5Rwcgd)HNR_p z*Y$m?`>vf{JALI{&?H=gu3xm=pI1hLWa(L_;4tm>a z0Cr4yQC)mx-@bi+`S!QJ{c9in=tuw0gAYD$A$I_d(N((J$0k)#u1jh_b^LWXOZuYH3o06F3xAeIu}{;ew8J9 z?Gn6psQu8aW(f=c!klL#8<-=HV67XKxsJIWI@!G!YZp&U)FzHH!`_EH)x~s#?*#ZF zub}73T-)6Bg|>yOY*em{c8snL)(6*x=lsRn;z_5F=DnqXNK2=U#ru_xD;-yc&sEPI zXLfXKdTsg;v&cbmta8}Eln^;Bh+=b@Ro)~IS64e$UmNZmUhQr4vcw}2RN!CoT?bL& z#LIn4Q$#Gmvo!Z}xEfHz>0%->Ik8Y@+m0a~(LpYBvL`U4I@?|EZ_DNL(7=?pgSUcz zminVdQx)pi4eG5`R`G-`FV|!l$K=PAF!e|jG^J6Pt3hYq$MfBLxb$wh&W9iKH2l=5 z9@CL1uEESzaC?Ah$M`kXf8dfM9a0(s#FCDav^G|6Ixclz8sT1^oLHPVHM=-_FPrIh zn(-kYz8~Dz*|k%s4wTaX1Py; z+~7^gW2x|Un!&xgUL9ch@aXqCzt_%&!A`adv6rZ4QP099%PNZdkwVsLprJUprbqIy+JyS>=%etH_)71c;ZaL&{V4B-T?I zNQ9W&7}sc{bkW(siB4S4)dzV#dl>&Ho#+90^ig*tOqcUC*3JWXFSJJhiVxL{wc_^n zY0_1OaeYjCUGXDbe4MA_rE-+cRi|#+UIfkjnJFGeucH`w?I1T=pUsPzT;Qu<2c7>u z2GVawUJv-%yP&sPq@U6Or}vtzshy_p^{(svm)kFozTE!u308DYEmjxrp|0<4(=aH> zQCe5T#9X+S)urlQ1_AAK`t=t(UR+(?z1(wO^}fj?D@PXTFe};I#U zKHEN9IbS=!+8AxLog6xO`Tphmr~6m?Yl}ULMw^x$lDm13F|;&PefiMKgI_xKr9-s2 z({oF653beLj@LSByR2@Df3hNyl#MjDyFxQ&@u0d~RXct1D-V37>qh^LZ+z@eK6atj zU2BY=81G=kPxVEE5bf2dFJhIA~n&%3Nn;$ zuk0xN*3X}Q96@+W`tuipFK_nv{&3*EQ`8FBsD;9iCbOQ0M86c)>lfifR^ z{@Z{1Z$C^W{RFd?2dTXM%>1oVYvz6%PDXE;#x=pFnD6qeU(2COG_0x`h>UB*+Zvi1 z0dEjW7c7m_Y-B98X$?a;a<+c<@b%jDWah8VU-OWnxkw~PO>en5SL4agSMt8xjo&wCS&Yv;Ai0YmL|TU0Akjqwc?+k_Q%m)wF$^ZJGq5v~zmfKlrTy#smlduj zkJZgwMfXAap;FqBrk#rG39fZ6;JNR{&61>6pckJC^=^pS-BAqian1Ze>Qg#~Sg4zv z(%caq4)wO3`gMc)rQ@RYJYGxgj%GT0L~vwyRDPN#g>m)@B6U>Xq1P*9_iA85dnnp4 zmhy?@3D(1a;UqKz=%X|1wK;H(_Mp`tP&Yc`t{Shhq0hCRYeTQDzk1)q>clBJ+54zB zT4{(5nzdNrkH!#djkVpXW0Td%cJ>kW4D<~wotiy0$3{6uA8YweIxQSAL?7i_FfS{* z$##10!TP0vOWkK0XO3N2y7Kn9_PMvOw5=Sc0(S6{Nt<0_(8AI24zhpY1gGXVE>L~Cw2VXk~uoaRyKW=l7hywzRx-WoTw-z3n*rIo5eR2oA^j>Hwj6>fLu42wdUbTxH{4 z2luRtYmj@EDAgiw`6R!uf^*-MpF`KLU;n=tMBc|>K>TimODLtg#S(}+k6UE%)*w@b zl=B7_<+|rLfAcr>F`sv{Y2`;{M5*xllAoajIyVyehG1~vIKD(UZ*}~PsAn*cX4OaB#?Nk=bLFCAN`FK8LQ$Cd(< z{vxk)97kdPc+yv|)w>sKi@SM*aGppH1V!!hgblLyDKf1_aY9c}umWJyVsb2FvY}%x11)V5=B3a^)nMtdr%9 z!9bjXer>#q&|vAl?ONBhUE^!xN9O8t2deFK{xb8DEF`%NEnLV3M7iMUDbGbmW*Rdx zSPOHNxl2s^=k~V(BOjjY2ru(NGnBGT)l|+50U>Jwh`P0cB zCO$y@5njrhz-HYOx%S+Zbj`T6IqxvEYi#t=lDkfiw0b64fk#q_h={-BJ6yi-f?Rth z%>bZ}ng0>m#=V5C^Uvu8*(Ti#CSKHc4PwTiKSFpKoi5VJ+>~4{t3%?)3Y2Aba`)um z_~Q6I^K0`bc)@MNX1W?+rZ+*XbIwafPr>0>U9FC=I(4GbU0IsynL1;;Uw9XWIx9@i zKVma=%jAo5Tn2jfKQup7n>{+)HC`J(GP5>wdcC@S5WSMYL^3}}Xj2YBKi5l@8*9z; z`hM!!@!8JV`eg6qMfNqk(lgVe6#>-*wM*sG^2#b*`;GdIo{5f$(fRuP3Fz))Fq)Ld zW@#?THAv!m{fCzpD38PQ)AJ|(^pQWk^1#dkldNtn>rI*E?&bE*E=~>MEfNNK`pobW ztCKn;sFwlX6m{`F?zxT;9^l@kby&FrCeIw@CU*=Dv%}{Lj$&PtviNF{UBN=y^klMHo!7ou`NK0a<4u2H~T31w4+<)Zqmcu^7{du z>7{!jn8!mn?LZ3dqv1OpJ|wpJOW$1|VGwXk%jV+8AV7S#sd~&$@V&#rD$G-3)yW%y!KVuGiK% zxPx7tq1lBxmePBkq^F$w*4AnrZG)_j%?-?TO|MKJUTQ4e3;!^Hp?L3|o#U<@e;<^3VD_5?(pE~t0 z<#7)v+UQI2&YaVP0qrm!Df%#V^d80*d7vBdTgC0%sd{o{%M*q+M z{Li0ar~eaIuU>tck?uPf;r0qixPi`Vd!9Ikdoy$XS~k`5es%t8NSE1YGr`P%j*)Z+ zjVV4n#c5(6@f+fzuysTl(CfgFiS~(pmJvso`H#~14>h{!sFGQd^V(pNK$5uku8M{J zg|`Lz*qk>uQ(p*-LRRj6@(c>J1c;VSzUCn{VcC1bN_0lV@~+zr6wjw8f=sq zD-V=IF9u$6d*Q3iL1X}1BpaP|`SQ)A3Ll+1;lbevYXc2UB8^)lPZW8sSxBOrwnNgQ z*lgCz%&bReDnO}6HI`1%5lk7GUS7Yzvv`y)sU&A-m@xywdhJl3bM9kiw2KaMj5;z* zJ=CXHMei;Z8UP+o^p51fPiMgIrn9~dk4|JrY1L_`5ew5*zQdstj^{zbwdt>mb|KyL z3ZiEIcJifggNu3QVL~!~0bd8tjH1^*?tQ$eQQB#EQenVV;jvT)on0^YV5rd#x$dQ% zuV?HNd0DC1SRzxMp54n@y*9vOuKwwc>7Kr}zBM#bJ>$pji|H5iOaw&5Bs~42zg~Oo zU~^$_wN@RZj@i;Vx_N67ZK6kB8{=v}39gt@ij8HSw{d;~kE{CTy5|@qhA9{>j24k3911r#|(mvt+6Kq;R;g+x6lbv0a)Hk4NY%K^}VU zx##{CmGEy zkmZZDE?`<@y*-zh3~XJag8_g#T0W)7nJu;haeJ)ISfUyGAk_KGsN8;AkX~FehV0nx zVZ&ArXBaftXHcaKGS(hUm4X{LDV>iCmUkH(>Wl^e9qRnq_;-YQxCeq{SvgO+&A7^e z4t7ADEMYDE7g4$%?h6OhbS1!!prwQA<(cgvJyO8%d#7E*Zxbx$r7)Lt>4%Tb(&+Z~ z0Hr`$zam1_F*#nn?40SC>EYRQ(pCypH`J|vM9U@K)wOERROeLR?#gbKbULa*oOpQt zi+q!z$6q{BYM<(x>RDf1@1YuKnd;VE&3myj46#dUaAG(dZa9$W^tMHoH?J`3zre`(3NwFwGkcYhvy5`yu&2Cpx~6a! z;J%C*Z%Egf&2(Jpx-xpLdhHOi8@&o-s{;YANJnQO%{TZ5Om*sXaGfl_+H?OHMT8m% z1iEaJOA^usSH(6vjV0vto3PU)j0InwP-bWSTX8Zr2^ZrA8~!w>6JvKC+zvO_EuvAG zFc>nUEbS1!$la&B{e?qhWLt#%sJOJ2Aue6}VFF37l>ye6|b75fOY3IG%jR z6|0)3-v5nzzOjcD0WH7R*nHX0QO1Fh_LE@BFa<1zasTI;z-SXQ%-|HuFMA9iYBKurf4 z9v6M-k`gEf06VJ*eLU;Gmk#-FQ|UfTMZTAco^8}S<7cB;)om^LGg>~&j9&wQ36}ro zsjxa>OS4mNB+fk(2Tw-GDte1bZfG3mtH#Web^wxMbu7hg4fp5Wl>txAgrc>*x@W{bLCO@)_TR9&z z=rur2IIM+NnzkZqoxV{Xtnqf$$TJJEwlBd37&2wLPv~95Cs3zJ`M44?FqI{j9svwf z7mwg;1t2pRO}TA9AfDPyuX&$bs%(Mou8;c(Me?hi;l0#f4NMM0tFzv3$EA9qo84gP zgTqUPaLj<~oWY|8}3#UrEsdjZFkG6u`G~EMvKN(UodSLN_BYkU~9i95B zPf|J4Qq5ECAWk1o{a@#(;~J0QI5DWE0gxU8Flnc$G5*vmDcnIj)zCQKs$9`&Xt~Z_ z%c<&-mpWg%zj3N@_H7++n;cjesLu?{D3x2Yac?N64my85c&P8+zyAvLV2$VZ3v3R& z#=zj+3<&N8-&PL5xh04FtuP39oR!#7_#I*u;CEs43fETeINXxFHycqo0La}@Z``Vw zvEw_{!(aHq7j)v)d+7Y1rUE}s{KZo2Bi1G+h_sfMlW9?>2}|DX>`w2VYM&Zl>2QS3e-!)Bm0O+8>z-v> zkP~=U>4bGGFbDLvV}{b1uXx!MjSi6q$}AEjlc%I4h-8_!jBS#vPMZ?~_3B|=8xC>e z7xNTN92ZXFZ2r_%VE~}cT6&po>EK}}x^1kVBvjZm_;T<*osphTs|XS&pIef~1K2#% z)$f<^xSY=M9A-S|@b!7t0qp7sb!ChSk>6yMr*}T)OBT+4tTGY7*GYWKTx*1rxnHD* zbjLY;s!u|i7=H}0_Nr*6H-e5@mDptj8$T`e3TVos)$1Tnf>)#)zHMU@oXck5%7vD| z>8Lf!RC+w5-HyCOY#x()+1}B4ptce zRP{kkEAgb{^3r0`Y`6%MZHXK~y{7L9%(l(K*6I}%xvr0E**O4%wZSEJ=`Zo@znUqL zEcfOyZxBh%mW;0TrS&7%I?$lplXHi3h;j7ebf`x51j((IdtC((&C;DuE7;oP-I-%6EKEdUg9f)`^is!vRnyherGM^wq~ze@P0ET_i?nZPFDLVMwtIEhV2~~ncK>rDlV?BC4Y9$ zKF7PXFR|>e<4%{AK*R76wN-M#pi!k4p%I6+U`hHZa-z}Fpq>k2ygJTzoFBPTzp{6= zzB+_0(p&iAX8eliTfzbr%c5%>@wN|JJ5TR&8h3@o!se-5WeoVY6EA8aet4ozvUg{d&l?n zEc7&vef^j|B^cEZ5fCNkvXfl02h4Li8`!#OY~2~2**}B5`+WunFR4D|?sdXo2fvcT zqo#-1eE13U`#WF#>R0cDJl&VI16FS-)N%zN-0oo1HdVx*{^_3{e&v-{?$ykn<*N@d z+j?A;RrpSWZ^jU~8v?IHZY1+?nSgaF{|q~2FL2iN8J7QN*h{bu3v7Avj=z{VPnYF! zr3n^^w4?|x)lcSEU%As^ITt%Fj*d6R5Ago{5ax43FR~+^TXs~|oo6wb{VxwShNeeq zBMTVeM)*>ncsqX^glG_eInV@!mzHwRLycvNpJ3!83`|a?#=t|%pfz53(gwp+|4=r{ zQ(9zRHqJvV`O`7O8X(zYjAS9fF}Ce{K8*l@ya&;x6#(g_NneuA?aFg>ouJ9PC&O3i#ErDOs9`2& zF;UOLqEO6fTj7mDL0blyb&j6qQ;I|Dd=CIY%xbMlsZTQ-pmMOnFhHW0l?T#lbF$)VbxHeebdwuWRSNpy? z-N8pKtMdp>7A?b#OYWsb7X*}-E&$LxC|Z2o1J zgAL45+a!H(_7N!VTLW9CJx$kn46w*#XIcYS>avdf)v1+Q2}m^DD4|T9u?!~qr0`I; z1Rd3*1&$_`oJ&tV^;DI5c;TDh{H7fp9CX>Ri&6bgSibds%K<>^d)~!J^(4DjKg!7R zM=)%9&%ZUrHd5iCcdRe)tp7DGebi?TgB#xRwFc)xWMyKG4mVh&i@{^uC@jNR=iL12 zmF_F;e1vDu#QMZxtpJ$$%&?C|Z6hr6i&5a&{vsa)n&4wNGkm?Tu1!fY$SDUxbolHJ zXvb!CR?%mjXO^5Mo?`4QAf351n6O6x?08mL$N)N{P&RnUvUF4)jv{>2PgV^y0FYkl ztI^duloW9%0rVp4b?tZ1-U5B;5ZS3-c~+)32srDI-4AesDJ-Y7kZvm;)W=ae*`r|q z&{RfVW>MT_sB>li$vD>};q@>Wb>8kRhEr~gVmeWgD=%zI^O$^|DU}# zi;*n3?z?lTeede(s@|s8=^oAuXE-E>5=oI1MOze25fWhOlT5xCkOV=17f65&8@8S# zKo5Eppa=WGunqXZvJ5{65-3ypOv>i+kt2~D4$1DBo~^s9t83qv%*y5a{m+dP8F?$S zx~fOwY>uj%5pm*d5pixr+_-Tg21=ZwxHZPHShg>K-9c926oUnbx@&tfwlK)&sxqViLoj_W8B?H6&K_WJWzuUMos)uIhN=+mI$`Q6SiB@RS7VsHAbPK(s%gf_40Z@C;d&bE7&Ra0vNIe zprvVE*Ibrjw1p>HTDSh*{!LB>T)I%Zuu<+UH?+u5oh#09dESo$0NXF01xu``I_4~Z ztDpvu1>YI~Xl6rCej&-_S=7sih|=R=%F9wvHO?w?&0O&0xDQWlW1P*6IM=}Zfu8Wu zO?qj)Ls*=s`Y^p*AD18M&FV>EUBU@|N|TD#)0B?;?PCBi!KG>TG4T{#aBbz_zz%-I z6Rj?-M^Wd`wSv9ZBn!HTm+&`X&>%Vvvb6s|8J$MCPNSnON=)SD`6NjPf`;pQq026> z%cPf%z1H{MDk#5SqzeX-oxaFWPIEe1k5a?V%2bFt;^R5tGt6QqK)uGv7Mkil4LOir za>_g&(HQr7$SM*P4Sx4~_KPK6GND_=@ zPMD2&3v3tMJh^vrd%Qk=m-3m`Yd@~+P^9C@b!^)y5o_tIZPm`)ZQQ-yd#Shj!QuyZ zMwUhzdsBNlmdJ|63&qPuKx|d3_nW6rpVmNei?6AEz)Zlrk{HOIaz~JHz>04adEXZE3W>uE8p}@>J%;WDCUpM#vbq7nJ#QD?L zKKHrL{UXyz|B%M)Do;cHByte@h!8zp@dWcS@4=qu6Tds^{AqCQX->wQ7_c`i*d=X* zwJ|0{INrbrUWo+pTj`lC%#L#M-U+tg9aHCTjn5JFK7eLT3=db;QiCUu zt=2T&7YrHvL(Ime*P_*=$k-Jkd8vxieC=IHff@qy^5$k}I&H%M7l$aWL8dH^> zRz8c%0ZvJITAGzet1OK|dO@kz02)YW(VlpEV@L294oVt%V49fc#1|ok?J?CFm?{fvmWMvWa!2y3|0EjcGLpuuom; zis{FatWLJZm;x);fWihB+4Q#O+x?WS!6?U==JiUqi^X%oT~ntC6*b$J*?&s?ps={= zRw7s2KUEDT#Gj)u{9Su&D+I6i*NYqD8|72$r}oZQ&%ZJygD(Rs3WT<`7$xpS-2#>!7H7L>Q?KZn702D zUWI-Q-B*P#r+ggOiAL=;_s65`MEHxp{_DT~|NN)_^q(F*E}wS;{=0expo?*7x3cLU z{NM*43c<3-RJ!@Y>h`*eP%L+vG zrGgRIe5HBV)7%#vXSgA(jeqp+|1?iaT{SnuflIySn(AYd1puVI_% zC#X>m1W91jov`glNQ0|^$r%O!r$A2M{XevB5Nc845_-*ZZF0$W^ogO}lZ0b=@(Mtj z71^U+a{yJ<1%pw2YkuJVJyap(jyFT0lU1kI(4smG0s>vkzn5Qtdzr|$d(z-Y*De`) zHGyqt@XKj7Y+T6t!a#Q{PmBDa-(#>T9!1^(*jWzT2UeHTNtf21tPic1Pp+PPNn)aHb=^^4???6jh6LKI6NknE=f|F_6@j)_Sj@y(7GjYRLzfb8TsoA%}mGR|}uk z%mTAVnq|-dLQ7n>S&+);-R_QeW4uF3O9tXblF!nA|L_0(+Hd^EZ~Q|>j-S($KaC=7 zW2=~;Gnc0eaamqweGUMd25f_=%UeA4|9}C&9LA_aezX)wPFAR!Ap0>;HeC&=^wbUH zmg;y$7t-=LS)7J}PK~Y8h8nv)yFIV>ygs$iTsXsd71!>;MZ}zIW6{= z`qxhtPtBdKpI&1ypm+be_oEAWLX^F0=M6F2g=Q=6g_u1@MC_vnXh1c^&M}BR#)A^F zhTl23T;f(<@{_W%x+gBZZ16xJn*q@DtQKkI>d^Ui^+TSemj*ZJWvin7^@7RD8YRP& zQaG`TrRDlLEJJC>!49=3PpAHA1C(=2p=NtHv=nRAQ47{76!D~oE;YO~z_VOhWT!Ha z(My3$iA*6YyTCA}NiVJj4ehYr{nL2s@R#%*ca#@s5AzJy^@4Ae!Lsg|JKT%*5VFM-?Q zvNTP++Z+@8uoHbtm<_*!JY)8tpA1){cj;ASrlZbNbwRHeWEZ*=cil8#(R!T0+F%aKl{@Z_h40f#s-MDA<>E#wc?+VXHSMQ3}d=rZNwfx z-Z8mBW2#-S7Fkd5LpH;>O(UiSKzdi|Mre158@O&_aSDFc$`IFGB6xylQ5mf+!Q}@W zBH#k$9&K)xH~Z!r^QYG9>!-P4vkh5{o1q{7C!=NVd1(D&?c%))jSCxEU97JRVAjUj z^hG^&hP2K$17IEG!w&%TWTsgJj`4{D0CKM^$Kvv05J37^LQ+0TH>f=|kxYZiaH&TF zfL6oY#x5f{>=zxh0$qA(wKvaWG{*YN>V=}np7?_w;nF0ho8v|tN5F2>piS|VeU<@$ z4nuLA!&EyoO|oey*BPYV<+aoz!g;_B2N`9Qu?!UzJ~(YW1!Dj(hF;o`NHYNGR|##n zM~z4ZSB1`Bi^cAu<1T!)sM2euU9W5)sJhe)fa=m-0p#rBsN(H4f}Yql1E9`S1Avz3 z78}91P*r`f-M`W96xSd7ZD^3`Hde(d{Q;oG=!hXo#byzh>Ck|XDUyBd2eI8kvzNYg z?OWALeU}za?3}1>4Q*+MPQ#WyL8n-L9><f>_6}sc%6f<){iW3EpmmS454?a^G@hpk$oA2uGAns<6rs8SKjl_ z|M@@vxmRC(_0u$B*Xg(iQ=@~<958cE7kpWo-}K%x+Gk5NT(2;yeUVGM`)xA-u=jT0 z3(s-m2tM$W4C!f3cnDWgiWg~xq_pT@t3M7zDYNKrkZXi<(I;4uKE}Sk^Ud?C)Ai{cy>8HUscLY*XsIF@{HYOCr>M>`OtpvBp^LOb zz$~J&g@j=SAbW~$&x>?WU7JtvpiV(A(~htP6B?L=0e}_uAu4oCBAa^h(aePQ6tJdW zvV)5>(kti|^-GYV?yf&+(x;?%?AYcQ9qa@h^aSa8U6ne^XA0;Nc04_KNx=$sxk2Z@ z%nZOL17Fom+YA74)64Zlwpi<@$UvkIy|nPpHY9?l_Ulg@Y?mjR2RXwPfB0(lY@GqX z5|>_0`1k)QKiA8i&^6GcCY#ICpsP)t<7wSj%o=!F_RK_ZW$?eI?RDJ5s zQ18$!)&i_r4Yz7Zb!nAq47&fc@pEtZ+msb}qmsy!t3SiHB)48V)53-~M61bm&eIqcoq3orMeYhGWglYAO9+M9R~ z`@DYp_U)hkXaDS<{Ve+gTuZa4`qL%dT)#B^of`hXGXPo5j{Vu6{n!nLozjxC+zss9C@{_oLvVcYvUAVaM2;uCwkDLgG8mwAV!;X8UDfdTjt+zH<8rRs_V^l)*LgM z2O;QYs#qpO76t(NX8)mQ0FbX1Ep)QB20;8xt~w+uNtc-UDnEyy7tvOmAzso;bo!dW z2LM*aM`{b5bLPV+dj&wl%uGP!os>sg0~6rV&!$UL-8?KDF1_>CcmJAV*GlOz(g)Po zJ6^jc$BOA4`vwDmHSBd$Yg6dJZI5=z4*X3=xVmowq!+HpjD$Y>JBfc1TAlm;hPHPN z+V7LUE$*9TbdqkG{+GaXmdW)oU!MU=U)7}ssMJBWo1tSJwOGJMl(vVi@+F5IvZEOQ zf1*vxK`NzeB_CJ{(k;WXSl-h!r@-Juowuz4Fr;?WHo60m3|9uL*9d#?(g2{zYJW?S zT$inS;j+eq+qE=5Io~_7F;ahQ@3A}eagKa0Z=Yci-y@ywnFDgW0W?=eTf*T>r?yI4 zPc95DENl#HeE<9l=NqqHew7t|BvKq;sf^6;R6Z(0sVXsa`n^0XX*Ow|S%JUcq3J$f z3iL1-)Im@>=~4?z-7ZCPBo}CgnF;v&+()Os_{A@39l#x~og*=Lha$ZzW&mV#x;nXU zeB&Dz{?)(wSD(6d>((bQj3+Ua2`=xbMIu7Gk${_#20jK4VZlAEPGh=?;l7F?zru9Z z0;AY1J^2eqh8~Pv?3~8KF`nQ_grx`kj<_jro(%X@mt(@2`hTVOm6MCj#Z$}%48>=< zkS8&Ipi}FmKRK)g;SJvXZ=5KeSe$B1ZR-1Id+MO=QD^Epf^B)Rd{BH$H`){^TeVjC zK7P-h&V=DPPUT3JyF8qGUkd>F`e2VdW@Van;?Av`FB@n}gLRxe5HF5<-Q~$q4MWy! zNr$|A*DEc|ELtW~# zFQzz@Y%b>C0nzt*ZsFFU-{J7AUB0tt$szmfX9En!Fh7xRtX!|aH^ad`^`4$pE6kS< z?lL&pVwHS;XTHw5xn5!@ZrDHf4#!vaZV&7a$X5BTm^U54<>VVw_vLQiZh5dWSbuu< z>BTeUGq-#Cdlvc1p~C)vvSi85xCcImcr84u5em537-MbG`Q6&?nYrrR#497O3=n5e zLcVhh^(lUol@Cx%UzMF;UWVYx9*fj>0h`*RO;+3aB5S9JA`aq>>U_t{{)L!rGsd3U`ED191knht0YERE|1^!)dD=itu_tK94~nmZW1kwVzRnZ2R!B=w+_=bf zN@RJ7NH5!wkTk7Hm_WBnG}@=&p>GwBuTVlE-M9~TcpY&Ez3$Q}XzD-em7pp}QdV}@ zxP9?Iyg$4@S|8n9E3Nr<#>cBma)}N#>Tq+YKD0TwKUmXO02%}YftG*dT6xIFDbulh zgon#uXjSd0mKaDh#_D6+Y@@rjS=!t?XpI?B$6s;g!Wx=v_q)x;K5N63;XUQO(#wRx zAx`&&w&!M(uKLy8tGh1^y|ge;8kpyJ?xos(?G&#kdZXrt@Hvnas<}D90KZzF;B>(0 zg`I^n&s}^#(;@dtK50Qayed}8j|M@@v=MOOw{3wm;vpiK@r1Im_i;Pna*5THRLImpsZ!kh# z=RN8j-e28j)VhGLJ=L{RSLJNWUBeAvJYnxQuE6dj$YsX#6qX{k!PRWh7SW-VnDXyg zEv*i%7FSPhH@8n{;~mr5%sld!tizppR{hB_fY3Y9(bDMJ#m2?OnflC*IykNT6^^^W zFy=u|AT-XlAaSZWwZ-hg8c$bQ1K7%8OO6mVKNB!fv!v+IPl)H#n7)+rqE;H&f+1AsM6 zv(njapo-*qSsK0M2OXWC=`J{Wl(}#E(QTY-8a?$@LOKA5@|^e(KjOky-*Ioz`QO)~ zM8Z|%Y3e`fCi&tObhENk2dzK0q^_JQoLU^{8(1d2^`xCyk)?mtUx>1D_U3o~6}!@8Z?OzTM&N&o;r z07*naRApv|&vx(km-}DmprcjGfv*KnnfSdIIdlxPbd+9nqm8}Bsm0pj)#u*#+}YL1 z)!vEaiCP~=b!8>g;z6BQM7oD?tP|C};0yqZ*d)7h)hplq?sv5a^aeAk&tVULqnQBk zd?rA=yzE*!2^bu~JiMR#=rXfbKlZ)veea{3^YZL-&pnqvuu6R2@$OwU1CZ2a@k?L& z(nnbF|FblzAH~>CYGf#f@g-Gh2eOv5^)ZI(9c-Tn-@F0Dy#<#>|ekeC4c!Nm}}vVT!`34p4?P zJlBgg1UqM&XXme0t}YLjd1@@N>v8BHf*-l4{#AVvfDT1i?x)Ryy@>l+JdX z2GOSfh4%)WJ$YgCyF3AD_5Ui3?KV8MazB)E%z3msmnpqv*XY&HYqL>&ElL~*u6+aE zfLiwSCkEOaMuX`kbkmsx8f-`}XYRFPzLy;XL4w8Nbai@%S46XSPuv~9zkNSD7B;1J zE~%zo*TN&ry|g5L-hQIEL;cb}n*E4Nm{L#Gid|dK3!G-}NblVB)$6z3v-+Op0^Jq^0DCVk&Cx@g zq^J3c3Wn1?Se!jG+sjwMg-3QDnZx#fINvuv$}GT)+i;ugqei4R7i$3~Ic@a4ubp^p z`^?Ch+4KMNd~NsryXC#Uy{ym@e(0l^**NuUDS}B)E;*yYKFd!({qz9#u+4g^|HI6{ zJbMOwma_y#v55)Msvf{kxOWda9s^$uRHxbK?I-`kfA|kQAN$zH{uHV&b*Fr1rer1m z&di$`g(_SIqAR#E+xuSo{`bHCVZJ;41P$wTjHus@5FA;O-RaOoB8TG(mcs4HpQn|3 zysx^$wEr9ffOQO32ex>F>iA9@xg_G&0|}-?zhOR_*7ci&K22kpM;*wbFhMt>|!hcwwqEwS2CAZezSLZtp-z zHrcL27awq}yNIvGSq=MeVYtSCVux9Pm9g^JeV*1fSTkASff5vv;&OVaF=k;`jqj>C zk-dL)qCBy{0AN)!Be_=qqLhnr6;W9w<>hv2IKgJMU1~2+Dmvt3im-Oq6RBLQezN#s zzj<6u-|LGM?XI`Zdv@EG0-31O(H>1#-48hFDSle~H_DXk3!zFI z$u|e@3WMimbX!8NE%a+UmRR!Tf}RQ*KycZCUc2ymsCH@Z($-9AW^t&0=r&KG%Y4nR zQ<-YKi^^n)DzmYSA$6?uQia8J)t=SC{=qw^OQ+|rZCzXE)47^vnG!ow8Dw;cd?|xo z^4c8sg;wwz=YlA%dAm5=MFBJ?XTce&;Z z4?8W<>GK_CW1pvV?VhR!tiPeX{T_BQ2hIa$0)n36smiem(tX6GS+&RL2Y&K}7hd=X zn+9Dc-JS$pub?mBccy!{%>Wet=|BCaANVK#%3J)H9m?zr9X)ahst!1kPjFE?I3vszo7rqSxPoBLq9 zloQbz<=Rx@$M2|Pn_Fs@ae}A1)9Lro$)46CI|h{cCOT2#_(9naJoN5=nMU+B zo$Q*p0J0q^J8+D8Nw(;@Z}eKLhxh(dJc(VR5j_c=p3*yz9}VQTP1$SeUuzQXAxCRG z>|T=2L3inDOfyh67y%%l>8ht~zPm46*}1aH`|)qi4$j_R-CMn~yT5y`+Ne&jD_`06 zmlL)eb*YIg)|PDW+TiZQz{IVy#j~$n+`YKEH@uf^w1bUFE;>XxP7-0VVKy_V8IbjQTqv!Vb{bUq+i?1BzVLKmW7U6qkr^|KFp^epCau^j7b|z$iRf=M%Yf& z9d4ic(cv%a$zPlNFkQKgz4yRRx3KuYzRf7T5s^H(L(`QH(MLoAo;Q3;@N~lgM5kC< zDX$DIG!~|}8e1nB_4nA8zgh0`c{AQ!epYM2C;`qv?+9kag-LT7bt@K)Bt+2Mo;9$5`XCZxd>ydLiRj)c&9Nd{G zPAp$JtmRf~cU67TI|@ACQ#;NWoTql0@mG#?#g@P`r=qKeBzgdAjn$-XHG$ zu=K;`QemmORooh-fgaG>3Xuw5Yaw`ty2ql%^>c-DcivZd-yNQ)HaUT6JDr8izoFd9!2bFfT#ayI@xJDSRIn$+IP&4C+7T!8~E2{w{$4?Xh=7dB_Fgp zfAC!A)Hk-$3mflc5Iu=*+L3UA1i*117Ukvi$Vc1oB%6Cu`w?hEqIm`bI*dqd6zW9O z7;u@=RR~f5r<3>Cld@Jkzjc1+-0rzozCZf?&FA}`uP+yttGp6B$t$vvMjgIzQeE;_ z>+SE=!n);?<&!Tzz4`PHAK!X>v1h1fe{X=n1eTU}(g#^q$9egROK0hq_)Hfyi<`rn zJz5L!sTV&rduQm*`qxf;tuos?TSu==)*VbBYoN(t*+H*Hxxc)_&U$MsyuHo6_ni;l z`0y(ydroc_CJW8o{@s#tu1vdr(yNnmxMoQ7IpUSAE4%Zx`L!?ieR*N0v~z#I#zN(C zW6+8tub*1kT{-`aXTPy>aq!~encXux49c_+(s-rn!bY@S zR>qZj_p-G(_!C z^514*BhSG0M-KHLMMe2ZJsK=2GmCq=>XNHW<2KB7f=>1X@$~c5$ox0~@kgf4rC8JZ zRNnpTq%^Y~`O-%?0nb26R+4<2I)9z`r^SET_~#Uzw6>R4#o|4j3o^BN)+T!0=UUNB z18{#H7GtZ!AjiT|C@&H1r6|?c)9mf(tv}LuWR*d|4;Kd(?{4;P_E&l;y|$n)sLR(W z4PFya(8GJDs;Aa3HZQIY_6+W0i?TDzxhhklbmj7SKz?4IG%kMP#Y@LJM`&+9R($N` zq4A*=zMmi38QAG#@W{7wutYbr|2lhaR0j7ZDid2**RC#|DxcaZ^_3dTzL|YleNpu2 zB|V5{gAb2WHwIUyDwmZ^v#@k}iP9}MXSQeN8T{VZ=-uE`i^>)2LLc_oS9Ivj@c?7% z)%EwhaPEbjp5dOYXTJW-`qHVTp4u3DWRWaYxm5b5Tkt!Tt(A3B-ug_idFj$6b=*5F zw0@3!?XIk>e1ciBkHRP0=A6J$9p&Sw)A0Hr{lmuRKmYkzfEr9_5O8qx=M?V%{~a{| zkYULs24ivHCx8CufBspfj6O-)2QZ##CD4#%1coKkZF8QMhwIcdeWR==|Jxkw^C|;@ zT?|PpR@+9P!N{XN&>1h+6KS!750V`v-VDw|>7olP6g6DI=n#2kXco7N+r3N0rD2|? z$F%VeJ(P~-({0u*FXGeg9M_r`DadC>EcPDg8QA72eDh5G%ob1IoUgf+9hhS(WsPGy zqr+qRJc!-$8hlQ;dAWXhqol)IY3mW2>8f8!3w3M;k%p6Jy6iv}`@F78U8hpLoGB>d z=4Iz_;R+VwhQrK;Hf^!50;Z}{yL9wgSE1si#cG*?ib;*R;X@(a_>;myGQ>ol@picZ z9(79PL#vLoNypm5)6F1H+2e%AXq@yJoOBhPTuYfO-sv}wD{|{(dGgodzYXq%efXza zURy^Fp4+DDDPJ2BX;9M76Vn9#ICeimqiiR=DLp9hAl*9Q)!?(qRQD>=|7%*5h%6ll zuXN?hLLVo164R8{92jnL-ZNWgJ6APQ$BimXNQ-9y)`xZX5@}c{zh2hb; zr^%bOOgAW{n{2Vhu_09rK?ka(+ElH`o*tU9A=!2-RH-v*ki|vDWn~o#CF%!0iA4Ed zJh|8dpVF24R~9L!o4o4K0X*6msI3ia%Ru*tWW+^`ypR(#Ff8zeF{>A=c z-$-AfG(pC7e3z+b6zRal@++v9tzqzEdZW8KYwm;M#fulUt6Jmv=bwL-LBJX_0mJBi z7T875(;Zwhy|VHUJCC~`iinNCSQJS5DeU?guDPH6*`KZd@gM)OHgnUK!KQAH8Bw*RM^Lq?v{%mSHjSKXhU6rBBCbex+sTRe}WZmJYf+ zoCweBWO2&Z2LJ=S-#pE<k=jvfp;Xp<^!_dCY`c0;mSs%E+pH$7bERB!Gf zEo{}I#3>d|U7*3$rddZ)>b+`j=>&FthWmhG*L{@MuX7GC z%NzP?kfVD+E^y8;1;9p{w87d5af7v2-vPIXO@0L1{4pgb`E~Y(`of1!+fP3N@1LfP zFa7TC{;pmH=oMM^CCQ;2-kyo?hyj3Cwkj~^Mp>M9g;oC_q#^w<#`37rX~Z1u009YZ zY;9@C5WJ~|Q{VZsImJti4tFF|Per6p&f)g?J~=dpV_n&r?cuqBODeNd1vTR_<5yJv2PU ziMu(&5$eM@b?rRY6g0j5AbKw!)U)~tMHkDX6TKI&kVsekIBhJ608(8Tj{D35Fhj~> zzJTDq_()d3Q_va?`HmBOP%@GDj$^b5UeqJ-GaBJDy*`M|p61C$0{}ewYg zh6GIw`(2`Oo28@G)W5xEFrn}ae61WvlMNaSxcDfp&;PXeZ<^~78cREk&~uB)ja-L<}Bzn8r#dgIe=EKJuKWQUpW zb{61myd?uVD<7AiMKc@fMw7@O$if3U^X=a4o}Ip(o+ev62`IkuahV=j_N?rYC8(h& ztUt*WuB9mu$uqljxERVgUA0uT0l*UrPi(UHY3*C1-Pi=EU*(sTtX)!%Q)g?MxUX&*;adW>dU)Y8Q z00my_YK!0od%3)f{j4$|(56%uxOXmU;DZd;+5Eus09@IEr{xa5IxOu81`@lR8}NO? z8UWnpvMqz1Wu{(Mo}|5PT{b*?+p2%K;$Qyqm(P6ebD#Se-Vc3N(?ec)P|3L5T)Q!e zIHKdK(?H$D$X?{Sug)K%^O1xM3>3qQMi-34;7Pj6lX072yD=p=Z9Eb@@k(VGFC8<= z$i1{&Tpn30ES_THp9!V}*^J&rJ-n|S`xpQ$Un*Q$oNP?)abw%(P*NjP<>7fBhcb~z z(2M8rM#;+!IYuBtxm2#A0c3D!^7Yb2o8U(_UF0Y|Ty^g$g0u7uIL>*zP|gH{aG83=;Gy*=G!bO=+%c#lU%21H0{g`@p&Uo z^xR82GJBT6i8k-CcmMe2Qr-a4Xg=(TNAf!Ax0biAeD(3KUcGhs*6`@&XnkO30M%>;G38?h6!ID2imM}69+emO9YLAK ziFS{BMF$AI!1b53&EEm8GcLS7GQFIzvmbFJlUHw-SX=P9U-^|^`3&2|pXp5U_J_VB zW&pZW!|*r1`OU|cmzRHrrp`QHp z1SPzTAT&+^CKSPCSg_1S>-Z#RHzvMt+(YfJd4@Yjy0hEzudkm!Rjz>%-)U7U#T-+))JwVD*9TIL<5j;*rRWdH{E@ z%_i|wqt(tMbh29bmu=z{F&-|U4uR?aU8et6vEyYLM?03<^AL21x*{d!TN0tyX@uI4 z$QC7H`;#=3!p|$z%1l1xU>tHQ(>-+C;J(uAgm$;nci+CbjhCxYcaZ1l2Xu$P^6&uP z_@;GWfZUI#caoo?db;DMX%2IoG|j_~`P}keZSTfH&w}>xpMXo-pwnp|;7ev)3&1d9aBp+(+HBwK*68%; z(#LLnY?=Lt3mZe$e5R~oJ{+hldRZth$`CH*NqF2Rf)}26;t4Iju5*n0E7)WOJF4(a zzh=(PDjk>U6>}}n0cSY6Pr`MQS8#tHegm8w_#)U^7^rQ+-%;)zIRikYPyg$G{jdKX zpNr^d-)nTJkS3oYL8Lh&OD}Fe?xs4ZTrn~xoy_;6*e0hH8d9!+vKFq&Gtd%En6(-p%cs|g`;HoX=MizmS84W>DH7x25%^fT5@={-7&;DhfElYP zePTyLGyqJ=a$=}UfCwbq$vLj4>A)tP__u^DZ*o8A(4VkoJL8w+%W0wv;o`~+q$img zouT2?hD2$xnY=8Uk<9s|e$>nJg};Md`ie%I676!I+N@eABhfm;Hs6IOWodGVoA3NB zlKd!LGy!CO4!120ypHiyzIX*59dSGHNc9Lhn=K~16g=PpuFH#g$>qVGoCR~@v7NDDG)HMWTuX05R0UWUYb=H<^~#m?-t}t>V+-Sb zuk;m%=7$P=?r5co4mMMv4!4ub=SlGZ6J5Np8GRMdU~sy@eWUeRFEEh&1~&RKGIXk> z(Ixbq#6{awqG;f$PjIjEAo7zXva!b@7gJ?}!|NXxoWv9PiU{T0V zkT#{tl)*oY!?<=>?f)vD`n}F#lVyxT3zT5j_IZ-sSdtNR!ONcb1=A&Gz@S7(H?V%3 zHjgX3kRD|yuKQ98)OfpDxL3Y6`g-&AGu!p;6PDDvpE6<*9LGV$rYIHO`7g5N?;=x# zRlP^mZfNNDa6FGAzYA_sMk>k&R%lXo;%Jp-fzU7}>Gl-qW$)rmNCwQ)T2g{%L8o^= z@Q=6w-o^_;m8W(7LgXoXm?w`jG-PUQ();tF%01|?Pv^S8)To`ThaTePgMX7xJldd# z@uO}uxLW)-!}SPH|D6sadMN$4pH`Tac%4D@68EX4_7}b?oMYlDUxIc+WXJ z^}QZC@D|!phx5c1$r^M&Jh;wk3DO=pkG*MNVo zyr(Cl=6mPfyEZa8QoV8I#>LWBX}ezITnB0SFivz_3@rNiGUhb0*7+>?OSIF?D_5@68Jup>?!Sah$&PlgSG}g1 ziHy1gTvjSWVQhVBZf@?g@EPOqARU<1_EkU^c5fT7Hv(@Pgfj^!9V=N zKYZf9{Fndo5uR4wN9A1ttVJE}%rvQ3a}Er?r4iPRqN_oJv`M3RkEi~73;-7O-XBA= zCnw|^o)`ssr?YrSS5hV{!Bd*krw9+gO;OeV^G<_}#2Irelom$sH}B7|YuyBZ*1LbD z>hCBn)t)fZ{Z$44OMFAUtnGXG+)XQ_b6BygekAZv*1>zQ><5*z%G(Pyg!B1`CFhms zG%4>itaNvsaK$j6?s$3C%=4ej1P2b{YV>Kt;a?B=G~{gT67(N!)lR@dLCDaGZSH^OR2yc&Y9J zS=?z7-*h`l9*hZ9&y%>_)0AqFeFkdRmalD%6~~r1HSiu=CvVVl)Z;MGy6gwECDtmL zewnRmXu&rH&02F}cX{{xmp}03^Ea>G9PY2NgGRMqbxoGdKFyb2(%&z|^G^67J<@_> zvjGfp3)py#duIiln>@IE7uXNDkCwPJ3nm(s-+_C{68M46Tq1V}d%vvD135hI$A9nl ze(y2T+P;*4z;sGz-ZsJX3FB>}bT>tR;TL}4${+l}AAF8R>L;m`^Hjcl4x$P=j+2dG zEISy}>r5xz;aZ@P+J=W#L5ru~ls+nrH)T$i!84o7jNA1PUVulOPP7hl9=gZ;7Gv&C z-=3G3OUolG&6QJZ!G=F&4rrImmuv$Wug<9Y?Jwzm$M6PZ8gFXZ3CcU(W zMqiRHlB2q)S0K>qwKWZ}(Qg$Pq8Y&Ay78B8S#sBz0i_Gc>!{67`37E&FW+1OcaWD+ zj3;t>S-77rB4;}0-+xd2lNi*6a_66vxELASw>c6#8nkrQ;&0gB*sq{3rC%0vX zv96^Dmy~jrF%SVEO}aa6pwpTF*-nYiv#Z$DJhpm+C-)QFS0vRw0KT@Y?pQX?KlQ~| zGO$q{>UQDQty@3!>Z`97|LBkY=!?JfOTTm@#eKVm-*y84Hx5-y>Nth(#9#cyU%Z#b z^CxJip5{q?g6TzD&;gAbQae%BP&k`3O*^G&Rp~6#{&VX5;iqj$wKz$5hTCFmM&OQ-sKrx{zn1@gVymh z;L(Oes~P~Hmo@;>qD0MjM4TKSgG(pD#Zv6VQ~Yrj6pV0=)XF2xpLlt_7;T8>=@d6y z_a%gIO5<_inobsI|8X4CHA8C+VDh?4|4dAaiNid9ip!3{-2?%gckyTeCB> zw+H@a;P%kwP-Efbg6n~rMr3-5qx5svCdq$ zaN+%o&^}Bhyr23$MS7l#cBXW8$fP1llrm7fF4VS%42c`skxi z5}s_we*4AVSf}wL%x|dNP7Of$w}1P$ukd-E_JjT)m4AkY#cv9kpsu{}=HYIJO&TWq z9+_!>9q+r&(~0f$2VY+R=eVh#^7nA3^iD99;sF{Ny~8oSRv56}{WAb4&6VcH?ltet zu;>36x4H9HjP-3SdRUs`^sI1Ty%tW z!?i{uE$_gy4PSL2*C|biI8VzEGu#LdKtmL+##f_~&dj;3I_;5s ziKoG;YB0;Ita%#4d}A&?u7`A&i@xZk8v_7s`>Vr<&TtQ;pClexufQvlkp1dDTR|`F z{I@1KfNeTh$)PS3^fL8u^r10b9XCX+6A+S|a6CQ44X$zz@jQ>VxFO|!@^U0YC@#n2 zIkJvXry$At@8|~`eRQPLyBoWwzxwo7r*2-mIjAK?y_`WL`O?Fk zbj&-430G4)*qK>~0P{AU87c@=Jh}R~uY>)vrK% zo<)YwKK9sSALq+}%h1F=G{`m^4E#xcYrClYTU*UTwHwxyKaJC8@t>jKAL_{;2|9jN z-$^erYJ7#0r|w}aHF#=Tvh7_JxH1ko_p{i+xWiNbK{WYvGj@#2;PMBW>PL>yUpD(Ojkz%KD-lmuAWlQ-s$4$h0FEJD|`l6SHqw|fbQtGp!?fUsv{5Tydyl6 zL0eiLS5@Vgml-$~6kIOxErAYJCz9C!K=$VNhJ4H)m#qPSI)7ee-KX)|3w-^aH${RT zB*nHb=1o8i0MKok`#>B2*m1-O?lCpX@-4pTvqGb+Q~&HZVhymJnRLp@aGj3p$8vVw zIo~twelGb)(IeA(y|@o|>%5b=1a`_}8;r8Cc&>~N=pnw?fL$&FU(V!+Uc6GjHe73# zMoRS)dneXM8Y8z^5O^2--PX4mB7F#lNY(-j?9cB%^1XrYUH|rD-#*Ff#=;eZ`*+*i9S;{I#S5cq$2CGa9VHsEofyxN%M zB9g0_0Q@qq>YinN!OwGVJOf%fD9%y6^`r5od+V#(QNu~jZ+>cacJ}==P&(dsRK`u^ zI^3tE4IPa`6VcKmrFrwi%Gn#$ts4(-96RyP)8uiLE|=1_;ZWgf zq>3~mI`l`o{*BV8OkfxN(53gK^Du@F_%U4Bvl=UGdP|Gz=w#Ok>$FO=JY0Kf4nl#JMcPR3+%?)mS(P9%CvL1 z)zT0`M&JJS{>A$}_aA@t{Hs%Cb^ss0KTfZjb?mOQ`(i0w{Zc$lQ!;VWU1^?I&mVq? z8Kz$DvHG9<$)C*ePV*UgF z=HL9A_mZTeh~Jj3-7?;0S@?JV?%#dj#TQ@v<%NZXAE(aLaJp+5o7|RoNWV5D;^9fh{o1>K$8o~r_@d>i(|GF8p9LD`b@Zzc_tCny zMIFoT5ZPpH!U&7t%-z)D7@02etU);L3ckSlz*zk+IklL{!sn<}-^eAEFPPNQt zlq?3kv|e6+@BQifr$*LBniu~1f;N6aGaG=UPxoHdCLyWgHhtA8r)h>9epDvP8w1Va z&-~2KXm`zBUhRH^*TsLv!1$$ZbSaM{tXx<6m@ z(jQqSRY|&nfk(N(PJR2^-~Qm*+S;dRM6Z)@>}gYYs6w?Gd7Y=E`+P}oM~nW{DCxVJqEm0{_Fj zHe4FLJv!M%X0(>n$+|3OV2blYJnF7AfrQJ|&;Won2{Q};rkPE!@1D_5Xl=3t=;i{y zm`pr>8liRmz}xhIz~U`1LNnQ>qZlUTX!*#+g_7qfm^tU0r|~#Qd0LM@NROyj$^*Wc z;PC5l&$r7>^lHObB%!gi1lKxy=S8CHYVc09&P!~?N1dd6U2G#>-0RybpI<(|`x7tz z#O(Oc_?>c3dCktl%T7KKf0rTlhq)GRMqB2A6cHxJiI)*+^hD5^GsAo z##iMb9TPpH4A;|j4!8&M>IA}PuvuauU>|LI?XUjouU@9D|0XlN->2Q5WdNa>F-MQ( z5CI{O>J#uw+`EshuC9KHe&_?h>=Q$wyN)SMp5I#~o-Q_etLSv79xBvNe)5x-zVL-F zJWB)h0g!ckqdlR7iaC_t6IDsLqMrOQ2JP~v%}BITT1TF?ed{m0K<5S;q8U8!a+n!z zVgyd(JPc2|f)im$Fs4U_$k*|-gRG?C1}fbv-J6)N&Cl@ef5bFs*>6H}#9$acFx|g% zx^Q})?Lb%h3;hk={c}gsKE$jak>8I1&C4p3U)S8{?ZN4!ViHyzfZAdc!Uj+9B8}s^ zFLvUQ;94A*H)03UgPrNnkug58JFV$|@kw}!{8&!%b#XsbcJk)s_=Asj(P=M zNs9S)9kl_L2Ef_|Ri_bZC%1HV?N~ZFvgFa&HZ(Bde!I=!WL>hkWPwo$!mi_kd}nQW zPV!-J#X}w=UI$nzH{yvd�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�cW>Pf^{(;oFg8b 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%0A;ob>IMFYKtZVxzKc7d_JU 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%0AKZCC9~%3? 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

T-ghs`r8r~Oa24l?`h!J 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%0DQt-06HzgTaSZf-`5u zMP)QOR(D}vZGaB&kXZl*bfel&Pvoq{XNDO7u(1{(e4ri@ZWzbGDjxMP!Q)_7dt1^B zK)jI>{HJ$oQbPyskp@6JTKUV{+YXQz?1R>>VI@M;UD=;Kddfspv7AQF>56H*0Pk!W zcZg-WW1Do{wYFx=YRAGETh=k<4IJVsJI!b4$wNLi+dWOk_8k|UhV#7k)1Pyilb_dD zJeLo4H!mLU?YyWr^PCs2y9}&Go+6EteDzPq&?9~A?bG$wzWnLJ`4_gd*htSAb|029 zoXh4sF*I$!xc*4i`ggv`R-Kf!e8|%AWhWf_({@c~e;8xP6F}^DfRM8e`P3m9JdQ{B z#;SC9(yv$koDV{eco=jHj?NxHrz6hJH89Y{X3~3gm-N8GH?H`(@+Tm#3!F&n;w0$c z{=pyo0q4AfpZS@eS=V{st9ldQPl$gN{V`tyVB{xl@4o!<%iq>O;;(-7SAX^Ph}bic zo_PR}J7;M0fu=dWuf-1UsZ#DxNm)=%s56~ZRjG?QsdFW^sCk*NL_O2@sKI!fD`t&9xZP_xN~7|clUxi=kQ9x*O_PZ$KXoFk)b#W1m<5VwyYy!mnty^6$u&J_+4B*2#_qDl%Sn#-KvBKYRP_ zx8K+6_um)&aaE}0tn^vZ&pZG)1^j`YcjVguALt}~SCz%vs!kE_vs6KgnkMl8fahEh z@XqcFcex%ojesq6NLV*^uJbd*66peXgE9oBxQ>G#wsqf!wE(M^uI=k{!3Xn8E1If* z&T3W(8CV?b?JRIhf!72>@u>no20ps1S%MI78SvQ~e3xNb+%RU4HAd+8KwX;>Rr|uXAK4c!9s4{5w zO+4Fy*1LL2;GWJYSYn-R-!h4fZ)0V#&xpAlSj9R)FL+AU>g&WQXVRnmLmB16{(QHt zWp3}WZXMmfb7lWve?tff*s7@cFiQeuHnpM6<<<4~mM*;T!SU+FZGBi^VeW7@P9)g3 zPp*G_R&e>cOt;V27tpIt>{N8v6j~*irg)+NiP3OSB;bp;j&kygj*m5{hE1#!L8ZVz zmKaewW;W8$bBoR#I#{AL+njII=Xmy@*+p)E6*{I{2dun^2n^`xVYi%H@F#+3apj-> z1|~BBEc|1W5C!4Z;w9PoL8ZT}?IL#B&I;g4Zcje2xc=R*eeG*Eq|@vC&%!v1|C~Kj z2R|&(&;IPs-qIq6Z>cigRpo6{kgOz1T}w^{c?&SGRN#0qkgm>nInbhZtYG5GvFQuX zI1!&#q1diIrZ3P!cZgN;T>)`g0Xn*D)`iu!+^IbLz#>3C6U@frfpgu}sqw7i{28&T zNZ5QOkhcu-1+b_#xskTf$E99Ad5s1?{Wp!6a9aE{vbA1F#{tB_plR?ueFk$^=~#i( znQi{tev(I{UOPd80l>|hH`njnxwE2!m3w9O6}B-e4SEE%&G18mhn0^%{`i6x6|SnC zVZ&im&&)yGlNI)Xrfs)0;MroGETpAPGNo!6q1!G%VA}JJ_cp8<>ezb(&A7U`?|ha5LHu=SS?@ust)#Z3(>@h zv~`SOp6Tep6P?)Q8LfBgAeTB3fdQ|CfGhHiRqXe4P{`2gE5NgEs0Z-_2V9+JVnau~ zVBm-8Iv*YV^k-m|$qIcuGru5sI4S!ANg;fR(C3HKxv>EYQT_oO?`qJ-8_kaEL zPyckg_m4mJso*_zvMyA4YUODP`aZztn(p|2H1&B&(-&{5axT_N9Mhu$p{r1_H+4c^ zU@d?Of25P?cHTn`o@9_E?HJVv?4V)A4D*&%9C#&$6`1&=(6a#!_$5^PVs*Ar)DUux zM|N~8V2_S_`{CWCgPl$7ed+fx3f$>QEeO=GSe;b((H$_U5e*u%&fC{YgQtA2@k6rC zlsL%|oh3WuGm@TTAL>BZQ-{5%DSJ+m&mAb2@ZzOWT4cAa)wc6$C+r;d1I5IK{pqFQ z$){MMd;9k7H4OkR={CZ;=)Ikb(z66%A84@iL~CK5XaJz`Z1>#)u&_-#aVUBF+Bx3I zkv6^QQ9krbIa`|tn@zZ(+eMwVLWd9-wx7I4hi_ga;0$y+QjZ>OYXqy6dm7e=PAhj9 zKBY>%+1_9wIzjtj zUcmyV=@?h?J$wv07>j(S@wNF|`t3+oB=&98qg)E&k77=*tqH^FcUyf zCmhrJVCk5SiyMw@=-Q&N(Esoc|M2LYciuVpH~;3}T>JXhzy7s%-+lM*Y5;I0K)RpK zpo&>&y(IP-04UznI;wBzLijKLy*)Yn}9& z1-MV6$Vx`&M9>N&u_}_4-s`$DThos5K!yF`ofJDc2x@4ypLRwNPe`c)!Hp4pZ?PlO zj(3#fu0?lxrZo)kz=5ryVcZH>yR5YUm#*&XS>8N)Vdr+@(nKmiIy;TWVn9th>WgFD zL1cSbcBw>phzXJJ{OQV>wBSvn!&GP(MXu30krSC|dFqgT&jF$iasS%2YrA<6x)hAa@GPcTNEe1tP`t*@02CW!@C3)B)_ct|EpU3x1l`mryE?V+mcuFgT^wv>O4=B95!X&F$Id{-%`J)#Kk5HC8Wqiga>LPYC?U?&vGw1dvjzVlY; z$&+b1r1dAPW4)K-aA9$AUn`b-3tfASB9JD2!uNnmmQE5HhAwO_E-l|(zjWpH()AyB zFu$^)2mfQ>4k{K=pE&9DFZuRpY|%jEpC z#$U()V8r;AXz%`mfAA09Q2{>FEP(p+-mx*F(kH3#u^3RZ0PE84y-+ACF?M`kt2IK` zax@BdmgMS&T9b)P?wGoRNT+UBZ%I}^z{vD1?gcQkK1Y6C}? zE?wH!mHM8p(s`VP)t%O9;4>!BYr3*A$MpSs@4a_XSMpqLb9G-|J#5*~lP^*^W`Pb< z{~PN3X zz`{3zZA5Gx#in;s{)L>kj26}}ZLgfa^7-Q8LVTXL?huQg6{Ew(D}NVPRzF-^zi{K+ z>iO-(a|g#-_Al?kjXdPZwqrQVk*9v>plUm@U1;#xN>KKsa~z}tXCU7?zd~2Chk>I^ zjYr2RUc(9V~hTXmpb3Bt0t0SlGh8b)eH>Ls#(CeCR_! zj;nsf%|5os8zU5jQ{+RBypH?0{~t^hPj*=F_f`4%RizmWG+QY%HKJ^qHQ1LwpZ)yL z|NQ$B{7BpGRE1|`e4zt?K>-hc>6d=#6IIIls=QC+Upy9=J1-i^z-RVqYn{U4odCS; zjhC~;%YjrW@Yy-7B9Q}!9Zjr!w|7qDf|PadROzG@nvX-dU}88McSxVer+qa_ zy$+a{0;GAn#q&9Y{f?E1QKa&Dp!_`ERXyxuB{)goWH1#4XrRFjdEmp ziBhk-Dj4%A{e{(JEhk>9!=yQykhRW~*m}g_76%Z|!K?E>(3LUI#qTOV91+@1)t@P? zS%4LNVB-So0k{=lr7TmgT==4s#++nVKloT{Rti&do5>;t4s~J5q)=6?Ji}fs?IzdhyL!7FEDU{NFwcF_MZJ%@v)xPLW2jdD=w3Xj< zVy9dAF{M}Wiaxiveradr;?;*s%gc|{zIN2@2rmwA{j}SN)d*=e3$h0zs}ugi<@NLL zEnd9#@ww&myIS?D`95`W;u4zubVyOKvM!tNopkqGcp-}lo9N_QJ4>j*KqohwHn!WF zu^L9viH^SF*&o|ZyT*zEG97dJWm};JEjw-Kwi~jdi`}`1eFAxJLC7+~hmOvG9)4)w zxy-?Kd9+Vr5CE~-Vz9u59RBHI;z+ZKU^AQeqAoDrP#^ZTE;_DAu3p4?zXR!jp6de| zYv(@F`Q!V)_=~^Dw|2tkLAj87uHdQl=K?uJ`JoE&O;x~)lKE*>@akCwkh}{TjY219 zZUyj)U=~)j=c$Dk{8MbVorMf`*-_qsMGt%IkYOAmmd7uJD%UWJu5|(n9XkA_mGy2d z!2a(1_M`hthdW!eG+CYDmZ3)fM|vHw1`oO*xV*n{^_4vq7IucZDK7gMG@R+m8jY#& zl@$kTkF598 z+F$r;IoV`iDBHR3nEk^>o*23K5h3$r38qITbzB#XS9H3@-P!D6rLCTB;stj81YdNC z_c|BY4Q~c4aC%sY?{b^h>QsE04ZFQMLofa8*{^s-rs1KZ5Ll7OeUP#}``WkcjB^Vs zD|+JR@}>s)_jR1!(N_Rh)g`Pjs_c$Xw9g1KOSiPLxN!gCl`HS8zWnxw^J^D(^f}N4 z-Ea=4D5p_e&*Y)o@4^q-P)B^1p@)Tj?7XtSz`{<^ah(P|b>Ig*68VGOYJ0$|*@h)z z=u}(;6Kl+d{fT?>=pn1VHadBH=NN>}z@HA@$0O&Xl#eTT%B~Q6bdW^{JkwbtKu~`c z8(3^$5q|&ofB*2-ty@R``d|O+Ywy4R{#SMHpQ-;Vwkr|WdF;>bb@LsT1SZRcZIA$P84#)JkYV+HtC2KGL$riCUdT zJQnDkf*fgLW8=fLFpyEUJ8>EVnACM_sK^iGpfwEA@T-iNqIPQmHm+RX)60Q&msdB` zn|B>Q=F1jkILW6o8bD~u|D2vGIMl6#{q-v^?JcdX$DAPeX|MSrn$!4hf1nXsT=W{f zQ$3M^QOeYGp(_mYW3-UTgG3KPEF8c3>Z?0%zy0>+#ful2&N2qNZWGWd9bOF+a`KxO z1F;rhl_vr;3SZJeEZ3uL1Quz^#|(i+>dRU)uyOC+z4My>=N$sop7E>Anznxva_aQA zHNg2?@49;+8i(VtB|8Ff3!bWgUkp>loj$ z{m6XiNY-)J_>*Z2$5lr-p#xr}53tO$S^GT9H~Wd#%iI3{=I+g7cDu^@@AJG26J zLkHT^mO`OSWkygG^cQ|HO7xA12_n&;L?gyOOf+gVB7zzd$M^${$s31ge4~+H!jD%G z2XJ_$PzrRQEp(#unTKbd-tXty*LU4(@B6-==Q$luS-JPU*1Cr8b**9Vwf5SRl`>!K zo37aV26lpvZ|Pqp)=pYBsExb^oYBq6nYk5xr02NK-XGKo9gl6rJ761aP8?!W7E^V; zq3E^2yiWM^)YRl-`!2cc8xvRD@WjZ}?7H3}%FTat43{Bd$|YYN!VENmh~8Q{<{?5_ zfjWqKu5|k9AbHp-ysmwCbuexisd%DCy{CStkS17X2v!&{4_O9iHgp-Z;Uz|tOJtFn zLA{bkybRn3FhH}J4i?9()CoE`(9=#`hSX5&0mrq<)c4YzP9F5$UUtSfUY0E`@6q;Mqe$uUC%Fm zSqH?U%#^6u^9icJQ61c;^Im{>;Y;dMt4+;5`Iu3m>rUxBm7UUfYJjdn!5DxQdSm00 zTe=xg6M)NCrZk9;dlJAWJvTLbjB9+1>A3|Ro@S!D-amWr@XEdyT)i}_NyNm=ygoJD zd|6KRTE1lGfEF8Uw)EMuq1I7#9hf&vw$SUk>7)nB(C+N48u-__8BjNfE^{eB6T|cC z5cYIH%ngAo>uc$4mcdupr7f9!XeS-jng6WL{P*T_|6YP&$HQ;?J^+1tk}h?vscZ{6 z`#+^g&N=1vv}WsTZN?6tXsbG8K71I^Hboa6TSwn|mIK=9Xj2Fs9Y}=G70>dfMO^Dx zrizg%1xeXBIKptK=s_A(K4T()ymb;I$}ptd)W<;IO*WR}#Ed9uPDfpkv8>||sQ#=M zvCh)9vyMz3y5i`8!<8cklk&^aRiodLftuA#FxaFza*1Ra{9h`2bJ(<9aJCE76_W`aKc0B)YhQbt zj%Qz$e3<}jr~71h&*%g|4zV_J^ur(i@ZGu_`Wq_T8C6QD>>&=*f>dHuzABF8V%`TZ zt+TfYO(J;rJ2HWTTn6LrHnv_gPTHg4p+~H=u`Fwwh3>{x95kZDV#ij?YbH5579R=X z>|NUmPX$a&&&Eo?2$umk%h##^8);SuBCjtBYPo-X-{Gs44qS2F5_<7!;l?j|RrrOU zX|wpB4kHlT4t&HLu=9+;-HmS6%NEzfnFL&R*=5Vx7WA^5)k+^M00WfFHla_Bvw2(hlJ~d3KqMJ08`w0R*ku5}&YK>@o?KwnJkriP z?qId-r44ANhl%aVojOFe-_lJV%nQ8jbR-}4iP7C!U)3`G+UUf^SDo5_{Tsfz@6s#o zn3|cpUw869A%PW^_G44G*3lt0?i1M10^quMl3AFVnYnlV1xIe4c;PGW9-ZF5GNBj$ zXu&#sRs|KG(l6|WZN;qtxbi!6s2BCaNLz;tbZ_Lvi_P-rB(2m{C12YQ9OU5}D-!yv zbik{zNJkz!1Y+A)Y+l61fnNKSY5Q7y2*AXYOu;anL7tO>v{_E#$a|niHr)t(G8J5V_G%;#xMW!FW)N( z?)>lGFV(O3Bq>kJHQ280s=#I)SAo8wga4J{-Ka{u7=}7cQ!|ZJyO(F@5G&|9c=HYT zX)W*aYE@n+6K_{bThV~jEgLj8*R^TF!k)5-vkced6(jG?K(-E{BSQEpvEUhlxDpOo zuqv7cb4-o!a-fa*i!ay6G_f@`w{K$Q+^Gq@JA70lQ#{fp6S`$U%Ub$=z_{KZs22#W zPwQ=ha~EH}I=%1U8c!93J<8YAOV~+sk*@r)4|b>IB@^XMA5ACg^lsxpINR!SpkNZ9 zGvy_AAWiDVc%cu2bNb`RI9Cdh6nu6HlxzFC1Q5TfJy~ zeREFtpK}jX9CL-erVsrr=*a;s`%gVFci_<1rY^nep|Smk&y0+3vDQq*7xUP4z^}S2 z(3Ow2Gu^U^qkPZ_H4gdIEA*5rb>cj-3R3U+(U400!3bupV+His_X)`_HsL|j78v9^ z^5Ku^95;+%9dK)W=*XZ$(DB7KxYIxA@Qj5lgL{U+0?+hX2O0qy$CW?(vp-vZ*~?zG z=e_TJ?_sS%-k=r6mkO5~|H>tUP^gX>nQxp^Mz-DAjtT!(oiKk%rdt+QNHl^PhD!l6I>7U7`OTaFP%%Xg0ObRxi?2Lw zt0+2I#Houy3nKvXPlBXEx2BT@D=~}RTGqN^>RlmvBeIs8<_=!EI=%P6`tpH`$Cq_O z;OeCc&$zx?Ho>-zsW z_3=%uF0e|4dDod;iF&N+IOwk0tZTQ8b))Lxu~qG0Op(i=-O{lDF*cA(nr*a162I<0 z!B2YV*1is~YdfJ=`D(l2Lq#w4u|cSKk%V5`M3(b=QjWsdQbNnD+S5dtD2R+^F z$IX9ZANarrF8|^ezxXXW#_`zSRF)kTwj5(~^bZKNI1p z90Z5@LqQ03S~1VZ-tnV9`lItI)N6GX|B7s&?Mmei*YrM309dva7VlYK(H-9_q-87Q zlpcfyuN)u{v2W=g>gZVxvP0k+Uc`{eIApAgOofdrp<93&kf3w+KcW|h=yiBH)1Tbb zox|%>%S&TS5Rm85!Li9{-BdKMNx*@1&idsveybcBRGQ+}J7KF#f{(ns(MpR_3% zZ2pQ|WyrLUOC7g&qu2nHwj_&Og;#hGlNT5rIoJ-{*$tWWyITf$#n%KIiiIFPgo5;H z-_TXQi&gvliSxGB!1LcKV{ro)~?>i;j&Fb_0!c4q`%QW4ka)v%Om{t%7!0twc0?9r>4UYYNT-g=;r#?V?hCa} zpM98Mq~BrR=~N6I_VqfTL#XKt&;%VT@VPumz_9|lWFz*301O6v?6Gm(Ut?|%2YAJkd=Db11& zYb3GZU~K1!;X_Ye=+t}&*sN)!Q$CW(i*iHn=oH=UbikPt zwZC&5V-_*38=DVlW$|j6c$sXz09~btb`@kB;S-twJovx<*Z=yeCIC;{Cx5qd;AuJ7 zb`4Nj1XqCbA|2IP(pOcvx2Y0eD*7RKR4C&7DY)lEEPl|1MMHDL1#bxCQLky9`_{b$ z3?89~j1nO)TGRU*JZR=Qwtp5iJz{JnE_p&=h;DrJtk*swWMkKR_{t4|>JOW` z3~)|6(1hO5H^)Rkj=A0)+uoqOY2hb$?7%sbkA9;*rYaxhD_xrm);b9IW>S}JJABJT zEDY}WKdbu~PF!=%HK(-mF9|zd_~Q!AzJt7R9S26XN6=`qI*$(d0T@wt(AkhdFw@3& zK4ioTINYBg_-n}D~*CiF;;?h%NyOVtl6 z{e0YKeN}e?YLc&gT?L@xC`Ze_ZQ%>{3D7c*1b#H+rvA-GruLb@Rrbb-s8^`eg z`?b#nE05^`W*su%utC#?eE3fknTFRCF0>mRV`x7sWly}2W#3My&>~|S#5E5A^D=FF z5hpKX0xbWa+dk#{rC<7`wfDT|J!9{G|NF1hvFjB&cD+o;l|wrA_z3~yHjUN;D|F*& z;&D{z+jLyHLt^nAVZ`k>wx5acj7$Kwadb^LXnjQ$#7%&6RMzlin!gQzQ;#tAx=U(t~-JTeI%vMCpQ>mfs^c@4z|w9~8K zLz5-5BB#G-@?cgRl4-Y4D|m8Ps7zO9SRSn4;U_^m64%l; zuhF{!w4}Ci=bd-1>zdlZC$kbjy>MTFRuopjV%9GjeIO>8CFGcwbx#IR6d{3qm0X%P^kO$KKLX3zII4V*GpvGR%9ACo2s#_`NRrE*YuQ& zJ}&)QrpTs@`+-z@Ea?zTGb8e%*ZV`jpbLF~PMV2wgdTDV#x8sa<`rTi7}z9}ZlA+m zMGrZAVe4QOox~`*$XN%T^0pJA@EnYpvB{w$xvmX~l{yT6iXDmS_A}kguVsDR<0Bwj z0i!v4XlDB1n+>JimK`uT-UUXYj zWYn_~p4AC}3P{23{=V<~zIip^%XB5+mCDE3jCf5=>`-hPOBFpS@l74*m$f3mD~4kk zU2(KNGBh9oSf`bRC{lCGbYA=rPFeg2ImPJKJED2UEO}%VA`i}h(2`A)m008Nb_95d z-4gED!{rL598d?*T7nXYyzoqSyq&IPc8c-czJ;vw>|lH+Kxft)n%r?C-?(Peyw;b; zKI>=oYd`ubSv%31uF0R%0KLdWzy}HHLpXeukimO_8xA%2^U3LY0?@^4<#hmH_PR_#yWnT{T5{!+i_8jrXRrd!AMM2AEOo0db@Y2wTmxzNxbJj+SO zeuRALMENS2;3;pch-=-HEm#t0`39eWA~-1@q+r+&=`}}%T+t#=Kwo+S0LXS6yF4{+ zsx@}W;1dzsAp6M=ECdOrk;ZTG#L4Tk54{f9aY(Ff?I(VyR6d3uwwrPIVr<7<9nr%_ z=%fcIMO|2*V?fGATDK%pgNF|aeLU-(M+`>bRDPmvdY_G9Ij+H$8$B&w`!O)Bv-@QY%nZ(_g|(r6!JZoU>SrTNFob{R z`s=ShA?$L8?Le>&Q4@+)J?i)PO*h^2pmzGB9{f4;7dHD*-5>Bdwyet<&E;_%{#mZm z9w7s-Q=is#9QektZDMHN24PsIV;8*8t#q(e{6Qc?)N!WmPj^5nx`XVXThYVc+HTED z*|3xJQty^iY9C6}^J|*zKqDycxX(X$$Pdto`emO< z8Dj)q>ePN1r<~!2LfTIZW0m@Wo;J+0on6~!&}36+=|IzQJnBw1?03jAnTAg}Tt)z( zv(YiF107lGKt~5UeH$BWV0qP{qDS9N9aI8K$Bobd$2!=6u7Q4!#+(hUTGDWb?z`{4 zYqc7Ez0y}pc3yTo76G?oVEmImC;0U9-~R32-YJF0wKb0$?5O?J1)k9r06GwX3MV+P zGxtYzCUy^RIa0&jAo?L1fl5|z2MlHL9J^7Y(WEz~v&AW0dzq0)EbY=@!f1?wltK2R z^C?>fgoF*2=wJsAEO@9ST~U-l*y-z+}2bkbHI-9j+Z_d?1< z8>mQH>PMY77-^sbivRuV@q$iUH`~OJ~HvcKm5a2>XP_?iQcHKSFKWv}YoIMkfHHFMr|fs|(XVxlXNGyEBb;HUGSux~(Z{cs+WgZ3%giFQca&4HrXPg**O zjSg_7?VLUz`{;nfAA$NKh+cdrYkKk`GCk|uWsDdB(F;apXBZYLyRx5hQT|ZUU*Z@2 z^tag0e4P2CgM6hEKBY{dBL_`e@GE(*2E;u88XJmT24Li%F=ptP!#ENcX_r@rhrEsl z@ytIbC^~7SJe&Z`=vZ)r-aPsa$=!esSi23juVdUjvipx3%f14{ZuOrox#wg8@E`y2 zA6viod%ySfx4-@Eb2{6*M)v~n;sn0RMu?uR#);0ZMvc7bA<_J8>8voW;c7*JFU*b8 zh_F%x2zM-FT0P`2k@&T2bPVVUrlS`+2@tsAN7i-{FGX6B{b&()o3S0_amaeLJ?O}F zXhk#=MK@(jzRR!k#;s{eTermNr}KzAy={!|HMVfLCt!`UbUQsS zNXW!OgZ|lTuDRwk6AN@%RUl^TlsC%Y`X6SWa;6^1&{5u1up@@6D)Eu`f!bK$mQcw- zYvGemycRum3Pzo%cwM`J1s*aEby~Er<5)b~4Xhg5`ou|Z>82fMExWc~VF6(~q-#9y zGsX_SF^CAiETndto|#Xi*4Ao{Ytzfx5JW9 zF@&73uuUlXPSp0HS;qF!O?uIX$5w|rU+IJhdDD=y4VdIj(+Xe6Gw`x0gdTM5%jJ>+ z@=OGvvl&A%kNj=w*nxAilDS03jF*V^D%m`Y4#$KHtpZRua1;t1S&?~n$Xz)@@n(dVxRbf!TSLA^?E zJTC>rix)U}GZBDCqY+D&j#kHp3tIpWLGZrWIF<>X^dhb>YI?{bQ|o5h*mc~(t{J;Y zMe5X9r;iq&*p^ zb$x$LFWXtrAU&!!k9JdkVTat{^S|0w$#?v1*@tJ}6vsUWOdfc(wEEDPaN}7b<7yJH zo=*+L=Y?~pb^naw8V^Gmphw-p3!#S5st3`7n)>)<(O}ekGo;YMNPPEe@Cv`yALIvo z+YU!k7h5$w|5F@ZCKNh)o~QOz%&m!erO{Z zWi$_3@IvJ*bRBcO~8 z24rwdcNrKP(1FfIxsioW8XYzQG-TOyEZWkE>-y_n_qypfz3EL?eC9KsdAW`k*GY$^ ze}DBe^tylGI*^uKz7)DDyASB5<-3j?IdbP`Kl|CEmU%YgXJrE53UI|b|MNfp^ACOK zLm#^9-h1!8Lp;vrFB31$!YtFR4AG-?BpA-SN~GAKeUPYQ zpp8XG2%d4xQ*4arELjHQfYB3(+`vC$2eUCXP_7WuPS{MMJAILHBJl?COQ%Lgm@OId z*6pyc>$+*_$fondV%%!+umjPU=6CbRr9Ym5GgXfzdj@#Y@X=!fmYtZm+F(eunc+tw z3DBI(Yxi4P-d|>EAH3ADO2~rGrkTDkAi698hLC+Sb^=7(!3!XWvfo4{4jwXuluePI zOpRfC60#o!9=Q$%_(T0jUf__nEO8xbxyr7~{G;{rMztU)@6g?(Z&9UVvn>$+^t*E%KLsPtjAbON+jHhi!jWnW;x z>IT;bekyczVxUW2QMFE|?xHLybYAxHwbF~Eun959Lcj;|Y#HpUWAnpj$&~uDj>~~P z;}JVw>yS>Kal@=>OadV2Bz4a}|MNd@zUy7@n$nv;uh%8XH;8;h{Q8x@cDmW21F8L& zxIDuCkjAMm>&D`{e(@K7@mat2Z?F1$iaF0hOl9Z*e23np{z)x`a1Df;BF@{g4$f1$ zj4;m)ftsoD5g7G_UMIp%1~-sn(>-XAZ}9+92sy`Aa$E#V=#K*+8^51BfYOm|`P3C3 z;#at3-T)s1a{wK9>vrurKP(R2^lzBVQ2L;D5{(@+HtjIX>|9^o_tu+|s!^_Dj_cvtK}a2fISbM8Pnl6Wb4$4R&20k*6Nm z2KfQK4w*L*ta4BWJ7pv8mcNT{>@FP)^Aaye4Y}=*{jq#vRcevMAD7$M#aDFLjFrlD z8EQOZ6&>_yUHg!9w|~oi%7fdg!wM^GcCbtfEc@(9C|K&3_~o)O=*O`On)|G5w4Qqh z$2!;tj~F^S#JkaXGWIK-uvwKQ>|+}l=&bk=<7?%YPXc)WrhZiAf4EtL(@rl@HwV%EC34`twL^n>QkQz`&zD_)2idkW#g^VITA$a?>68I zLH8EjuCxDt)VRmzexI}OtgHaIbZ$83|L_n0aL-Tt#82F(8P(Q1-tmqXY8m!hRIvw= z-}DSxM?t#Y(Hw^uWHkhD2b@(yt#Tb#H*0VmI2s?-)TfV=2Ct4`hYd`nog&lKF+XL| zB?O*jvE2y+?R8{Y*~G9OyztRN*jK=v+V|o&Ov$wJwJdxE>qci+zL_}%tKkjPv2GQ+ zzR?a`VqB;&3LPQnjf>=(V48KHs!w={%?iWnrG<}f+Q*jbBgp2d@9~;0+KlD0SZU7xY_uWv*a<{ONF`lu=S7iwKq!m#o>exD_2`{j*OQ`KT-_;4h z#_v$Cb-Fmnris7?i$O{IMCkHI9zE-#BYxx=aKw)Rwt;G@0vtAE6EAcsEZ14sK`w2a zw|(p=01;&&jZX};q;vlcAF;2&x5$#9EChJykxxD17~tXKA9VA`ql10(m;j_~Ofswo zCOqnk4S6;u1zKI+();gU)#jlWDIBNfJA;9ww-x9yju_2#M>vHB- z{{HX({HGd!ykfNsHl>Zg7R(xPtidXUE;6n|9}exoXOPL;In^OSW( zWj&8-C16@hHG9<{qg)EmL|{`DUU1M!SsI3#c8nhpveC>lnK&A=;s;jx5jaYROs$k@ z+Zo31Q?Z|2OqZdui*Ddr2STN1o9Q~-2!&3r)+HMfy*NaYR;Mi&G-KE|=Tonit)P0z z)Enr#F_5VWQe!&Z7pEVwL!YOv+t>$?F1DQyI(CNDJAS9{#w@zfUB1L9dD9(Rwj&1{ zAEJ1cv5sSO2=>GDjEP)MlS+B5Gr(?<#du}A=yvQDdKhf#EHEm$BGa+kqNl$1)fNw| z3NJ+M8+50`a8quP8wm3tq3fniMh1;YWF?Mu$& zLMwzF5{X^xcf?)J4!Nm^Cu2YD1)lxpkPlYZ$RHXrV6ag?46K`8BwgiGaTDxBl^ue|%Y={Jltz0KZz7tG`80BfW^hAH2k|e%X-|uSCeo7oL9O z^Ut^Gvg2KPy6IsFtQ4W=AaVZd?az#p=QJbwx}a}XMcu7N;Zds{ExF^+hy+a@CUhxa zFZTm*Ll=!MvKuF4l1AF}h`|`ZE1hf@A0T)Y9_cz1JNRp#Yk@jl$)M-07Af}9-y&1% zl7?@;J3fX_6~D%B@$7?TGmm`8kx+1Yw{fG@`R~+C3roC`@08_y?3cQ$Oc&gwb@Ohs zs7uMze5VUsUGKFl^j;AJ(qw9Vr-MZqJLN2V8%qqb<^>CAwrwz?Z*=sG5#=;SCF8yn zHuw{M(J^rsb`kB7vDIf%vhCz(5aP%9oV{=o&wO+Pdww+h~_f-H5zT zZ~S|sws+`6^M%38exfu3z|g@T*(~F-e7IA-{+BKRFy57~{UP&Qgy&=hz>P?yIOvT1 zUR@LU7Y*XGx|V;f=_~SQKgAmSl96B5$G>jCx7r`lRe(*_iru)>K}Roited

Yw|$9OJbV=0z80*M@6vH0H>dCW#3w%SBE2i*rSkcD<@Yne zaFDIgmrm;dT<6oDWxYh~%SwMnPru!7ed2^D{?)u^GX0!P00tH4eeZi8%OT6Z@C(0i z+08fK{2iKsU6l3Ns??Eih82VAxj1#ZHGlEE}Dw%N%5*_Q!ssSIGvJ{jFszSMhAO8`rLMdBz_|uNABG zFj={0Rwb?Ckb`Mo6xPjkKMcdp_@HFDa4VTLE$H}K8S3&w%`%RSCB5iN zU3&5z(RYp8^({=J-@)k9wXH5z5zK>RRhEiX>azGz;kC+N(*daRMK^s7e5DKB2JxYy zn;fz6TwY=YW4PT*-pVOo%VK87`o|UU(~jXHMxP*FU`0lMN#9lnG0PKMha|SZgsuUp zul;S$_G=wz6;|MYM=*~V4Coy!Y!*5?yS2~YjBe_bH2CnC4Ak}+$gz)3MTb^aM9{%L zG-T1S9iR1+H$TCM%0vM@h0;K&zenT8ChrG%)vI2$Pmc+|NU!{Tl}=8t)0h(DlKn-Q zkT^}I^N;_mD(HmtgkC`Qr4N4aga0LwQysDAB>S990ESc+or71c-gE1%w|-fbJ+1tu znrZp#O3`^lYkF%hjs~XoRM9jfmjZY!koPk4dfBtO=E7@ReJ?<1Z2Uk6RpTn}jt8Vf z$^j_y@JSFzf}s!?nI=Cd*v=qci&o(jTNbEzCKZ?LPr6u_1KA=6M#(fNooqSynBM0H zc#Uc=mM|pS?ebGRqAqWzeAG3XRry0l`L2)WgB7~zcl0BdA)Pf=W}7y*A46pObUIjt zpJfRjEYoS5;6Y2e{ircWmptiRV1&F4OFl3t54sgz!G%Yt{HQT(6A|ka-ysr=Ut=}o ze!I3~odD2Zm#)0+46|G4*b;zz^)vEK5pws{fk68O?yIb6*Vs01dc+X14{pjgiAK8A ziFpmVDFbPgvOM8PVijyekTab$Sam$We((`Z?4n}^bOQD>jy$AY=!C5O*sXmAOxtCU zMc?)rtl=eA@GPJ7;HOSZ7Ah=YN;%LYfQ3x5;_^VHV|uxv5FPmyHztz)o!|K#FgJel zH-B@#ZZLn1E-k-VgZLHpUA(3t!c=Cfd^@K+?4&9;&z&%R$4gSbI7h&fM z?a#7Tx{LoIRrJ4V;O2gSb5!{GR1UIS3eaVQz1$C=>ouO_xWODp$t3T*%|_n>V12>|exPT@#4|tid*Zu#JsK5EN5ygvvI&LJwwh0M2Aj z7ai-PgFsee(BU-`fo1>?0GX>hMEa!2E`^lK5ReU}(4DnH@ijrhe+v;;*da^Z;v4kb z0t>qJ804yfu9VYs^qTVZ_HFYp$v_8RA)c;*H%uq#$UkNKc~;(MA38qZlYPT3bn9S0 zeGVFD)b^P%f&d2B?$Lo}Ea=FyDa0TTU;2EBFYfe51{zNwaIb*ms31;0FVzX3Dm zi)0TWkL+#(n8M>E^uOfWr*-4sgS*vzHstF5{%qK5*`NU(+_=ggc+G2G^OEbXyY7Ez z0RJIX+KVe5;#TVOy^E(exh?AE!ee|Qme01TA$WF%Q-)es@Ug?ywBiv_=@3kMNbC|Lv2Cvua1e%VIi?J07jf4?iS5$>--DHPVBHF; zDSzUd?>Oqh*bo&&(?G{d!A3^okge0bkgmsmq-MP_z$p^pI63ZIy#x z(6C?Yz$;Frj&ah?uCc6#fo5G3PWZ`y48N-bmdj!t4bV{^ z8puP(J~41(2P`&YK}QGM=zQ&KUt9a!=RUXbmbbixr^&96-EYE1|$9l@GrT;thzMKF1)1UtIKkC~i_e$g}ay3?^0_#}|7u*VfN`C5=TW5ga-|zj1@N&K&EN#ryyT?fpI?K#K!m@XNu%`ov*xKw0cZ>`--Qwa#{NEnla% z(-DtQ>^9j}otc-chz7Nx%T&udy;B@JCiPj_x4jlE%O%m`LW?gY@2Jackh+rFi9r}i!{ zEljVjZ))_P*czFb*%+OeVlt5U;VbFLyWG7Z6hDIBp@&|rll(p`1`Bw|Qby}QXQ0A9 zv>Zf3mP4a;Oh*nKw!|rC-NZ82b)~93 zLM~~mKmOxC{}kpV-}epA5dFzk_5GCJtC7twhMy$2VJn5FqdF1a3I7=*Nk`LHcg7t3X^U#N94LSKKb zx8Q@lO(+y&?|pAvJE+Q%kk4K8oK66?E4Dti@VEx;|Dy_A)pe7@YMlMd-duUx z>6$0`_)dTtWK(x_&S)uSJ)a7Q#{ks#kL1tVj^R?QkLX39kuCimMO9ADK511Df0H&a+RG*r8%fogwRbL zL6kb`vtfK>c4Kz{mdk5>w@boB)cB)1(w?lvuStDqePUzf)UmnKkKTLL(#glJTsd>{ zg_;mtBc2cBufDNoXL$8lV#=tb68oXlh!pkMfvPQeO+MkZ)!H}-#FDBHA; z;{m>xLDsy)sO{QJ_+DdGIv#Y9jk+6VzoS#^+X(i(nHHd;Q#Wk((R|aAUdpeR`|!c9 zt#AF-Z{_1YNA#H9tF-cPgXFJ7*1i~LyVySIKDJ}J1pSY~`KOP4>|@W#$9}f+6W#?o z0eIWn-ga94ed*VJ?br5e@P4cA2e?WVJE5)FUwb=@^OPsj5{XVu$6}DzEN)U5vuaod z{)LR|9l^R~he21wl1D%xXmkd)q)FZCd(^Zt2)Q zJj>O3rq!4!+p=$djbobqN~~gE1AI&tKKjv*Zt3lOV?Xc%KX6!s|7$f~+@yi~3Y|2T zOD5@4sYLszIPeq)Ppb*E$Fe>re$S0J-uU^S`?;U{%3uEFUzRuixjdErbC$edCjeO^ zi{Jk3-~NDJ$9S_UZJ%f_RfEN)0PUc=sx&HFvZHz`U``D>qFLD*pMMpdMq@9g(+z6W zf}b*Rkb&3{-&VJP^e5bD`Z+sOION5#NQ3>@=|}IMJM-8B^J|OeCO0?M$8_n5TU_NA z2WHKL$B$1h9Di(?Awsn2)a0=N-Gv5+n3!x2hmJVHV%f*^RE{QnvQLPKRB|cKcD+pQ2+~@YAVQ zT-gh@@|9>)hr7TC9m@&GHg@!*(h2*SN55d$M|=yR#s;}j%8>HNv?df4J%F&y#tBYk zXQ&P`D1uY_1YKMB8^DbWw1QRX1V#r-+1_MG=`a(2vL*il2N`%Aw`=>DV-OaN5Ihpd zLnl-^#XeZbQ+_azL5F()(6^4_uq&+4h3*Y~z369COZ_|vF!Int4^0Z=TJgU_`Bw{f z4q4=O6Yv+m6i!IzEAr+4d+S@@`k?Y<@ZSy2vng}IOaQXtN@Y8*3Vi${ANk1VG;q(U zQV*y>VgjH_iki;KatoOju`#4Kq6UrGzm|FynE?2y0Ay(3S{6*v+}Xke7?8J{>76=r_LRHWcJ+ANB3^7uZ)QYT(5RqGa`*m zo?hnw#_GVv#`?&H2L5qfB48x|O!-Ac;7mXS3^WB9>=7HT^Cj+HOnj`$G7O`(A2{gjMwe*Zw9g%#luB%T9obLC8Tq_(>04{*3Rm#7P#cqz4YXY5;~6 z!8*jkvo5^2=6}yU_iXAK{Rl7o(K~3a(5rr5rWNB?3X99mFjW3u9z_40SMRFvv;KzxXy zsrQ~%HgJ#7q};KhfwTfJmM;k6GsI`~TE_SeJU0tg`sfJ0v}qU9I|B5fvfJtR0d7O6 zaY(a`>dl5*tLvkS#~+I`NK+4YsB@r9E|XS4#aGJEjw z;@qJZEKSYrTjfSUBv}#A-T|DdC92Q|2-hcK1m_!}N)}$~hG18An>_L@+$WI_jE;S1 z;S_aPIoGunVj0?*vj{hrlE;!98 zyPfDNcJr2#o+bgySFVkXoYhT)bL*QLtK#+n%F{^Ull+POByoa)4-L7Yrkr^$TQO~Z z>Y(oSaa}Y9r2)@D^0qTj2fUrIk}uI_GDGaMUfa@OSd3P9Q4VZ0Zk4ll)6ogNT8BZJ z%{GV?!ajBg=IMA1FP7-BV>)kiAu%VBUYzO*j3!-uU+gO)g>}k=Uw0FL?adfBn~Q)qs7w8t(x$_!9hDu1;6FB?(`8qiXb7UJ#^fJkx40dYpG) zCCiS>juo2$#6mwhm1q&CO?QwM&oXsfVfM+IhYdolN80>`u19&+Rz{aj9-Ur1{@DE5 z(%Gq~vQZuCsK0VXue16{Q>V>~FV>b9Cl*g1pF4N-;r(YGec-^^#~$3P%L6k@XHHD& z62jQ#nwB|p@Ruz@DPL7y`&aYpbkRxuIzLPfI$^i6UAacP`QMHgHYf{qno5p?*P+$C zU{&?dl`pbQ6DE?P%m=?~H`}}P=Z>y19a}E)*2P56TCvxXwT$s82l@)Ns&xu&P@7zldkcj*voUSbqmBYIRu@4(~clr5)tA^k|>)#y{|Z5A1#X@yBmCdGh49 z>#4CDvDtzxu1c$|HZrwUq+YI#zhD;|q2LpzaV^Nyjh0 z{PNH0TK=>e>3@jNM;W5Q&!ZCg_WQWrHaMkA0W+Eitj^ERukdsLvqCj`?AgL2HY^FX zT^THbUh&Bn;b1-kf7oL%XK-HCK)rPOj4AiY<-H(VXee?)%aDvWeS?Ix4Y@G^|W;Y)( zr$ZLGlr8kcim1YA>84EAUJCeJ)8yfwA8xuqM1*^$GLZR6{%0)mb3);Nz2uAV(LJu)}HG&VY-ouOCBfXTK8lhP;T zn{BpuO?AZq#r&dU9P37zR4z=Q2c6h-Vg-@PL=1?+N7lNLNFHf;xito)$e>r#&;`$Q z^2V&}h}786V<>omr5L=j%x^4WWWh3Dw0PdXrpa#jhW$DqLx3(dGOh@4!#;z(1M<)n zLWeW;fB1)gSbgIg-#GR|KlDSFY2bf}#*~|cca3BZpoi>k17$&8OaI@{8UH7*y6UQb zlkN%Y8_Ry1ej&sc+zNmzh03ZcOz9Q9m-%yA1^A=}?Yn41SFCjC1Wm6nKobYuSje+6 z3DEnUXVviYiYG-wE;>%CyYANO~l6Tm(-Ruk2 zBOaR7MzKjd=@o^ZUMwdg?9HgXUQf1r1HNwYm;g)8F4;LHF< z=wR8ma2XzfffRXkE1!dBJTgA3xBXft?SKs^tlS`+LPII=?xL06XH5m@#Io*t=ElI)#j_Jrdk@5l!1TV0 zR;K1JS{a|3*^q7Zc2)ygGjiL^swxMll27wRu9GJ_jJFg0De1cIs=5w)%J1ZR97r*a zEV06_V%tO^?b=og1D<7VqY|{O(1CAR5zH$wJn#~;&{597!G1>!WD}$4)pmzrSf}HM zF^I8U1~&4^EHM}aV81nZ5BE-XV9~M#&B#IVszMQn(4$$3akenX-^b14p1&as3%s@F`d<3t^6|M znAIzPU!eReG#>DwpX;T=$zbT~&xz6xl2PbPIFOhADNP*i-nVbx=k-*<-I8PJzXW62 z_rkaU63x`>0&rxvF8s!C{KjLNZQZO&|5pv(_fok}recLLq00bsJRZpX0J^jX;1Kc~H z{;q4CdXdo4y{8|(_mYzj-hBxx0_ToBGPk;TW9~?uEzYNxieW2>2rk6Nv zdS5Xen3Bfcb{IA)IdqC%ogRh(oz0=bC^*=z>hB1}ZTNy$DJNJvNt_n7oc{HQl;} z2Ojn30dbHHgA+2gmp00Ai+mlBO_`b;Y3q`)&!nwGx*N9B!EehO4|#lM>xSf&6#?_H zpE~9RtHLrp?5SS2bgiGe{>NVX+SeY|G5-dQ0k77oz$-O@;3ZK$k+g|zW9;C+#-V!@ ze@d4T{`$i?=t8{@eFW40TDwjY76P#CkPA_cu^4s73_A#BsU!vLERchFavg3r3 zbV5n8?&T3H8+5T_rUtk%I>hp3{<$UicCGvJ*GvdplD&6t4AF3X;|r zr7J=2xzmW%ygtQ#g8XT&WATbp&e%8g_CGMQiqLR*`?VX2>%sh{a+RaZ`X`~E9x>Fr z(RGvI7B?HNojWt3m4M}`y$5-Bz$$MS)N6&~EGt$88Z={d&^fLJZprfT=n;IK9}J-ez2fYze*giHe+HnZ(&zwK+OhsxK$uIm^@9eZrkI>vB$ zBOgXm(imxagUm_S>Vk%5LdHKYRZ8kNeg4oyg>f@r&||@W81l* zYc}8btH1iI|G46cE50DPd)07f=s@c}O7;e*auXhki zLKmyXuueB_)rXj17^m2CojFbr%c&bQ6AS279g{6GWE8?))t72M>A*q|9AbsOIQ?k2 z`mg*7*$N+-p=ZFA-?a^=1HZCmdhsy?^q2PFTP9dVQ1t^21N7*m-g2o4fC#z^jNRkO z?IPAxyfr>Px;i#JzoHKd#iUmbVSkW6;aBoP#%kcz%K!jC07*naROPGdLNwZ`0TC7h z4}4_hd$ghXfIuhDAVo|*=|whWg6==tq@EO9j}bSdR&|D&<=`h~@iTRz-1Y%6ZN?5A z$^aPjEL*`sFX@UJu`E~1KI&cj4CZX`Sn^M-_@plr0BnI}`{bdsiMFZxy{NcpE!Q8` z%I}+%|DU=a;Cjmeyql1AnYi(Y-+h-|cG;~Ok8W1_vEArjNHQ1v1Ry(sJ8h{u(U0rp z4Yz3a^)I@9&vlo4MyKpBMYc-Bel1-(k2`6+B#4^=_0_<6o-&|AsDlNbd#Ny@;}a(> z^vNey;n%Xe_DCXZ7fyE)N_y_xLyFmd~8jBT_5$A5R3*mvWFMA7OwWrS6iq+dSgCl^rIxEruKp zmx#S(-PC$@Ius}R&b-@6#jOT1v% zpm|_s2$_l={onZ-qtXf0Dqk?9=lVgWYrpWi_+YW2ABtIr@z^UX03#!MbiW4}4(#qP z_6a~6XGS!k7+W8m)Q7}aVaPDRpYXM!7tyNR;j?{L?DB=Vn%*wZK=LK56_ZV0z8vEOYw8y<; zcj=M8PwScgFN)T>>mLl{Qg%DI=alEdKc`MSS>x}2|NFmm{q@)X?Io97!t86gYB&#U zyN1@~1TF;}57(r)SohWq5m6 z8GE{ttOmrU_p7h1jp?m}`%gc5-^F_E@PWmXkI!miFo7v9O{7UxQBzd|TqrV@J=GO#0K^x(wmgv&=6Tz_K!5d_5&vfO*{2QjV2!~ z{uC@5b|J`Kp^;Z;*>M>vy6uKAe~Ce|rMq2O%u7e?0~mzf8K`bfRfeZr^f92Z)h5>n zJ(+(-dmY0y0T|H%VUo`Smk9uP!^#WYTiWgV9Q8oCsE>?OH0mhmiJ_=hRW&W?(S}L4 zU1OH|7e4}SyFM`}qRY|JF&!o3>?dgkU^YVSy9Z`s=$wh$R(F})<&d?*Sbue4& zfMvYY2_KkDXb_LV9$#6O&oh1o|1I6*w{_>8cjD~2#)-W;zJIHh{=ZMh`Tk(3y=Fadw0jO}GQ|k{uX^$yan- z)n2MUb}ZeE%yszby$6=YCa2;eRAW;AI+@ZR9kuv?8UVWp?%*7i*a@P%0R)I{0NkU` z4eQ$jQ~Js^>ugjsJC^ZFEI%;EU%i?3Wa6TeZLsUS1npPRsc7a6i_vL?u6;3|Hr?zX z^#Q1hU3_sJ5A#R#B0C@vxY&aS2J)GO)MwYc3b!S*4F-4-DvXw{=!8;k(pGW8cDp?6 z7FqP@{~D+@SnJD|BkUjM8)}Cb@z~w=#Cd7p#EOC(4AsEHA8ZpkfZcqQ%ks!t1^o^^ z;Gj8J)_L;~Q~=BV3~R%I^_q5FhT>D&X`Jkm<*bdMJD#)o5 z_S1%S0*gsNMMsAaytGyLx~#kTZ~yjhtFL&)D<*#AM}Fk0haZ0U6}o5aCN2BFOvm9yp^};sL$KnU4pJ3YQ5$YvvCg@8*6+rTcR9?a*nSB1yE$EmN?(_UoD3WR-5f6|#o1sYohA3vhuL@OAQuCYVeN{JEm z14DG<#DJN03mrY%Ra|3*I<$%&XWX3hBt0;(0WIl4V-Q9Lo{o{>JAVAHTG4>ZZ0ad0XUNc`RLhXMJm8dR9*Y>|N2eI;xwZ^yyWm#Xz_ox^WHP{GK*aDi|j5iLZy-`x=OV0u~+-y3<@q!`dcte2aB|}P$SNgagkY<09XMSUDxm> zn_(7=-3Pr|BvuhdnE(h+=D@)ib`=8D_MNu@=uUUzs+=th(JfjM*n*xm;oE-rVl3Np z+|dbKV}Sv|vc$-nPNEy&C#LP!I;O?I&EQ+fhws?NPEHB}emnaN@Pq+aVaq<-3CRZ? zyE^{!g}+TbEjIqW-}}8>*1blnx~~)Mb%MN16NvCn=~B;1N24lsFfY4R;Br~vK|Sk# z^Cv&~$$$U&$3K3bgnP5XrVi`2GS&qfe>1EAP`StT4d<_1d+oKKQ~LAjG!LjFJgJoc z>5l2ifEi5!=6NzeFC3cT8kIU24ed_hMlN}rcm@Lajg8y^!^Y^y=ETh0+WyO~Idkah z8;rP@XJP*z*Bw8$XME>vrm-@H-gbOSByLhm|kr#-z?O)be%O z{v+0+ck{+fdP}zAfkUYIq|3oLc|k)^A!MHfM$xUx2~Am-oAy!vAJLM%p55Ows!IUP z$c@~22Ce#yjI8P%8N$&?0Bw;7_+I-j`%$JUwyh|)WqW=$?4*|g4XUvfLpRTK$RP$+ z;xT&LAInD!oik?!(HhHkJhb>fWMIytZg4_fL(-h*!X5&jssg$~x~jIvG64v!pc2Ysx&)w=1dUk206R?A2-wDjC|k|IALtn(;e7I-1sx1%1Y{B~@{mYWc$O`( zs=rLD0k6}t{~P7cwK{vBqHIcsoJ33KMlVB)m-3Y9 zgjNo2k-g8n_{A^2Q?k#i=lxx{Zv4EP0CWpb=e68(|HnS|vH$a>FMVl4*L$weAih@v z_f*c{YSA6jI_n?TD!^WK7VZOJHDQz21rwtzdK@Q|9Mp++#NSDPjz?ezAnhF?X!LV- zG`*QjXXRUSmtJvhVs3s#gTEfxTN>BLeI~W>KL4pzZG6dWk6!T`*D-OI9Wi#s;jZ^M zvK97q>0xgF;_RWz&P~kjTje;*O^F%2(?l$Poj0G@w4LJfksXRv)mI!KDxZexRL*WI zQx{KmsH(2~j%5I&^0Ah$+@R?jXk<&K-(Cp8uQAb8zU!N1x3lj$E4~b}pZKNxnJ;BY zoq~~xmOqtFu&cb~!q23e){4aof1}Ux$AI131jri!E!*{D+q__esrv|;dkGjdLcUWE z&_pWd0b$Gj*Z{sO#2>O9y7zCl9qK_t2YX!|9eV;Id6BkG+G4=6oq`7stQwOv!LgD> zFBsJyx@0R^`~)CuV6(%E!4{fz(Z`P}#EJj_3c(|RJQE3M1Y!nmW5J^yd>ke%nGG%T zZ`^m^eKR^{U-ICC557Xj@we!N?k4dLpliI!{?H`yte^;ERmc7Z^~Bj{4jnr5Pr9M- zp`l98Gsg3F0zl(9xKTx0)}w)U>$}eTf8|$x<>k6TWLC7RB{!F{p(J^Cb|PfN4>-|Kf65_Ut9P>K^rp8B=wxSnVq<3ip>>^^ zFUu3&b!EGG z2|h6OY$Z;*9&)8mqn3@XU_^5gvmh zfdQF;Q9lRAfL{0koONo9^a(Nd{eXmy zj`^fj&MiIO$0LE`Z+g?4F3}zTFV{-IYjg~Mxkv}|Qi$#Jw|^QIW{amRH<>@kUH|WW z?|W~4!yDdkZy0aaC#2_Pc-~F`wyW(|zxvhpYWq9A`thvZ8u8)itW1rc(q5=C{tPJS0!CD=dXu6Mob2I;?3s{yZ(&OugypG?39 z9qW(sg+JY2_Nmvu{`E2VKN+kGRp*;>0-#RA*O>n0qaXd~o=<$@6E|uAKP=jeI+A<8 z<3a5bJUSjhonS;AX+|AsR2^+u+nTN|tuhgijCZcyGF)fEsrdsNQ+qFporeSC#_H;*KI)^d2p*f!=YD6GP92|JT{yGJaZLIk+!qpWM=K7eD1LEy>T0PzgNzij!c$f(yj7W@*tWHc$o}8GT zKQ%Hry{gw@N~D=fWStr|;w(qw`|$dXcEC0mRct!6z{_N8XY!hU=x!!4-x2&;dxN^Af0-JPCm;Qy4C>% zeDSt)d?z0Lp6~gd1L9w;Gyj`(-T$phUyd9T2?zAk2a_Tet+YP``6bb<}G}#!Z=4 zqj%b|C8JsAggV-Ob&6442Rfx!KrU!@NH0N+zwNL(&;zp#P}4zey9j3gG@Z^_cuLf| z8noE~S3?zd;HA3xZ;qS)!fwYtG}_dEu{PSPzBjO6T}Xw+~z*7R}^!(_^v*B9dlL9)f4)CqdS>iEt;qj&4`1-y6%{;1}Nl!Z2Kt|FD5&|tX@ z!g=|C8&P&8I&H7&7Y4S$K#+}4;z+PEwV})S8(O8(#;d8D&rw?}bb96IQ`I7k&mGXc zDwjX9v2gOh(%F-1BQb7^)BHkd&>ujYB7|>x0$_G_?jhat@{O^X{Y$d13)0QkFwvz> zsm}~0p?n#r;7KO(?gvRD3JgWTCkD?O_?1rKar`1MDEc^t9P$|~8$MO^;x9CGDuqa* zSo4&%PNBoE=%HsUV*G>evv+80GSivj_iDR(u%}LPj~wcM4=Ui_JW4pmdOr0qVEOFb4fs9P1l50 zxG9iMX&v?9z}=>kS+p;fZevtC3~6CNP}I0u^AXH^$ke>hZTM2;o!NWhL)l8#X3*-9e&!j%`GqZU5_#E&2*UG?*?irY3#Z&hftWEDburPP<@VW7+ zSv?BlqbXjL5YA&;2Wgqr6l7$*ImpWk$ofZEe{v&8k!|uVndZR6aVF8bF?c{(*Hsbu zMn@#r$O&74R0*jNdD5<9;zqGyrGj;b#fX`QeyADK7(=l8bgg$De$+PY$FMkLWyAbF z`w+qh^<};Bk-MPA^e!A<8jsS^ToQ6S#wY=x>EcRG6#klabYC#Jmv`M+N0WtKmj?qV z(BluY%Cy?4v|m2)vNblle`#iV-}1)EhYp@S{`l$TwY5vbTU3VzfOSSH&yboP8#}dk z|G{reUiOkl#wNz}R-1KpOtcFK^_VoHnpXzBWRwBa@~LRL^%)FHns%t#Dpb(tm;+sL zk%yl0=v&tQ6wF|Vk1WA4`Wfs~5TGZ|Iz7Qk317&9M;V-Ez!t4wxqPBCnA=w9z(b#b z+d87f!~oy4>Kc#y*-x#^>JYXus_((fzVVH3yi_l5yGdvN@6^3t*MP&sAwyHxs_o3E z;*h~_{Lu0JUcE=)e`^)_GuobaANi@uwQcg7Vgf*86Wkx27l}tT?z{TxtM}_>kpJZQ zel_kj>R{8^(4{j=&YeWb2|d`R)?^@7Jg5lDn)c%|0siX~#bdh6Frf*=q&D4Susp6=26rO$ z+-r`nSu*%9KiD$aZfE$ zeRYflIBw5U(4?D>jDqzC#<-eo>o&98K;25d0dMrJ(~a$8adA7J(~oj+PT!3g{xoO( z6B~MpWMcXBiT$f*kI${2JF$0Td2xDcbA8Np=rYk5r3S)d=K|K)5tmk$PBS2f$(~HD z!h831KZ`!Xv!pZnGZT9cot`>y>FJ3%osDZbeuOh}g)Df~Ev^uB61S=A_M7UrNB3QH z{L7ZFk&Zyq}2wHc%EQZINps0Y3W#7ZaVfu4UIUQ-Xr!?wae zyD+Sqag7~{<_AbAdgw)2!AD7KnZgck^|8Iv1;ZW9G5(US{jO;#7Z{a}eahL5c2t&0Ssv%0 zmSIfyGw4Zzjp@A?Ep2MqmA4FP5-_oH?v%chJ+`Uk|3%(4z-}Ht>0!HNUppr{=Z-zL zcj?4q`*g3tzBLURJb9oqGoL|XvG|ncpN0s?@P{Sqb=|YDpr;~EYSrQ-uP%=FB#1Am z+IC61zHp=}llgG~l}yQ34tHq-^QdNh1wWw%$_l$O)mTdXt~^ZB8o}QGFrSM&M)0W$ zja}Y)r%B@a;@RnQ#~wbsc>J-;md_l&TsMziq*<<>qu$J8hWmSgte|#GGTaUfLJO9B z)95g|s>$1l$@$X{%^X;KaPP?IeIrwI%i~{#@gz|x-2wX?go;JfbzktpVO=BICz(ss>Eia#ly8*s z03`Y75yB`tE1+~db-*!QPMBdOK(ozFy&Ce|+}zv>>8H^7Y#%cvxC{`gwA|>4lZKbH z)&W9lEm`sv4xq}jV`^t>uHOT;#SMQG({t+lx)W9_1Kd}@kOMVBp1M8H#>NKBs6T{2$PG6nmncLL z3Va|z86-#~!UrT!_&^jXlRye0DESZuA)?&mk`M@C2m}ZQW9%^4#`Dx}_uOY5@9$Z= zo;tPndEYa1+t}`Y>zw`8u2pM2YgO%a(#BO)uubF|$QaH{ z?QH+_!h&WVx))|=_u?e~{M~F?p$h$jM3Ykyl0j_xPd5_fL(T z+&eoxv5keI!+M7_Zo8N3Skv`wCDx=FU%A7y&G5{^;sDc5{fqOn1FU4-xWIaqAqI9@ zl&Umyy`$JTKO-$9OP6P3|Hw@5t}RE0x_FImey+Q(ulM-E^u*}m-0UD3DphDvw(!bd zH?Ix$4xSib+JA8Gr4RP(xZnhju~5{P% zP9dX+NP_4(moGvJXT6DT7-MAFIH_WdQQ4mCGhQfxIr+w`$(U%F#2$EV=hUg|TzYZQ zL5rUwW&+e%mpI~)6OYct=X3Mn2d#_~4>L21Oz|&%@Pi+md()fVH28;q_=gws1=kla z_5YGI?LSyx=roie8<|?f*`^$Yyxwkla`WcR-=!`8#wS1d$vav7f6Owa-KL!l{#i8u zSmA=`VbFu0`qZap-}08X>|%5`z?Hw5<2;oOk2qJ5Ulv87kC_0bjQTieT>1_(p3uhf@`z zAI;CxLbZN0aG=U>oMPVr?iM$X9eQl*iEzHRd+)YNi=@ z^i7?b-O3vd{qqb$@cTx)E`D-|EsRO51^}t?4-l)(zVfTct4z;%mKqkMb6hf~ZMe7w zYTSY^(b~!w(|Y00vW{!|)+4&*IJFLu%X1Zo2y5zJ_!CEt4WBsp(0LO_9=~Yv_|g4b z%PsIk!CCRXszjBRGj>&3Wog*J-1NjguIb49+}r@|wC>)2(m%Rmj82) z9#D?wHuNmaEp~6-dTOBm+8;Bzxp#wR2bcw82qp{DNP)V>%*SF^@BD^7KC?Z*R@aL& zUhJZZ7`*zetWpr+rE(GsBAG59mpifuz+ZNpy2DkTrw%mZi7r|DmM#3yqjIEcYJxL^ImCqD5# z1^`d2F8%!HI4cJLDlBrY5Dr6noKfBXuoj?~qn~3FG(FE(0n=?+i0KFCx*oowMT959 z^6B_{S%}ibOn_bsoM9$lT#p1OxRj+8n@d5J&J`uwTt@o5upvl<9VH)=GE9x$;A_RW zBnXE7q)X5I)f|u(6lE5l&}Mcoa5uGa`qZ(3@xxDSnL2fBGtd3|W5+>t{LaFZcT0rQ zyr<>7vPu1;?9?^V^_iX;o;-PswD4i4&D%~4Y~3}+lRokKu<}aYi4+e9a%wfz$P!N$ z1bE6mmlfq#9OO~`0@N|BNy;nP$m4Y0Bq! zq8LK*BF~oT$#Gqag_)6&Lvz#92fGJ*VpFaVa7H?FZ6Mc9uLW-0v}1x1?fgPFU-{;Z z1~M&jM%P!_(Zx)WW*9ckPImJwt6Piyly?POq|M=UJqW7Mg{jRvjcX=;Upx5<%gN_x z%2biT(fY?2O@zdr5z@sEFe_UC{8=ZF62kN)TYGXdAq`QO4!tiJB24c~HpOPz3W%`%$l z;+IYa50X31qQARn!@olKHo|$)pLhbOy2f#SHvOEH1AulHhzqN$c?SyuPrUu@Z{NgL zk@{A^WnB1C7l?MUt>`Koj841sb^x7ZHv@vBJZ?Bbfz^j2q6c&VY9*g&E|e>8e~);8Zp$ z+hiBhHrS;#ACingfK)W`lX6|l+3wk~W1G01=gm${?xcxiSE-ieEt&evdor$?dm>$P zGh1gTPR-4nI(F~$_^E-u9u}_ZN|Va=dC2S*uMaLxkM%~!&b4F^NG@avRPaw?Bc*Xo z(O6v*ftxk*DW$kPj|(V1T(e`9Y+zJnr@E^bO^5Dm)xlX-0GyZD!6)1TTWmp3DF_*3 z7(19+*y9@$*<+c6hiJAnFcWXgP>5GDDIGao$mRkpo^-TKgA_Qu(j|QBL@wJSn&YL9 zHg%Eb{ELq~@`$!%AK_y^ujF_wo%LnJ_e*C=L-=d?ksZ>{p=th~Y}>Z&8?5&K4;KGD zNVsPITJWB)JZJR)pjj|dc!3W3K30%^i&5oPMv%PiG6v2Jin3W>|N?ux!WG#y)jxiI{&3ctd@7ieFpqWPihFjuhPfhgbtAPU^Dt;GH*3Z z_IB}@COS`boJ;jQ(&Ti~;%%JcPLQ`CdKPA%w-YSsWIW!=(suk0xlDi4&u(y4Ngvbq(Y)>=dtu0h81_&D$Nb+Vg>x^gQ1r-K^ta0bJcKU90L^b}4@}h$Fu?a|@jA{Bwu& zv%Qu}1CNv^iyM0|h4gRckS5 z(&a-eab1e*69P31WRi={FUg0fe&nP>hvY1)aB{AD!D^Z#tvksDkI$3d0D@NYt{f z;Rw@G8yQp_=TnqNJrh8DE_j8U3u{4I^%SU;0Et#P%&qb+?uhiEr?@le ziG^@l&^X3|M&4$iQ|zOo)ptQ@n6x2D&nzA6bkE@M#K7k5CkD6gInM5jlf8ZY>WNvi zHq8u>u6xzkg+6|ozOI+@w#eV|x~TJK^Cq5kV=9A?uDOYc{_#VPZsR)-TUmTLLT9Kq zEm(az&!cf>DcHBZtGACWn+M1HMn+Gtk()s>D(BJUL~MT54$8| zz0xOs>s4H<83^d*9e?N&hFoEz?FnD@fU9%4pe4PL2FWR$;(|wZh%TDrEF&!1=U4;4 zcU=~~_O-9gu(kUx+SXU|-2YXyuUEq}l5~b`YyFXo^l;OrJzO5Ao&MTy{Kjv5hUfnG zt`*~K;yY&t0PlIvdrom7Z~xGTK6D|gNH1bNfTry)pip`-iEE@QyTjqD(5HeBcOJ;< z<3XAU&>%uz4xA!>kv9YM5rHW5EecLMdW}^T#jX_KJXgw+p7={rRI~!ejZ2LO9Zr+g z$rml?l1C-3YH$}=B)vdAqDCzlsA!znmJuW7XY#Y8I-RNW)*Z9%mMinB>qnX}RSO5_ zy5?ucd)WU#tKf&GP8{CM=15!lkkTfeg%2@+U;wb7O_g{dBK8|#0MIwpGch(!M?5$; zHP%17dD}@=r;qEK3Dp!m-;pOLka41YQuB2Yl($v>MpXR7BNiH~`I+(F%C6%>OwW(9 zVbe~gz_;m67`p~pq2I>~S9(uFcmHz?PNus1`mt-`*!=WFKhye02Y9880m?*oA0M;Q z;{$A}W)0~0uu+2oz74@!6Zthi+x)EhSjp8{x}3Upq_szDO}L(Fzf=j7h0Q!H?XL1O zbvTkyUWY6{RT+TT8pGF0{IzS;1|##CA79Y=33=-iT|9~umX4B7ak#d&TfgLS!JKGu z?jObJATFod{P@v%CtlkV{FX2Dm}FbUpE1Rk^kjL#rZY@x~i>(XL+0ivL@g0l0UC@PFvIr~mhV|Mxi0mGt4D?HVPD$NXz85b(#sz%&!E zfkDLyc9S~Be$rDEV6C`~!GiJDiVvSFSGG zBt^6;loM3czh+I$EI;#;$`aYAG(UIOmS`u z3lh$S zY1&_R{&fB?VcP$C;zr@AwWGpW%}KY+;&HF=Pwd{k`^z`obkqO)JHPWgcd@8&HSx1H z{+t*9=;F(za#_2W7hG_`V-Sw9Sg%j>SPb@o;rDSH|rUAuq?Nf zl%+E|AVo5(z!UX8pf=32Q}`_VC~A6|ThtA`{X=|8R#W%l)FMKdmabm~9p;3R2i{e35Hu}+^2qS`Q;+T%J96+mKHzlW;_NhUt^n1_uDDeuZh`HeH_Z33l}>QZ&P;Eg zn_ti_n7utc%vuZ#Pj&YWR3Edd%A=Ad8*En?^<4PDup--SQ8Km4FK0#0LvzVbdFpi8 z4;I%E=egJm8P}QMb)5ZFZ^R!mgqL;378Fm?QQ}8iAR9P>Uhv1M$W7alUd1={28=q< zQpS3PWjtusXM4iFLau2_nHM=NCAI}b(;;1Q$*!y zwkG+k3!f7MfHhpT3Em3$HXZkdd+)vXwTw1@fr_*e_ ze5Udkn@mi?!OdGtnN!A=DoU#YSI}IhYc{By!&B8XVhVooWqJf;RH0AtlDAW!A#btp z&6oU;mG}}ugX6gtR9?|Bt3@CiSlG|=e%5Vh%VWNdI6QXn!ChldJ$~NInDgIjl=?B%n}T12QUM!mDF=_|){LE{xaEv#gJg`u&75A7a1 z^oTa(*~2vbaMhw!zYY>sNy>??bQEk`v8N@(Pza$~ewj>J?pl z){DH_w7}820_#=0uzg5|HZ`8@E3TBGQzT^qZO@RcUkFtCWRf73R;cVA6(#PzNAJ*axD z66o1IcY2r7sXmPCx0Dh+K58qH)JuvnL{xF2zeeBwGBWsK6Iy zDeJK96qY(!9lCL1#xo-dCw0I%f5flBfanYwbdw}K8(;I9*XXnDBecQS@JROOXop`w zcv#Q;g~MTcm&!xdRM`l2j!QBOdKV_yqvdW^`~L@D5B%3Z|MNdTz9beGJA#F18GY8C z$8^eBo4WNU?BuIo{p#;sdg-N~>x z-1!epojk@q`cE>bI6kBm`dl=@EE#0O>OOt5UTN!IoYBDK&?Dzfo;bRXwFdEu>Y3y& zplDj?Wrkzd1*Bg1g zad48?8?~o{UP;k!iq3{R0q#&$=Eaxk3g8s)BRVM2BBt(3 z35hNr9yy(w*E%DvpesHwg>8H~Mau=h=}o-}r^YM21)o^L*&xS>C|=QVA(QlGduZRH zV}>3B1^JTGOn__>gk($?O>uHc7aQ;_=<(=Z{ncO1vG4u{9?4$JjnW(WxX&9{sIPCf zXrs2%nvn}7m7e2j&(*HK_O-A5E~HxLZ@zQUUmB*JL#bE6Yv(8+_YrsO-S2+)*bjgB z!wVRhYU-(1g*dtP!l@B5zAB9zGXQ<8FW5?f?xV2JXY4Q0Xy-mpTNv~VcJ&R#1_#>5fOQMgTvI(K<-myp>+lg`ISUU($7+bd{a_vKa{5<2(`` z*HK#s%a$%y%%@Tp!5GFrv0ykhmVm}?QUV;(gl<9x~s*de3|3U|EC8I9QgnK z;xGQ_T zRwbtvhm76;&`iJ}uN-b;K+w&ngio+0K%bt}_X8+@QPG=NL>VeqTA7jUkX#V>Db9nI zWE~$3ibNB?u^kq<}B`Yfk~#~IYwCg#x9MsGkopvWItON5A&=&UZbNaC4CruCYGl3awS2b zQJ$OY=dr?O-ViuBv}Fft0Y;`H6Bqp|VorZNo=_b2^k~*VuOI3aKiQ?+Bw>*@>n_}`Kg)t1s*x@Y9ahprW)gP^sm{_ zlCe^&A_-NOW|nMaBy|ECPx4r09DjDh+*DQGszT}V8#s_^bwXuWPINhkMG8Vhg-i-o zyk)&g^&n#;+0d)bih3TFsPjqq5m%X4!Il{2Q4Hr{hwYP$;!T$>#py7<;>4r4bY#7W zH!u@U$ciqP+!fZX9>aDZRPFCq4!yqDx0yo1l3*`NfZZ^rH*h z^$)%Dr7yjlO@D6Yco8>B7lSiwT}j5qEi3;v9R7%tCmGt-r)Xopy>H*Xuibp}&9`ID zld{RqwkVuL9d*w5=kx$zrK|j#zxkW@6aSCACUW?phaTF&ARt~3TuEl7I2AT3P_JeJ zDEI^7r4r0)@e75|l{i-r(ZrJqw?+pFMnTniDzHJ+d7@b+cng`#rwG&Si)MZHi?~X0 z#bbLU0-egv)N$YN=BfUX(NoB<|NbOjT8j=&JkO%TysjRmwb>A7aP!H&q0QqA0%o-M zk5%z~+?fxsU~hyw|NdHw;?&lNYfVNatY3+9XWGr(_NJ*5M>h8j4)Yni&HA>i9zB$R zAymx{Fe@=N-ZvGWQl1=vlljyN4ZPE`C={vpl#5>>ZCsq2n;l_>VMp)a&}9D*chk&_ z=n+Zp(55j4N{1Kb7Y6u{(kO$u=SUl|QIDIBcMl95>>b>EjO#h6K@0CP_7-I|m+eR| zKZapGo!*f1erRyh>{$gP|)KCLgG^}oOpbiaDvc|4lhyF zAOKx?dfgqZ!E8_B%}N{}AYj=Z`^F|5*w!aG>5$W%yN(F(BN+`2ly;?8vWn9nz%p7B zP+}%~yV!_l;JowB+s%#Ei+N1?%XI$x;p^iFcww*C30pG@?Cf{XfddCV^Vfg<*I#3x z@zi>8&ISJGNacQZvf71A+Fj5JnpW&TNC6t*?SRj-nx7l^sq3L_P5e~}tz@H=B5PXs z1cMHCgymB(dl&!=@-d68(#f{LrzofsdL#fp%d}%LjXQjo{#;R|dr3{z7>Fh(JnK}r z;7ielQ!wJ|gn+1HRGf7^i5Ao7(lf?j*PeX?Sg}7ihn(bdmvts~p)MsM6-d5&Ge6I6dK1HJ z|66T*C3`sf*wt`k+ldD-ae+4vF2as&+}DypsSGEeXWG*hln#wu)a|g|9{dg8P#^PSIPQ8`UEM_sa*rr!obc)==pTn<~0h~`Ot@Wl_3 zj^i{)=COW-iEudyav_uB)X6H6IO{9%LQXh|r_`IVC7a^Ix8BrA2e#!Mrw(8CXb>Vk zDa9?jkHKJPilPt=PuX*kji#0vT}Dn>Vk@Maw*{(`_ zZNIWj0~0#`yXpKtb@$zO|M#aq{pm;7CVg&lbp`XP~hN-lFNE`?nQ9cP;&t>#IQH4JF&WR;#pR*%nj_x8^7ZuxO7tmDpm zf^WDF(3z>Cmv0A1XUJ4~B0H+n-0r4e)2k$x5?02WN>WKL>k|5>dEP!YxMj!D;T`*q z^C@6h0rSQP>O1H5b7J69oWVWhErn)=ULOiYpY|-mTac8 z9h8hMZ78gI;Rdl0T*`omh@?ik$%!0?jDzVD zab_eIH_VJPI}-0!N;b-8^cQ|WH0@KoG3BfCFL^=;7SR;1ql{1ZInMeLPlC@`6|%%REdg(x zl2M%X$X9hQ&cEz(4vnBqy{mU_gu+~ zf^X#95F`TPRf8bkG@q2=0;`EpvS*M|Htxh|Q-`+h8q-3z*tdRSOkdz*FWV{YG{f6v zG*U%FAM#6eSZOjg21maTEJ1Y?7>r>+YxXXQw;XB}~W`EfnL+VXQUm0ZHQs9C>)`p}TR{>OQ(HGH~_3cc7Cdd2y5sd7ll-(zKn5wl)B29Toq=~ zkQRT%w{#6)3}iM^n&HDr<9!2zr?{3UdPlaL>KPiH+&DX~fl+8Bk6_OoUNr1UQDs%) z6Tk9SaT1Umv~VSc;>|~-dF1ylYGsu|E02 zpv|12Qy!$<+|5AX8Zcj@*;M@P(kZMnak7yu*Y9M*wNGN-cX;LRA@FkNePqSL+%z8$KJiN9(M957h4b4wKi z9P`Q7=Y$6s32U3n==7Nm+sGhbno+U7e~qf>;9y;HsEA6oM9F7OdM%txs)^SE6--Sg zA?Jp(p_*Xal`OKw>}>Dw=nVVNPtHzG@QGj@lRcW&CR=IQQ^NpYmCZ}xXrt68kR$wO z{c)nC>R%0RinE{N!SqV@-oar80VC7uNcB12YJj3th&vi+7BBL-+@3zY^44r50un}4 ztlMQ-lB-0rVNEw54eFhZod@HR1xxjlG7=lqx`%bF%3oj#McYTmBbCB}j9t*ydb&)O zGCSMd+cOnk2oy@vFJF1fYj)FpqdO=1=4MXt%HZ+YiLpU#PUJ@h*vze8Wp~%djyMJ;w<{BKE~+ z9{D?c8dYuQB3t8GVZK|fX zoVvNO*#_2LW;w58A@ohm2)qFL9^Ls1zi>`RB)UmQXN|6b19e5u{C~>L*;gKT;DK*` z`O9C{m;LfCf3jV!AsV!E{iibkSYHX4`|fwY`zT+J`e)V!JjST@|6v;I=PB4{oR179 z2H5s;Cl#Y#>jJiH*>Zy8ByR~Y9++caS?y4lohwNuq?4ehiW#KxTm&jZuB?`6@Q5WU zi+uCQH@)CDL-H0;V9!E^Fa(y!P zA4r{B!ne}OCvi#&9p5Z77ZYsEGf7jY)pt*;b&=y-5jIAeVy0va+xUusCP;Mcsw@rr z2ro=e#OIHDH6R)3p5sl1aUP=pp-v~bB!S`C#FVB2Cv|QWPbf${m3)#UVo4^F%r(?* zip=WFZ=9RzTGVQPJ@c2V3Syi^cqxklgnW0YvM&3%TrU-ys`C|U11o}+s^D?C%k+dH zOvhQju|l7)OWvd>Y%J-rTfFh39N`d+_C@%$nE-W~>YOc;aB6lKTbPMY&^d1szT>Pn z?)ZhB@Pn?7Ryu8u;wmW0Y;~@1&9Q&~+$TTz$;mgq@r_$)CoiXsyNN-;t+a2~fESCY z8=ZemzFj~zIBnp}>Q%oBFTC)xmt1nm_kR52A3ua#?)=+fbm&zMoN>o>wq~R&j0;*3 z9{a!tKJY`*J^qe&ykjQ?dOHRCQuwyO6Yu=sR}EFF%SkVaz?;irN*=+UeU#7-bzoqusRyy)5*$qp1aGpnvj)gdd{u<)#CxCmdEL6 zr!f}h`M7onRWib>oH0^xxd&q|bEc)FfTyj2yEyslG@(zVeMtjez#P|k_R17ID4`F`Hm*`nmQI-$EC0$u(!ceq$Eo(p0 zU>xHsoLuCU!sdaVBdt5hNu<;pVf{$2v4aSnI(*T5(Eh~0z`9$=gkJISSaX59`~{}u z`+ooTe}4-r{4e4aznh`oOnY`cckJ6ZeCIE@s==#liHj;bl5=`8J*8J~O&#OT|6X1t z{OU(O@{zB?|1gL7^YvF6I<9pNbOr#e^JO)vTJk4e{_>Z9o=;Xj$+Xiiargdu3V(C+ ziq&wI#Zy6g^*DgL{$57PeN3I5*uH&x{-iMROs6kv+;X9B0=i*v#U-B88hZo^%vxl^ zGfzudVb=7*6_qX;rs(u&NyMXySV2V;p{SaverB_(aH6Vl2%&^gg$1T;5ClK8SQV5N zkV;O&#R<&e)3B*kTkId+G_^3ZwX3IpV1iZVvzY7wfaTWg+fWNs?M>Xd&9KSNvEgmI zk9GI6YaQ9*ei2?97{0FwGZQn+N}QY+96m+IJ2jVYX3TCar{N1CjNLfTUHwVk-gt`F z{>CC7tGyc(8;VkS;9QqngDEIg!b-)WRhLqnWlZB-BY?N+aAyHWxp~-`sCBrM0(VzJ5E5d&knZ0 z5RGU2;#;`qo_l6^dusNb?|kR^Y=8bD9s}ISP15z??uUPi@K47{2l6pE!5?Sm!2i7L zvdcclW7*q3_OXv?lb_a^emcs|5t+^aV3iB)!mffR=P;*}Z++`q@4`RKW@C9*w&jmmD`AXKC{H67nF_7iJPTc|O=Z2+ojpu)@wBgF+BFm>a?toUSN z^yw9R$qQHJAy!efunj8wu(f7;l}C$A&Cm5~1EZl$r}_qlPRvYA@ExF8y%R4?p;!J= zx~p(RRvhV6tr8~Zkjz}7sSG&ZmoSYTzEmcC z88e|o{E}FJMLIHON~gl&OE|7ag0ZfAp7e>wan_qVOks(yaOMq?F$iSY#BVz?pH7-_ z3UlPnSmDCvoRwX!IxSAo!I(`?Ej$B0RNCe#94o z%OHc?`6+V1(`p5&bGptPIQ+WTz3$7`UVH6F^}z`W-w9P5m1m8bPuGE=*95g{b}O&W z?0fXlNB3|(lyJRDJW4t`!*?B$?{oCKB84g9E#gEoM#TFkVJI#Rsc0u_j8?dglbK__Df_>!N>D`@3p-kr< ziVX;RrUo}}eRO#HzQ_7TwoXLK;{ya?LScub>S@z+Zat6hqjTo9w+Fy^n8zv8!p-fO z5kh?RAGM&}sTu7X8hU(q`|f)Nx9@q1#{l!ZYf=H|;w-s*tvg*DL$xALd zrK5%~`4U6%Ap~9WiW5z3NK-api$~77g3lO^C}qWK`*coR*e+lEy5m>8bfz@bY%Z{E zd+>5&qJ@5QU;5IQ=KlGg|GA6l|4aC+`kQF8-b@?zBJj^gR&P0FIb+FR&80l>V#H(2 zh<=`}+CR!CeZPk6(beQT@$GYd{w!JEj6GD}WZVMmollBR43*Z*r_^yJiZwrQFavvUO_YyvrWv`ftRpEz=WoY#*)X;2PWs zrmbDFwX!W~n)+7U^kRNEz4pWBZzkqgN3_~27{ zP`LWCj!Yv(Nns^Q231%7|DLqmJ*ZFC4OV8vzJcW zE$O zdFQ47_>ceiVpgKQk_zyD=(GBi zSH?GQJ3nJ^5e0cBV$)mfbC&sq(C7(W0Qc0#? zx`#Nce(P~sg1|z*F*d9@#CElhZ{By{(ZOwdPw4fvE*3;;e1Jm9Td?U@amik>@&-fK z#8Z!MIr-Rq7fc*~>intkQ+pYpjK*vLFt#U*YW%qHND0p)W_ZkTkjD{^ZrXjp{UiG> zew^|9rNw^Xnl|Ndx~@6g;8(CxRpo2&sUWn-|BR6^<2oe1z)0A}41YEK z(v@s*`N?_`UJfU_jBk1lqbr}sNtF)MqWqK?$@WNxIyuR!bF|HsX-l2GG23B?j*D~% zqreYaO-mhPPH({%HlinFp=aA=pRgULwn=iL3op^b*H6NXG$~FrId~U%>^aQ>zl8@L zV4`aC=AE=jS2Ig_3#>iIppAL6>;ukqyEq^_KBs#%2C0*pgP- z6EYAYKNSc&xnpPH-NL3l2M%+$KHc@$PiN*2J<>BbH91O)$Sqi2eI5z|B+h&(Nsh3X zre{6Dq0M_PdSGPd`A-gR-Fc#i{Rp(Zt`^ZH*R{Agbe4@yC?CY2p!GVX^ARVaG*;0ytw-p)8YU0!)`LJY(tHuEY>M z#bv#vOp1>s5ZS&1#^L2H!=bYD*Ci80Kc0@4Fj49 z;B_0#3}}jsne92YcdZ(Sh8|UPNV(ytsW0fRh>8z>`H9&LNyH_Zz04ylTn;A&W0i3! zsx9v_3}ZF?60;_wG-oBrE;kfanw1|h2$&h%xbY&L4bd)M9~>BErT*gF6J3jQ^HV2}JgHCl&dtsaW0!X3!#2LXPz_XceHPHg zn*_3}XPiOAslK6+ql4Sed$NDWzN5V?d}Oe~m?S^@SI;9|)?J>Pmd#e)Dc_RwiT#?a zdBxAUd76I6D1HUph!dVMZ9r*<;&8?{ufy3-d}TUH625t({39Q}?Bxif@D(%^^W5;gVwga?7S25jxt$f<09ct%T+=d`P*`uVIz4 zO7jYQvPBLS@`x$%=~KrB$B#a_Wm?@?E^3?Q@uLT~O`bTqmEHM9nW^9{fjJgf z>AGV(Z;W*J^-ZwJ&&h$2Ek`%)*z?o?ulk{!X^6^(rX4At+Uc#)&AXm7B;H7WBh3od z@K@k%$F~f_m@RB=g&}!4+n0He4>~sangx&PicACgkdZ#>rOur_;$I0P$GOvOVh9Kq ze8N_|!wEZMq==f0;uRg2F@&RVX}f5)U36Rw2IQMhx;bCq)xH@zhJyD?|p{N*Y0R77MUGUlIytjVC@K(AL81{AWTyKiu=YjD#n?=UWQ_YY6aO`JMDKRprK^HLson9I&REE4VN9hm0zK79>w zY+&o|lbp}6g>Kj4?2J}>(SuZvB%H^xMduB>TG?Z}Gp{bXaU_5%ZI7^VttYsa_-Zod zZSXWPLw^Xapx^ouW=jn5;Pm782$yN%JjW&etlx3a<#PTMcp+=P08eG1pt(NPFdQF5 z1PPbVHHi|n>HLg#-u9sgzA z*j&e*`n9w_2e`QzkbSgy(l6c7rYV4Pn-+m0J?5c^YkQN8y7Si?PET;>eBC5RRia?7zG=57z*#}NUx8$+yr7!ywW^tfy#jt>m zTo_?)!qRo*U@)V{6ugtjBY_RFF^L7f|hJjJ_$&)73~tASQ4AcQpg1&@~!+3 zAkMm4@kqDmEqI%l1zW~!@@J zx82sm0N{L{^S_3zeP0gWMX+m2U+tgK%0=RdhzvA?bm$zrMb|mw)@mOv1``K~{vW;= z_~lQ1>Qn#9Lg)L$+jI#+7|p0ocpW*=nE_ZwX0>B=A#|Y>pJ_U0dj9_3{oUXF2BX?p zcKPE`+2ll^P^0i3mbbKMB(^hoLHsfma7CHhi;b-1PI0b87JKkmVl&>}627buY z3}*nh4&}#Zz*{(|w`9cRAulKt{4tjN+z+YyE4UnvCQeNoX;T2?TpGwJw z*dM=_4qly%Y>ev`ZD|FjYpSh1RGmcKAUt#^=%vXg(NVzFl5!HdJju}X_l!lcs zjJpg&_|^ebts_siNk!IYJIvdV_jR(2X9lxgMPPsEQCeu9=2&Yq$1I~}8b@hMcCy#W z1>E&tPWy5Tcj}iTvPIAPldL?aHE8_gf)tS{LD-t<=!$j>b*xwEeVCh=@1yJMeAVwZ z{09tFY;!S8LQw;m=6W zqY{;sBt=G4fg2S^afznNtJ#2A)&?AB(D9^R7t}z2*@0Oqw+0%LiE9q8Rav+7M%a<~ z5w?!R97M&fhmLGhhu|s&ZTy7q#&AX6CYI7D1#(V@PJ^&!Kkn+0q4NSovUJ_y6E1+2 zttqqGV@o__V8xC#Sy;yexlbS5fUSDnT}mC6N=6s zFqrr}3k(1IAO7JVZinq4Y}K-{_m(5Et+*CHwlDw=d_&GAirjHD-dGvFx4agLLGFhjEe(|VRCVKq{A z4OwI6XrCm%j4#g>?XZ1|mSLTj4QZ3dyx~*H!*63_jkl@avPl6DW)F%3>-8nPUK#VR zDk~#pw{0(sUNc71K4G=MG2V)PA=~6@n-=Lx_BUl5wrto1ufr{Um_(Ob4L2AI{UIYc zoh0Y;&<#zPiYn>RIf|~1P-&sQM7+)uPVPXHzDzcjdF3aUaUCbR_~n__;1_NT07O^4 z6*K3VKZFYmn7(3ZZmRo5{n zxC#F43B%YC)DLdewyI*Qeo2pRSdK6=`T#d7Uq|nkKL7d8-%0G_=1cZF=z&EJcTUbM z2ije*GebScrB^AmdVO!(pZv+69C-NQhi_zk!2iWm+iMv8@)lZkIb3N|HnzJ)Zj98z z)N)*n02Ni6XH3xXpX5z}V@#v#8NpHw0PWH(rumVb9;dAgZ$=v)8fB3`shaP&U>xLU{ zxP&|ZTWPCw=YJW4gFVP-EAr}Lz0j9jB$nW+ZIyJ(DJ@`*(KdaNbxWVS=%R~$z-s@8 z^x-o_2NOTCzjT%_X`S=a&w+Lq?DP>klFM?yg}708wN3B=76-nby#juLigpDRVh6m# zs*vJMa;^a@T`TiQckoFT46Wdu&?5mY5ac+)<{g>|(BL3{SO{JZ1WFuXMOZk=7SZfl z@)Fski$CKe;U=DCvY+xQ!VTS-$5>7OOk|r_DJ*YQy-$~{^4t1~j5;Iz=^CyVBhp>U z%APWRZD-R@e5>k%FLdaqNOw~%cnV&3bXk^@ER*;muE1=^8*<`HyzXS94hmQF=U-aND^@&|F;ul?qoPapY&ADXmVsb#?rwIR{p{cu%vca~E!f!aT(1g!g>?>tDa( zo8SEAYoB=HiC>`dT|y=7)gXX#Wm;5L{FSbidBh)l(y2cngC4|Sm(G>Um0%FTg62q7ZFwaW|?Ka>@WCQVgZMp{S*m#Av+6ZU%Ssqq$AHG0C$dDjS=H{xZBa2h-UN6U+}sdiO;;*FZkB1UpAI@CJfb~(4jC#<}t5mxZFdFo;ul}%YX*&(}l4tZMH*x z(++puqSGG8hIwWnryhU&@dXz3ZN=sbxG}h%!N7}nGQ%4$(raJ)+Ix7jK%erR6tJCjNpHtJb2-p?3*ec{+l=f& z+@erV@Kvk(VSJ1ouC#i86EgvtroVvBe;f2(WYq&0i__{{bQAH*bCFfK2XjmI*^P@c#U4nO@^CW4Afd_k9N z;*YT6j8lLZ!!qV^xFv>g3R^OUX~c_`F`D)&+8B~iJ(r_xS)_xP&K_R3+rsmHZR&F# zi<2+s^}d^FgI)sGmLwAxl1uo?oLUAYy7+91NWmuzk!f#qBXX3Rn+Le_znxD1OMFKC zEAYjhB?U&DO0MIc`5frv@-v^uS%d3PtHMp(jvxHs2M0d>@sGdo?z``Pg%;dEyOIhM zGXWmG7Z@vDyRx!I1(Xr!)q)~D0+`fn00V#%%m&0Rf(!&^qyv1ls5-LUoYVpi3r|c1 zZ-i6&TE*IH<{Mi)O?;7_DcJ&BDpu69Lj0M?T4xg@=;TFodWyuEx9P7G7xK!} zgk|1!VXReFd{TguzoPAlRXkBvldR>95q2w}GUBq<;LS3LZrPUlg&{ti`NCI+$%*Nq zFCv1q8k{O#b`0-?Ha2-vxU?e}#VZ-bYoQ-LReWKN#dZtK zJZ@mc{U&AvuOfT{1AJUK=S`y9I z$C%+)TvbP6TcJ6wrcXf9k@Q5~=sdZIvoaG){fXC@A+LdOfnl+%Uj)S`+-$qC6i-|n zI>*&y6*hipn`ows#~AXVJ8aqPE8b3g4GhV}T|ab<0Q#xxeSBDFm^=Nw?C5thcm220 zCLEyNZ&9Z$`2y46Ia95x@SO*lNAj9!K;Jx%8y7pMf067wj3p?m)K5fmI57?}tD9;qxDT^wDeYzyJPQshoNqcQYOHs4IsWDBPMW zCcODNOLxN2UBL{q0TY@H&_Y30Wf;aeTvn+xpBr!*MbIMnkRzT$D&e)EY5XS=eVq;sB*e*ULF{pmFIe1Np< zqh24NUSA3Qat__~YlZ(Pbv|x1Qu|VATPg#&4RJ)_+jdk|Y{I~%BMdga!z|Fxz9}%vT-W=Ry@p3J!^C%Rx48DBblfDHi>M^DR4{;o!!XBrsn07+| zPi}Oq!&vfdb2CnIp)^%)%a~roRkdG)r3NQx=51m(`9kvaW!vg+p~t*UUnVqZ>kY39 zgFF#_FiV^yxh4#;_gcgC4ShkT8TT9df0vgi*VO zi7!^}i=9IY@U}hj$Rk&4%Aa%X=69t!eZ>{df!szEaiOXauJM5-dCgwx#^U=t!u+Ri z;8<*UH}vrUsOt+jrLE(B_Bqgb1n{%Z^R;R`$*BEqb`G3jw0@X918(BgoEI@-*QbRy zbLXxK9~FG9fGhBI@w(5Z;l{0Reg-=iLOC*#U<2H?LFhrg(i4T+jJu zsmDF6=pUgT?*aA_78&c?OXjW1lkG|$xJttbI{v$PxBq|k@8ADD zfPU~V|MD*n;78}bF5nLHGoAyTVb?RB#b>NQw+e&rd*A!6zVpsIe~q2FUPEPz=XI)d zRO~ZWPy&FdH2^aV0FJRj_@EXErnd!V;EOwn#Ge(b(NY}FwD8-};f?sjU$v}D2`S^G zN-$+7SJMGTFo+SiE?M)3WRfjtH9hUtGU#GH+vyK@Z) z6c(TLn>W!jzGa)34Zgq=ZyE$d{?kEAG2}{rD+~$BF8Mg~>YE@7JU$%Z8UJ4H_OIdt zKHA3j8t7ZW(M;mg=29NW_M_n6N4xQ#H{N*TXW#$+_x}hbn(nuKPn*sT(9@FxodLkp zlaEgu3Kb}@Qe`i3NB`z;{^kX|DR9%lg9oppLSM~@`!XuOR_v}vSZ;TXr$xH5YzuvB zm0cC19dBw}Q;4+5zaOJ=!;zf&?7I9@67MA%++=55ZdB9+PrJ>2A zL4cHt?n7Z*Go1=+G%`n95MS)$j=zt`c-xr-xRCSnIWA;YZ$HPS-1YBfP!aq0%N898 zQyFROW?LX0xmvvJR=Xn%bdAwo+|P}|o%{Cf`!2f(-u}*azVi-bPK9LpN%|rWN_yw~ z*~@`;7yH?>=p5I)S|uTV>zm*F=9_q?_HruW>!|oI;c;CW)-Y5~ER%c>JW73*3BTZL z%VS#$-m=4&oLr68j#qSC@av8{<%#TWiD5eRL=0J0X?55{=WjD^H4FnGH%I5b$kx5R zbo8UN30E;ws9pT7VlZ(5IHQSIp6Yj1F(VY$Q{hO6qAT*U-(~R{0H9X`fghmbtL*Cc zl}~))6W;*-$TDdNDLtJ5K&#AomS~+d0MAm!w^Qr7*{-q>uf4MG`sH8#<#|T>GfeXx z;9^I}&Yl+Z zGr?F!pOFk}C1rc~f*jNFdSWIjBDSFv;%CaSH(%VkP*g1WYO=)%9 zGT)f62Cl*!p|&Y&-ef=sh&PNa%Cq^J`o){{gp6k9#EYwxCqK~=Y`$JieKibW3kP5O z_Ak)M>#Kde49Is7-bovZU>q?4##`_ zN}D=;{P=t?j|hLl2gmL}_xJ9?VcW9KKjnw>!FV12IgkU*i~bxisbhk2V6{p^{Ls7K z{qEf?^tpoBfM1|7cmoxDKaD|;N9KZQV6Ak$%SJ(BrBj?*4?P-~)*AyDsN;c7CrB_b+YYVje_kZEG95DwU95o6u@ z$wQ?--?gsQc8NJJlP@Ue<*IfRyw<&5S<98W%5$qQpYdDzi8**x_H>Ab3rvM^5l+O+ zThdj(lpm5yood$K#1M~U8#4hpUlq3=4Dc5?=IG!zuqarIayRpu@Z~J}djXyB)pYuo zLfZna)(+_gFJ3pmFP-yeE$xBjVmn`T{^*$|4<6vdJ^#9E*RFqO!QZ_f_`nC$@sBHC zEMPz7LFBh-9sjwJ11lAP=Z1ynxD~EE&W6;$I4FPDd*1V&7qgY;E13LbNiyn zIo$NC*roWDc-0u^_+&;?zKOrqaK`0itupQSP6z9>WylBFQOlckq#^XC#yz0)Q|5C! ztV(S)_>jEA0>rh;o1lx?IxF_f-;@p9#Ot^wcBUs>hqG__0E3$NY(wxtb4QkKOsvtV z8^bhr?sS;q&o;pqc=039N?jfpBplI!VEaDq_?h09NxjhY!Je%g+oA1c@P9EgbC=OE zA3$!0W&s81L)aX0>#p~*Q-?Z!+%f9*6V&tjnSK1>`RAYiwLksSKm88$+Fif&mQL~= z_uR~Z&Xsv?UYBgu8Y)u{JX+Pel~uRbeCu1^dMORT%c!s~<<5M-jX=V2&0NcMU&d=& zsL%^EX!>%O{22xVr&s`VjMt40vqs=4Efh=*o@WH|tN=2`4PTh4fvC~VN1W-c1~QIo z>AT@+q`f7t^{wC&Rk!^N!l#3EIx@Aik`D@(9oo7vbv*==u-swQ^hk$*ab}CbLb{fs zIX-xTvydsn;6ek=ya^3Am|IcE+MZV6rfx-7Eo&Dt;S_FIz1A~jH>!Zl@ap()9tsd(- zU)ELc(H(VDKDwsxze}5&ssDvYYno+4Euz0yH&W+CAdxHb$sQUi z?J}krfulScILrWGOtS&nKY#{fhIq{gsA0%DIB(+04%4!q(i!1~NajfisD+VRw@fSj z30qzbzZsT3*{8$0SKx^b$udp87GX#$>t92BV1$uiq5E_&YclJ^3fYu5A*!EM?8r7J zxte|jaQV6bm&4ZM_)?GbmK`>ABjiNaiFKu*$f7U1W=%|kNZuHdleqP10H8x*MF^w8 zOH|zP>-oMQ)v*t8Y~t9=^Znf{_PZ?I@n4SYPT5afKBQBEqRGLN>s=6*eqgEdm{oL{ z0rpAi@l(|2`>4m?LH})E_`(-%1LCPAnCh&+YDRU!&(R!cS1_KV=61|lrIL01~N&e+>3ZSS2fGI8gg3FS=R5`jv2Q;-mt$l8 zCWtVN3zqAn^ewBCBEoBX6qKv+B`gi%Pod`^{!baie}@75=l|~S{_ZaLmwmcd=}B_R zg8=RPJb!YabH$!N*Q#b|S?P4%s`7pHt6$yxs#m>g7oQlu^ow8o;!P|TdLfOch_ zQMm(8vTg)LC~#Yr4dUI1C|-?NE4~HrXV9Z9g!TF1aRvn1R#+b!I;stY^k{&1R4?cu zXS`-;-3b>jcl=dLTQ#^r*AFh}t$gQ4E6k8wK{mz9Ym0B5)Bra5)*_o_jFD_r{wglV zTUQHOlcyP8(GKa8F6kGxTnim5Vki=qMB{p`8>3RYOg3->y~qnIl1|&L^A>!GRNp%vMYD)l+(~7Uh#1_&f?i7$(paQHS3{X==r`Ljm>h0zrfvo50C7I zq3y%JgnGK44qqSY*@eFu-MZ_KM|nA6ak(NSyIdbdXjLagcRuM{E?(_ZI%KZ~A)G%% z-TXEy{J;15*T4Rbx4!kQ_kHYRA3OApcf4b)5?T6{jAa9?GXPl1oaf0|yMppOF~4JG znFFeja;lUK*K_5SSH6I$ycg3M{~sEc7jTEMl?J6BnF08#(Li0ujm0vsI$MOytA+%) zx(MMp9t#{#YXqKR0C1e}1h&Nb01X6EgD4yzmf#Akk}joYYU^9J#0zUzmt7Sf?9jUc z_No{y(%{5L2eU?7+ogY9`cqyhkK5s`N>8GvWqU)`x|XG(Vc$x+oR@*2>!qX6ld(m_ z#Xwk{e`5e3xf(C^CSxYvtV=o~vdYE)wr=^z#;gOrjOj*RgWo=8>PDEU+s^BJ2YAkY z6?OD7>gWOLMW69xV{-X~aJ{mbqwbr3884U`h-iVI_VYMGy}X@4$A8{&#~t6{QKIhp zBe90F4e*=P@t?;z(7B4wxQB|I9Jm<_<6;xWJ^4UHBG>g|E!3@nnM0>bE!>6eM z%?!k&0pmG+g+A-8`S3d|du*;xR`bQbDvxXeyB*(JFq*QK3D_bH!6#yqwt}6;T9;p@ zX`T9VT9B*hT!+n48L~;nm^HizBu37Ir{K>r)=L>OO@8DdaT&&ZQjUvj>UhQJ5M9o^ z!b~*92R+4^Zr%tJ=ezxRI`$dv_&3to4|B)84XpEczJDR)^XYi^acEPYQRrIPKSF)U zWjN^!+ryyhr(W5Lh~m_FfGO3=e(G5ac+hu(^LyCSgA&Sx0~6SAONCJYRezaktXgT!+kN@#E_Y zVW+!!h*i45QFvJylYM$Dz#!lR0|3nk9LCpM1mjvK5JFYstA^7JcVHK3vyP_k##j8X zJGv5&U+8Uok=w-uJ=v2R!WR6iVziKH>Rg7A5|Rf2vLmH!RoOM@Ge*|i)VCfC8zvcF zKLO*cr=9N$X1Nt*lz!<#hp&0Y6;1lgBVS?NaO?}!I zCmAc`z=<6@c6|TEFMjcH?nM5V_lvL42Zk6BTuUQ#KFfL?7dG{!(cTMeJ`S^<gMW+e_U&X#(rMCZ`>M;X&*+=w{4v(z+{F%l zcd?V-J?!1_0QK*F1^~6r|Fji$1fMrKuxy0*ys^Av=$doD4T&4LhTs65?Y=j@@r|$G z)1j}YF}eZ1i#YU}QPrCwK)6{}+^{z34fqI}*Kx~afY;jrlMDj%IN-4M6JT0WGXvUQ zbdDoq=v+riSEd8*^YD{QW^Be6VcAuaZHCu?wJJsvvk0$SHrXSaBOjC(iMDPm3E*0$ zKV@>{cg5D4uT@-<4eY|+2sikb(bl0iSow(#*m@MkMMo{aUDy$l;|Q5nyooRJL44vD zpMKQ&%TFC`rI%p)^|Jh6So6pgTg{odhN2j2*fX|D`qTw z1JrnBlQEK>2}qAp&+g(;;J<(6D_{99>inbd=r!G%vrTJLUlZ*Fo<}**nE`knU94xw z)F~RKM_%!YSA3Hhfa4E7_~0EhR#$OXeg&(MwXgUN?hfJ(LXCnNyJy0I-NPNyFn%|U zW*@poX*hQ?AQ(&Q1@!SDy-lF?16oHgm+VnXtV0cH__B|N%MGa;$9BHh+rQg4zCEMZipW?QXeCD}5aE%`*016z2} ziA$GU@`IM*6FJ*b@R zoNv<%03E+*yC~mVk?+?Xe^QbCFz5__G!Owl1|aCvz~o8l&ArU1-9yKJ&xIFWcrX5s zKJ%H+Jd7&s^%M zjKQL@z;OeaR0XqAO5ZMa9%BhSi%YJ!IR5<5ZbmCB2@g&ylIWK}&Y1M)5S?b482Jkl~M(ApZkQhS&>@d$(XhgjTqKhOE^ z#)Q)$y=Rht*XL~|B>08QyHB|O)cvLpDDrwiR{o1cx z$z9FOG$OB|0ek_Cgcj{Z*?Fc10O(iC6h~^D=4tS>e}FptlgthrqoLF1i8V72uM-kC zhh4F`5VGX}z>O#5-1wT-(l7F=8NX(X7P`(v)^@bTz-IHf!^~j`CD){_DcrFFfnG;?5;24L5({_3w@ z#;V~PnGLvFQ=Hu8oJWJRkGqcTbhxxZRU;%EV`0j&#%c}bSw^h2@~OtDz@GQa0D}?j zEU4K5JsOa&#f170QGASucnuizVH3>^#W}E^ zf_N5ZLnmpgGzyv#&|QtbMZS}5L9cn}p@(i_0PqSLznkb-x6m0!gF-`DcG9)RYmK>V z8L_WaKE zWb`R+-Q~;I8X4W~%br%w=~7%;+tq7 zucv{$fW~Mihu&!(MRwVpP{OMid)Depe676g_|60)WJ!y#bH^znuAROny~dmJDezLK z6!2Vwpat?0c1^Ys7kVVzM%H!&hV_b9*G*v!KNV8haXIpExyx_1*E#mr`&2w zY<+gO9|iqj_0i#vFvUMg+17LY-SF+E^Y@HbuhN^0iOv|=2&W$h*4)0zK5Q>Ba)&Rv z@TpshpP;;+pxo-N{}6-Rhq&{<^WJ;!z5T!c`@ereeB00T8oZ&$>Yj`jiqJk? zl~qHk=bgF(lCL8^Q%u9DjfONJh=YbxA1KnHg@w9P3LR>Toew%E4LO|bu`O%$CAL=H zc6?`oQIjQ2(%}xLoxUc$hM@p1pvd3AO1Qc6ReW$&KR$2kS7zlIiYA{>GEKbd{Lvly zRL&GHTkI#hVulFbxYI{YH~6}Hj@R~hoVAsXUW@iLfYlL;_cV|NQ&ayM9Ow&uIy6Yo z=XY0YH*M!?e6rcjG7g6t)gc`WJ~m+EH0O`d@!w9_{r)Yt+;SInPYe5wvXR%+-o1PE zK7ZRg{sP#i9seB9f%O#7b3Cig&E(VI)e_#O?c2s4;#XgF)m1mpVBSDOb+M*OIkwS| zsu9(OCw*$ju@AbKe!xMoSU{@zr=f5WU*g3YaIlvTfgwhtM%F%{DrLL zYx)yzX}d%sJut>dKmwG#E;{rc{FtJr4A_s(oVZ~I0NWS@(Q26m^ne2)fU-DIi8^Gs>8qIw%cyI^Wldd)^z^~ zj+!fM47xFEOr1a{2greC1+bGVog650V2zDQ51$Sl`TXZUKZ5M&r$7Da^Vmz^622y; z1%o%zpk78}x{HoBI?B|zxzkibs&aVR4eB~%wPrwz0W~|IL$3^muSS+ZK)hy%o%&9} zID-Qn+Ll<45T@acL4fQfU%Y-G>X7m&9c5Zz&FOOb*6W`M#)`7(+Gcx5pU!hw!pSvh zYYKz!L4f%M=kvC{?P}O#*_ihCfDGPP#HTRlv4BtIOPxP6QbUx#EllBSW1dku_$`#h zt;Ffjhj?_CKfs|o`*;M9&im0_d!Cxf%=bv%neo{?!S65ee*L%~| zzuPN9RVs2fs9e<5AEr_8EEU*UD&1${9ihU~DQG3!>Vc_}T{--Gb>i!;U?WitWyJYb zIe66jze9cnwxa-}?+pUsWg0PBE1=N;8xcT;ody@M-0`AB%LcMN5AvH^B;sUlr{~}- zPEMH1ZG;QORbG@w=_BN+k-W9iE&U)nH?GptBSxOMM{jw8X2#t@Bi#{2jW3<^U_iKS zw}URc2fBLwPtX8prvacj`~x%q4#@bcmrt0s>uLAOUX>fSB~g##ba8K_uJkfCltJ2> zs;ck}X}U^ShxJ_Lo4iQ=|MAsVU;RWLMnj%zkmuWpDpPur28w7P9R*xOONnQ#8cJ-FJOI{`lh{#|)1!D)0F98j{s+0|Q12wC%9MXn_tTQU$IfVl7L;fUO}2 zwAh_x+xas>)!~L?tyr-O#lct@pRf#v=R-Jzxtzi>t68t6?=pj|Ooq!w$CB@c-bM^U zn7$$P>V4G3_%PyocsDH=#a7;vw&k^f+kvtGe`k1)Huc2&)EvGo?8B{Iz8auf>?e0t zUS&*=Xj}bACzMFs-ga^ z&S#SU=xZP~6(9X~ylo})%2O3v&Qm^m^ytX3W5>==*`21c)6IiN03DoS+YE(?w}<$- z0wfb2tD&3m*W$$lWkK&x(>I&lQaO?;0r(XtV%>uh9W(6wnaRB17A5h)f#| zAdci`1`dDbR@%rHxRGlhceRFOK3xaZPq3zvwO> zS$J3catmU5;PnQPVR$^E{0@*GdmP>A_Q<{T>f31q?59_6Mjykk;eGY)b>rTXd{dq9 zx52M?nV~fgKOx=BD;ALhq2agS5t`up${=m=_##zrVBR6G*9p47_jUflg$w7#$H#w# zPec4QPc?eAOf>4-0+mzwgAYFF!$=-P4?V10K6v@^fFgRPRqkgWULm5dPGEB=PEJeiQJ;;GWs;w*u?eY8MR z1afOZp+F4=olT&{hZPzO!uMi;=6-Eolwr{JG&hF!xrDS`2UdQki6M5&8_~=yKTqa{ z-`$2)MyDzL!0RNH*=PZ~ET@~_c@#HxyR3k%p`-W8yS4>-GU&j*fZZ*B3k}6KK)8iC zx;|Ri=Io)_>U{j_-8(p+U9>|!l(%~Q)caL7`wpZQ;xzmgOjz?D(`S%p4G)PE@J*4mJ=9&taIO~2$ zQx$a_zs3^>jeun}1_Z&aI}GjtYEWp{TOwma>VCrt6A!$` zHWvre+L~Z}aw+7(bq_`|Gfm)yTwM%R8(Sm3gZLtu`7mV!b0M z#Py~)N?zOaG`D}92Eo4>#rP-iuk+{6>%_j?Tlu_vo0IkWTqgf+*T81{A$GeCQ~4Wc zpkU=ye&v-{`d@nKr9LXf{>jP7LyQOvaOChHC$SA;3ZR(WL~C$)!O_3YbFhVXlufM(TYML=ExIFI zSW`I}mOJ?WOxRulew`*M_Y?I%nDZ%2J$&`{Z4Mu|EgB{7o~;ZMmg|OS0Ul2ISG~h5 zVsVEjmdOgbwQo~yrH2kR%AtMx<4h6hh~D42y1K@CdU_`4^-mB!`PpZmO@I6Cx058D z+uK)`qP!Q+Vd6|0D5!z#BQD6F*pddeR0FIL*v}1SgWcWTe_^=v?^Kj0N${^!gomhH zOF*-o16!K6trSlAWR!jS;13LkR)X6U0%f*_fn(_A2Ww%XH55Xa9exDO&M<(cEn+fQ zX5i%yjRxO3=Eh7#GamH4hent7%foKfgB^r~A^wxXz;4v#mZ9DY-LU(GiEn%D15HEp ztpez6K#BCU0QpgUm(s7UtJXREKY?{2&v_QXUb%GXQd5Hue|nMzwoL=60kCbVP6<)* zn-YRyX{L}8C!O`Z_10TMoYFT)@4uggU%iY9bZJ{xIJl(;!*dW>**ydjs5Bfr0sNLQ zyj%6X$A&aFjYdg3-SaFA%|;0VHlvQ)dij*eaPZfM*}_A@gvFGeeZ58l-|122-#HEyPEN;@piXx zoQ~7;XpMMHM;@^euGe16(h-JVSo8X$ z;Gg*hFEiZ#^T5Esm5)C9=o<6|Kyn224KGNmAIa4deFLkR5+!M1lQdBCac`2$BqnKK z%^E0J@u>&d$C`lwPDVS-34KRcKz5k50=>GQohgGZdRzynm^*)y4!e~EJ) z##s55p{K#A5tZ9~PxJKj7wGBVVsz>jbNjP=XH$H8<9vhT-+c4U7`t0^T3^F``>qR5 zX9Gn^QIiHXq=AN&&W5C>$Vmfh)Ih;XQQxZ#ErYd~OmoO>T!A|H_19lN&Gf)A8U!b( zu%AZWFkw$pS!@3|&Z_bEbR3He?C1u7^8ScEJH7!R<4>bfz4x2EgI~Z`>E&PU=;*lm z>Z`9_WtvL!{L6r?;Q*_lpbL5A&wc#cOAUZr^(5jpY9KWLwo%zBsp1;&O44K8r?S+d zvO$g>KHS;aIYf`_F#P?j!qx>Z9W)B|(?e^=-%dwPi_i?oX_++x+IL(Zh97zKYPy;o8kO!ELlyuTSjRw|OdFngX7Bfu|2(-dnBLw?D z{`li=jv^iy8yh>y+JPff^h3ZPVQMJYQN+0I@ignP0->b_Kvhi-!|$pFfE!<7cY8tf zYBB8Uxld#KZvfXY`oFMc@0XJ&PyY7)`|nS|t08?Y;1k&PPGP{)!dd(HcjVOibe*1X z(!hh#KxzOyD9xvI*QEikR8^VEU7%7`L*U@))2E+e|Md{N3$&eZ0NNlU0=lwT2hQvR zO2Wvr{pZ5)X%Ruge0p9Y1{nkWr`#x{|5v1(4LY0ZwAptMdiUB{p&K0qw!M-?dpf02 zpkDtxphJ4p%O9PepC4t9{wR6Yw!NihdH3(ozXxPAV^3j813N|o>M5lsY2Z=TfO>2* zZ@&5F;@fY({U6*KA!q^GSg_Uk<(FUfU%Pf~fQ5wpGywWA7X83MDsvr7)TP}8aU;Mh zdB@1HhKO)_wqFA>wr+6iv2vsLL?cf_{ELK7@h+!$rv_}(n>v2{_}FW&y*73B?Ab-w zbsC@M^DB%RRbF`E1-Tmz@e`Jwq=AQ81F5O{P`|#E`8*A{adv}{#}mpAqBc{NlfgP-YGy<@LUrx%}wrJqi?Cfmiz4zW5d-25=OYGs+Aw+gAJ);6G z=gyt${NaZmdL||&dNCTk3=j9vqwL0*bYT<@2rxPwEE203DNxScXvFS3+P0K(hbQ7j z-m$XlZpU#E(7)#GMY==y0&ojMe+z>@#}>UAR_V_S4i3&f|NQea^zLsnr@u^NZkcr; z71o1PKL7mlH5Zs=|7$`_joy;=iqeDe&-YVM4p|42W#we@qI z@ga;$KXb-?$moUME!@3zP#jC!@I5%eBS0WnlmrcgpbNWLa0~7vxa;C;EDixekl-!} zK>`HV2oMM!g1bAxA;>qJb8^nPpZlq=>Z`Bbe_pz%o!Xw6?Vi4VeM$FpH=W+8x_YDs zO~35|*GsKnx52@f_Rd9O@|U@Tja0)5lX`v#;q6908xz*k_PA*!l1j6Bi7y_iGA8uV zA=9;)>_wTiLtL_%o~2)4%EIOcbn({J?dZp1Br=NOAYvJWeZ)Hf_^^o%BR&+CV@z<#CD9s$qWOX zhhbbl!|f;2^s*fN&;Y&F8Rg`_Te*PA7xYfEiI(LgOIhTpMqGR=(-K(@fhj%@w?wa( za!mox7;*ckHt_dfMbO-_d6xNv80LQeZ z^*-tEeGb>G?B6NrjjCkh=sBq}-P`_#vD}5FZ60x{WPv`EDMrR+_}Cq0wg z_;%%94{rTON*CS<)vj-8VCPk7S4NXnrunY*jirsfE16UI|ozxR){28#Jo6 zp3FUJv4L6DW9q zjmEoQ!=F9gZ$PqxLGjHZJfnP{z!}yEB{u}XKRIb-sUiszKWo#6j{$&^LHwzVggw}hO1o0@{;>%s-4Heo1$0w0DLrn!U2fCce>Oc=Z?SZD@-_#UTn%QwrjUNx3l`m z3VF&7k^}*2UuAcYs1PnZehlW031BP`e$fN?p$t4dTP?^skEwA zH+Oq;BbDdvO4rLWz#Ckde;bpYk(ry9o0E|g8ySK{c{*7dYb!!Uc(`VT0e}!a`!YMX zpa@;e@TP1b<9n^YzmKcUGaXeKQNim06#&8Dht#*lWfkZugTl$}()04L5G35rR8LJ- zjQ;`q=zWRx^mp$otEy{iDr(O^Pp*WAAQ7Gp<_1sYp#0pF?|cHLGs>&$2j*wzCO5Xq zH$Jv?b;Q73EDhA?#^M3u-@pnm$DDpniU?c>iW0Zx%Q+?aForBfm&EwwInzqAlM;ZQ3 z-tvn(i-OHX>V$vA}zvm zpPHvTa;t4*W%uxSYi@k7v#u;VDKZr8VICGOBPGPmN~YhSbo6ax^L%e_ZSHvf;9F6C z%Bx_co9SAun4|#5J^aK_ikY#&xzqi%xz#h&*R7@e?1abwgw^X)Qzt|BWrIvC~n%=@{V zq#)PbD+3y!4EUdS4E~tv{n}hzlArN9BEUT|OkGV*jPD^yXagu<08ZEXm%f9IhN?&J z!Td0PpXXhD%4$-={4{DSi~uf}Sk|WM+S=z2hiVHl^BR7B^Yc+r5Eo&T+*APHIs|Uu z0S`B)OUimjn-4ob9lvRQYpAX&E6S+1X>@@A9X@b(aO-_?N>Xlo#7k#0Lt||@Uheo+ zg$sCS@c^Ruy&u^xuzme-QLzEtYZ9&ItXbn za1|7L;Eqda-}v;@Xn$Rx09XZFEC3>{2>_2EVo-4j32~?>1O@<_;lLFkQ3<)H##WAw zR>n_dC7@yefDQq!K_pb|u;Ib}etv;r5n*;J5>Nnu`2)n708CWgHarM}L6RZRzDQ(9 zg0l<^a*;5x~Q43 z-?5-l!MSY-6$dmifSjoM3oksb7(aACh`P3o51p1QO{TrbVhdAOi)ng~S~LkZ6Al3XMWz{P567G#ZVh#76k}xk-Q(f~W^w zT!=;yqTRK8_00m%$jcY!AQ3(v6kxz3aR)3Cg+L=I5CMj2Zb~+O;PD>`ZGd$ahY2fS z(I}L^e?UMGLdi~FJv=ZNb8!ZEJ=){j6PSoj5EA8Q|LplQQ(X!bBrbm5&(+-D+`>5oh4eQzHj6-E zjVywYNCW~MY%VSd_d^EgK9jsGOy-3O)Fc!pFbwe5d+HC~AHm@7EH3GW!N8S$uRcNo z+CeYwQbiMS#310Rrop~ww41-TxP%J^Yo-%+|GEZXg9(M;X#rA^-a$HA;b8fF{jJ2s zto^~VVx1sQWE5TuNL((%ldF)Cv=<0AOz1hyn!q`xq!U<-B zKOk-vjI}Vfd1`E`YH48N?~nFHl<0ujplH*<05Pbh?~5RRxVN_pHYm`?2NM&lc##PL ztO?5Y6CDG3-9f(DWN|IDwrs?ERnRhAI_gI_w3Uoknm@BkzdWcLq%17n@#p;CVW3{?*R zWgmq?`)it7t6)$_BqmT5_8VZG7bx^aCe}{b<*BAW*m_7*gxbY3!T|W9>S0JU26Y{Y z{exdW5Ku6`@Na$tFzDMCm;a6L1wcNH|KNL(`5*X#()DkA!R&wVrTP=Uf8mQkQ21QX zt7wDvxnS?&gn#Ho1cZi!g!zH=YD9-efP!~XxPRzH_!%oGD=5o?^ja#*NZSVZ`2GjI zhyXnyNpYx{yB`820pWiZ6aaQW|ImxT+NgzCS-ZWspx4YQ1|9H3t|u= z_aF572J0w=`~IfaFG!mU@t^bt@`zmA|8IJEb+G@U*Ei%Thh5M=^!f*A2>hE~?{ER3 z*Z-#1&&M$U{SUnXVb7hw{`wz!15g+XU(BEMB2oS(dN2M5y`KCM0e*h|ewbh^Hc{kp z)PK?IWiRtc(Zb%zM1e>2xpDCSq}MdmUsFb(M@E@bLqa|<$oIeKjR+60clWdniVXj6 zdJVk-!vnB^NW}j}ugU)rdjBuizW+PE*b98E|5tniUxb6$Uf>%W858hd_+qsnP;dn~ z5MOf`Kfl?3;Tx=S?;$q_hnpV)!F~UhZbK}YVB-tbX17FV=w!2CH!WXm- z{-^T&H@^PH`q=-(H%v)1>Ti58!HU;G7XPh$LvGwp{~KSpAA&(CAm|_E>l^We+AQo} z_y)_~{ttX3Z{JJz{Fn0e^R^B87rwy}2KN7nFB)Uw^BZ4;zqZ<||G@Wou=_2ZV1H~N z78@E6kn!MFoag^gz9F7g0!&aNOIuwC1G}E)|AKFjqM+IhL2(*c9+AM%|Hk*_ix4Zg zhgo>c%l`#m&p+_>{r`inwJFa-;L`iW5LIOvauRwH007A4WTl=006ut#4-gZAA1Fq4 zEck)r3Odk0Q5OTaDH0%Mt|Momqy(^m$HV|mko6xIfL;Ya5B`JpdOFU99}D^!;CJb` zzjN_{bi99#FHY3OXnScNO z738Hme!)_z8d4$G{fKW}evU7l+@E=3*{-NEPAEoDcg6yl##zr^E*`$(Ny^yION3L zmWj~VK6v1&xJSW85gBfy4^b8CPE1R3lg6?bA-=}$k3mYPrC%H$6 zC2J^`E+@hSRJFMb0*t(NaXd8kg-OWVU1neAjU7ti)vNZ#NsQl>R5XWKs+G4D;{P1G zJj1VMJ;m6IxjmtocwBfTmfc!#iJ!XCfAorfoYS42Y~K5kyYi0r{jignp6Dq7xgcMX z+x6|wkGoPtl0J`CIy&0f+g~0W{PE*Qd|aGXv0-gRZt3H%2AcTZ2HGQgn%igiAF`f0 zyD+jJMnCwwmP72MJ(&9$I_ZCtO^p|e@%CHMQLUm(`q z9T{ciix~eYSZyV(wMJ@SIpoWtb>1rBWGMe)=MLO=YDQM_qpD2OwIoEFh#`qwUN6~# zpq-3xlZagEs=24op$GM*6)?r+?CQF+(bCeA5*thXDXhy1PqDa6_3ky&-w9$sa~}_& z9Ngn7Q1^^46(mUUMMne)WQ-Hs__i3G!*ccsSFz>)_r$9 zxZ)}zEpst46^c5`C&Z7ifla*zKR7u!7<{G!Xpi}{n&8i*2@8NIa2m(&s$C<6T%$?f zQImKN`<=evx@5C?d33S0F+CD(cM9sBx-og!lC|mCDiVR5JU}p0Jj+q^YR!2FXAoVd zV(m@dwM;{}PhISg+!V&$AecTsgLQRv#fF82;U%6j8yFii$IJ?*4*+;BcZlW$XG~gN zFFtrRW~zL31+auzi%l6&X1zotPmbh4s8Trbf4%e&V}>}&S(TLg*X1USYk#jo{!6rre-o_1>QubXu&AY+=vvq87) z#AzYb@dR#+ls;1%75MQuzf4R_tbs>Vw7y6@b+62_+oA4co_msNmy@VXhSISh+Iavy z+lND{qCbkeo^r87v&RIuGU(({n~WH)N)8zYE^ePMxk<7(*c7lP!^l#hxI9U zm%OljkNcu1yjUWtVuhF(TqGtKP)?!CWL4dvq>Mx&idyLe#+Ra(H$Bq7l14qkujAMb z7K7`Fl4m<$UwVpQUWLuBbrtnKmZDRu*=x2Am*GvJ3^rxnxyk4(ms)uJ36Vx!)~bzL zcJqU7Sd;xYB^kcmGDnco7tZl}NqWQYb8s+9(o=C8X`LAvHx(q=&o~ViN2NYA6Efm+ zuB#s4^3^=9sBnw4vq`tw`BA8!6whTiayUcVSameqjf@iy;5*hOvWW8e`D$qLt$OW- z^oN{?-w#sqIgYUGzoe7l4(XP|^Wl2NHksqYpRgDBMn(#A( zCV6vR#a!AToyRDL-Pb5?YJEz4Th7d+X&d%M(37f9@VtT^<~?1a|E+&c(ty@r(4;A` z1?LB!XL(Isom~)_va)hfS9f<_5XEy>w|jA_9KVy(Bxlc?M^2N}93;Q79P=S-%t_mr^PvY(L%@oaor8d3x+%mF`gkNm*2{kxwWxyj!d&Z@V0Rul2|T4-fC#{v%+@ zm{{kPkRUUfm`h?hg)j&uePm94rSLwN?L!mYFx)u!;Z&#=0f#NP482vHbVaRmKhi2;FF0-?vaOlE_uXoKa^dAKY9C$+W?JC^ zeuBrw`A~Dq=sT zm{nau*Ti$MF)|{4*3MFP%_eR=xn1?PO5%Hc`MavjUpBgU8tfxBC7J649apbjWw-1~ z)FK!~G@$|NMdz#SLVv;QkagiLodR@-sUXjPR*P_VeB_+MwwF#oiNChns zQC*Y2dfcX)l`yYN=511)@7#Z=mo`qPNRds!t%^CLl5>%USrI}vRpWEhNYNIt)3e^* zUZjv1!X?zMxB;Xi^TX-hS~Y9?*UdrR6`YjsV(G*EH=A$H2MLC&%u6QfGWG#Y=`&Fb z6*tN8$qG`ki3mb+vFV(@D7~Q2ruMmP#^#@_Gd-T))(5$`tJg!5+J$>P*c`81rxKaR z8rCVjh~jh~V;*{7%i5qkUv2N5<>x)1@+GnKqX6-Ub%6LMhe`d+Pa-MwelMm$~$&| z{gi89^wGZ2uDgi37pqvi`mr*JNAzN;i*UC(mu0F?Am%nCl`%(lBM zi|UEsR+1kQHkI2&Fw}>_;Neyl8B~|vl}VGlBybl>!6aKzcrPj(K0atCqJwwkZsZPu z)?G`b0uwDhmL?iMzL}HFQ2=cg|GTT$LhGfIEsLeoR`3;oM$*(YXdv-9;CT2#8iS~a zkc!R{Whqw^_m~G27X_`Ab|O25>C_oCPj813N|T2B9OT$SmQ>8~+FeJ)Ht+3E>hG4b zC@0LGn22T(q{V1D8PS-iDCc-GRk74=ER&##nqeVwB}(?+5u^T;f?bzOc*XToH$ClU zt;LNs(X-ujxJ>KGz_N)YAwV53Y0w92ni&}x@guxSv-h=Knw)|o)I;1^?s9?;lZJ++sWrf{5_X+*a#v}xd@BojoTU&6Jrm>|x-zv$!ZJyC6aUhL zyUE=`@4mXroBOS!p^T7q-saffP33gXsagSyo!hGN{b|KlG1H_AbY1b@UpQ!-=X6{~ zt=k%pvIb>3T3F;d+S$ER`4#(X&S~h152tiR{c&Q*nq`_;(B5*)&SiUTCbjGR@83utl5u{$OJmU|usd%^PZ=pbj+{E_=zYJ`(#A-n)4$jrIUG2K4WochEx@5`Kn)HI*D_O* z;uk}F-d$4Dw2%`Cs1XM|y}x+8&5MEh(ro$MuV-Zpdd!eE!;m(sryGgkBB&_YLQS3J zakrrS&!0o=R0S2n91PD3;pu0_#~p>mt4>YiDP`}A&X*I<@>Y-2c%7QGNytLoHP3T2 ze-Gj+K)RO{$-s5$AG9xxHV^QZut z9jx9x?ISa9H`OyF?mH)K>**x_DsRjrG2VA4&`P_~{uM*W&?rj+bw;1L3R!)n9*wm~ zIc$DJz9rRo)WLza@e6tyS<5b#?3gJuBbVw*5DacpAo*z-N-|e~FSsYTs}Q}ae~Ctp z-NmBmiW(k{0zI+LclVSWZp5;}PA2QIF0KzRar*I{QXbVAYf1d%JW`Ioe4Z*4&CpK# z)Tyofo9aJ6o-)xjX%uOyKB?PtA@S8>V6EM(-$Xc0T0(#6S}X*8;P5nvXo`uuqGG#` zlrOy}g)K{y=wm{#0ByWyH^1JzU!8Z;xCu`qc zX+k={2IEP6-Ip*a`W;Wm#35|=nMu}Ap*#KOH|xCj@b3- zZpsY1p6oucDE~xvev+CKc-hU?{;nGRVXnNtjdgp{wWAIzeK$GkKRi6h7)=#XiY|lC z`FF#~O;G(X_cxm$Xt@kb0+}IEDv6hgxD9Lg4nGtl?3cjFz&Co4Q#_nRsa0M(3;u*S zf=!N!9Rb4~(A?n@wdF1x@%$>JRq=C2l6b$obopZdz03r~o`)4^+&WA#>PP*(qal4cA9GJU8 z=V7eM$*%|LaKpe!?sL(pbOoXAap=QSJAeg?v;S366k2hy+1Sy({^YS1^PPuv?d}7>~k9U_Z zcdn4H0#LC=fm^MqZ8!+f-b`G-p~mpT#RRK|^Duk+nb2j)(6wpiXw&8^s7&S|OHZLI z+qdb7_Irg6D7+`M1SBFhV`z;PEOCtnv?uf(#&9WP2;5LwU>oa$bzhiI*`64RiD3H# z09}tLghp`=zooD54W3h15#F%@nlcG-wBWC&-cnE-4E#vb6lMQW&ejC3r%vd?G97AG zyrlcSw7k6B`}BBkz%td#V()6&AwE0B+B*zDcW21isjQbvrS_rI-`>PpA;A*lZ@b&+ zkOS5|1kMp-=w~`}hR3yD_!V#FPp_^_sl2@n%_)_GzqO}>sz!)D0u61vP{hqr<3^QU zZE}WJ921lbeepAbeKV|=|M7w6Y^<6XPYUs8)R zaI~G%g1b^D6>1O1ovl_r9;&>Xhg8_AAOsv&!Tl>a%1re6`mlfTD>qR8CKDJqU`P*?B18VI8 zW&i!3%2xXhBtgb-MN(zbuKP^1ozBb6Ff=7$NphM>^f-~gjTO(4>Pk&F#lLO1 z+7D>xi3fY$)`bB8ngBgCRs%c)jYKILqaEiLTip%)nmk8N_NPg-hX}5JTO&VTZ9H3T z>sNt_7O5Ou%*a%-3fb@%o`042Cg~|_iXi7WL^(7_6G&czrq9<$J~WkW8;zaa-sVVi zKa9-h=!~B~wwT^l=O|$()i_g+mTKhu@&##d#vs3AO>f^O646+gd@NH=zI0hsU`VWq z4wp2v@|q)C*Rq#*@*r&1Pm8wGcD2b*3wO->3%il?D!HTQCqKelbbtu~4m*WlB)Y9h zB0TzPe};j{!A+mF&+h9+E-(MI1-4A|((Q0O9~RqMYl51gX}T2Xo|&ffox=MB-Iav$ z?IsS^S?Hv!K3nf)j4Kn%KCPDY!>%M#E;lvYM0ES;upYWbp9fn^+eJ1W%6u1RzWY`Z zlG|0mIKv8gbjCrjaAOvat=KIpKwS;a0wjC9?JvI^mv*6k@f>l^jkBy0i#kLiEU{+? z$$QW4pKck<6x@WU1g~3vM=yJIZr?XO2=9~!Qtf5dBrQY^GJzJYfs3!3nZ-_PsZyy{?r;}#igI$ zN-SUX-N+pN?rN#t9Z4>9c*A955FXf+*u|(j@W@8`Wib^;sDm0`GHprvVt*YW=P*|j zKThO3e3Km5r9TV*1^1vC*LisekzcE!`-gAtWW^EXk=Wl=p64-i-C`+^8C-WoPm(Qxqe3G@065g=x4~c{iX+E*LNPavW2VRpuTL3Z^h1*cN>-_MBV7Dad5o|8 zu8k(?+HhDFTgBX;;V6oDg8h=KUtME8HF&eGDvO06N6vaKd@W_G$@AU##*_K0dOx69 z5!=q4rJecxc4`p8Glm6A(1qrhhqfp(zMNv5s3W%)Q@WwPAeEo2j3A3XVrgV%vnPLn zj2gXBY%BMgfN6hq^8M-ZWFuGStY7|OjC78Gxvm!Qumj4<)J0MC#`4?W#c?&||gW48KwT3{PFopUtto-_{+4>ubh1{h!Wz0h2OLPA2>cS|LOVYaf2BR5l$ zMSVd_^<@|>cf=|cH11f%W&!n-(dL(3nsDLNp&hfr`8oidZu$OF?CIi3zeaECe8Ze* z4~~Q80w2LfBtePKrP@l^#^-gT=P!HOagp5>ep^R7__E)hqAFN^zI(b)jF)T&eO}@s z(OqvXT4^B!Q$6x31auCAP=`SQV33ik^V_#~HYO&9gC2$_H`t8zwR@^@R?|-ASO?FR zBF};)FVWrE!Xu33_-#p=2wa4lYu_79{~2wzssQ@8K|MRpj9Ph<*Yda)nxPE#e9dlw ztn*DtuZk1Sc=q6}e5=q*!FPxcpH^fk3m$!AX)c+GvJ#3R^;%nwoG?p~jG688O?1$z zHmUglbGcMw{-$R=uJM*#P=b~)LyS+ha-^2<;=TOYPHXvwdV-Rh`(5_So>leVZepY5 zT`hoaw!>cmv+6nOA6*|#y-kG|xNHyd9aU?)~7GEUf zFsODhf9C7!E3QwZquIoUc5y(5|E0s495|^&Ue!`-9R3;hp(rD$yS-|kj#q~Tu9lhf ztE;Q`b9;SNh$z78NIj#22U_0gpT5+~pq=t{8Bj$nEDHY{ZLrNi?= ze>b7^Py3e|%hw%ZQp0Ox2AftRoEqm^NGN0_4h~Xn`m*Y3+I?!yeBPea(^llItJp;v zFu?U&ihYhMGQluO-SjSGZVdfcdX%4qF8R_!8I9vWLL3LHrm4UNPnTKnoggq|j9z7% zRm7>F-@SI_G+YI~|JgYB&k8W{k;ddrVcn$_d@f*{S&K<}PATk*EMdCk<*;zMHTiDw zZPZCC3bF@1-+}fEI8KzGo+KU#i^pU|_HX{o?qk?)HECukvn+J`CQ_VPOzIVM_E2<` zGG?PxASfAbIvaD(QBp51w>D!n@LsI-GL7(}+jx7?W8h;=9rKQNzpujZgO`2dJs&bd z4mFI2@6VLgY-sXVo}d26TXo-QlntqUZ!Y3`Te(|`kYuJBM}D*#XQp;TjUB(p_Sg4; z3-+~9$9bsZg^M*633}gi0!D5&p&1jQ4VkMC%sTCld^hB*ZgTx$FAB0;5J=G$aNp(v zNCq9!9=T2Jyi(&|M?@3*6_w~9-E56^bq=zJ2- z!zpq;;=yi2*u$O$UI_E@6t(@RFC%#snl_)T=BIH9Z!5cFfvH3)o?tzL?>dUiS3tb9 z=BCe*^$GL`NiN~X+)R<~hhZ*^J^kn9%{rOY=TFOe`Co4Gl+v0Js_s%Egv#sPV zC0&Te##sB%(CZXB76=w+6&x-R_<>p!-sXT(lUALwwQ=;5E44=t-{_7^XmNYsTJu>b zRkg@FeGd}B@5XOM)d#O4K`7IjY1OGr-*F!uR{EEZ8zKu7TcY~L_K$MRqIJ-u!U~-z+KLB0Z-6) z|8lVdn1c5PSEz-Wue%YN5Qpa4!egLA7spo@tx1qf+jBG%n(zN-Kq08}BAoE7b|$C( zLetgjHBszd?f<^DwH4A4&)vOpZB=((C4Xnd=QwYGZXO@SaE9{*2{-zMKiuEFJOr_I zKIDw1nMh`f{i0m972Ct|CSCrX4ynW{B|XJ4#n z_hYXcWW?qC=yW&#h{4lq^J+|1WAF3o`9_lIV{r<@-O>YEx2UdKB{|(GclG|ofY?$>*1lW)Q8l}GYbi=HJoN)n~m(^bY&xWxM|yv~!+v1f-Og>~+B;WpBN zu;_Id^UuNL=TwGi#5Mo z`O_c>CEz99iuzmWu#};NWAPll`;(r)uk2-ujSGkh3x}4WtJmndCb)_e} zRq|rH3Or!Wg6)s^%T{r^Y9u4D%#0{Q2@3Yx3!cnWB{)EA-b0VM`fsbjUW@(p=2iGL z;h`RE-W_<7Bgv?r;*q|eR*m@7@lxWpsj|o#nKBhDSH`OkYBcK%i+m;-JUyFh$;A7< zQ?{E0|42p!Wkz<1EVGar&?8_?&d%v9S+k9VFUZU9QY}sr0t}%PdReqm$V)*@xHZTz zEWmPJO)X9c2wvNI+oKKNH15@Us~|;)TmF1%VS9UfY=c&EsDZKS!uWM-=G z+0kO&!oosCfx4GO$FJc?@2B2QCCo%em-7ZLF0K>Dra*l4mM8c9o!}!ryuIDG)UE%P{Z6`mO&x`MZ3aG`f$#Y`h~d% z<17hcc8@IBz^ZIB(he+Q0*6X#M_@VRC5by1t$s{a{0%bMqxmsQKo(|NfrJ zTRRE%r>yhe!xd=5qVXm#3)z3@2RA}S5~Z|M`%*qQl5D>mTXaB+0cEXs@5(@@Oxa`JK^MbQ<)WPi!<3R zsZ>5rVJkDgz@u22cE4%KiGD&&o6lX6V&CWIiQ9@<-QDwOh{>Oc^xhX>y{;E4Eu5#a zi#-TV=C_Kt7tuIBO_bKOWPqhCZT1rGEBLmBne6Ako?hw})#TjsdM7P5E582*xtn;= z4n3J?9~tj;vQj%u9MA3!!gtn=M;ug!WHVvQkltJl^BLjK5Xf7Ri96Nbe3B!*1H5hb zT;Q&+SLADhy*G{r@#3T!^UvEe35{soxIlN-rgOEYi6D~@kH$@PDw7bO2E(TRz05~$ zk(fht=i4KN^Ietm&$>9vUO3ip#(wx<%id<20r8(b$VM4KI|=%iFOK})MOS>#iMzI* z7SoTK>B~`IeLX%Ha>hE4VPgi&o_GF>Buc#`PsU~s@Hjt9;rM7 zc#gG4GN$62(fk|rLc80Piv5`$toPf|f>XC6eCe@dvMFhN8PVNy0{8X$zY7OB*nV}X z)n1WZy;j&6NAko{c{!O$w9h5kV;jb=5 z9Un87v1O?A+*-afQq7pTS4c2tuaBeZ3^Sj*9b>0Jnn~MD7){exJ}cF)u^^ZyR}_>b z{IRA+n0MR~*HNIvFsa_)Tr<4m8OHzSH0uXm6G?e|6JL^rUu;8BB@y;sY;SAO;K4o=e}b!Wf~qhN*YY zZi8V;LFE3L?*3NVJsZOFa^Vn5jg~WH+@T7)XfEho&(8HvR}RbO7>3*<%8@a=^Y%fN z9rw~3=dNxNd(3_crmTi3zPetp=Umfp6*;CPy zBfo@lRgRTV%L>M&S5H3_pT`LA=Vf{!?!MOke%KRf{(fyt+?z8` z%YpX?s|h~bd+9~F`L<7+bB>}~p7b1&iBRPwo1cn}M(%8a%S<_MF)k{LMl_P+0@R3y zO?_m5zc?@&#Enb~5HQq;?+zX`6!#awSMt$I7H+w8tbm=Lpw-2%P zEH&5Q@Xvb!(_x--X1oUFpDMgV2HP2h)zQ|XsqWY1QU)`22!Ac?8c52HiHGxF73CLw zdw$$Ib#h=WLfHk4fa2j2#zs6k%Z$Y0eEh`%P{}Z}PNtyP)hCF6>sICKxPA>+ZaP@P z#0joFPJu9PPa#Trt-rsU`xt6MiCgi=^wNU6+X<6Ke?9SVai&ZGf9(S_Q$39#>nIyb z8w`zj4C5QzJ#WbL)a}NwkKA(F+gsn)KWp;pM8Pev)T&58Pm$H zgC@nSF_h-=@p#@yBq7QCW5B^A?P5%Atqc=(cwr6t*x(2ky0rzN_Owy(xyQv`ov(#` zXGdzGZzCF{IVl;Fz&Df!d3)qIiBg`j+Q~D1eDG7T;FG7pNxyv34)=s<=mzj5u*W&e zb@3q$Bt67IFYLRb0S{MDk_%f zbMY2F+9o`r9!Z|u?1WwO`np)om9NZYUbxk@SVE98P*|!F6pHw=X-;uDA(xYR?#4tv z#ZBVoqhyLDLD`aDhK8H9H5*g*Q6WB3=ci)R{BuLh>LUloqZxi5>HGuBZ((treb9D^ zxu;X&K|jfGets_ZtcxJdi5$2(*9*PvIB!#s!p>qapP0{}(b4k;T(BwCWVB}HSA^?0 zLyg2-ui;>S`dVi#3k`d7C>e!q3JoO3qxq;9462N9I@uy!TwK)Byv#=dJi-q8>jpnW zOqV5@kE7DAmfS-U6947f2<~3QE`rXk#1US&hj(bE68JL(kB+)g$c63s4&ThpY+*ma z{m&0_^7#4%mNRhmZ2RIDlOaTKwKl<+7kLSZA zM3k(l!=6ditc=@D?TVs&H*2msmhFDjHQE)E1$NDk<7i$`UcYX16hkP}z3jZz+rfzF zAPpMf7h$iT-J@aj++pamC4YL8J~#KBc<)&yHA>Go`%-3`qYv-&NcLWywdb~P6rR&? z+YaC1edre=AtBD)SSmXjXH565mfjaRRMo@qE;(yr z+GpEw`ew>F31OLL7|BJ`@`0=^nzn*(WtWA)K;GhQ@g)D9@|)Gg(r|k@=hTH7wobN( zsjK)}Xr;EZ0{Ux4vGwb90Ad9$H<*S;uqX}9^HeVv&_pV2QdLll5tCc^hzoJET+c#Z zaPr9(vpbLS)K}xXm|r4TPP5geS3sD5`^Ve+t^K-8+R4XVn!8(UT;WaS9!h^fGMi>cW*J z@pML=?H!}@hL!Gov861HrguZS;3prHjo4GAUU)sZn=6>-!QhpdDuV0+M!`+tJzXXM=cs&0FCh!TdX(DF zhu7sswo_^Fq50=gk9#+Dr#U89@+5`6O;p?`X8P*k%ijCTPkUUAl5OY>lQ>x^hkQig zzN#1n{nLApf(}DdOEjKN5X8B)$Bs*aVm7J+Z?o+3=+7d7L2iE4_4G_NMc2w`+n8hKxqy>Fe@E ztG6cfje8wpx5k`%l&<;xk z_PN-%wt|HeCQ-9(06OjQ6cIVal9&IEBNh-m4<*ATdqpGK3l5$GOw*2G zhXKn|_=oazUO(j#GNffYQKLk1KDRuH*yd|Ac4bGCa_gCfQ&&H{g#_Ukfeo?vof;v$ zC2ddY`OM92H+trS>ta{uXbsv2J@5J{hd+#B@3`*uY<; zBCNC|(yi{o;FrQPo;nc_!y+{5m3+c`0a1XsmCqET4BYi(71kC+u*K zicg9{dd_pHlkN()=-M?EUAr=Kdgun^?)}*?QMbV?2~~J*K5JiX!voP}GUMqt1(F=p ziQ!OM<{eHmU7-r~rEJ@GgXTH#12$~v%UA8e?GCKZQzEu&M7eb`tZ#Dn-8s3uSX!sp zV~?ZQAN3@U`5303@rt4a@6J*~PSNd}Nc#m{2vUpyPye*0dvM;fh;0Pp=K|BcX+lKG z*2xcqU5U-j*efFdXa3=+Y4IHC;#BOx_FC%l@XCv?^aLu4^NPG=2z7B}@9Dpvn)|h* z=#x#E&?eig;U^NF1^|pt2oky!MOi9Pq8Z=jq!GLJV&aKYYQQ+*vT|yv5g7( z5$;Jckec?}Dc2#5!9nBsScg8pFxe6aUN0|}`MyH^sziyLI-c)4K5FmIS9fPC3E${y=q`*LsnkrhAoEg|3ITT8Zwd`hOV zD$7a9$JvDzN#PStwI>;8M)i3qTYPUG{NkS;xoK4^QCy=X<^CY6Pi&WLP&|FVshR|l z^Kt!Kk#&#Zj1}}DVR&Zvw32u%ktk=<&^LRca<_C3UH2})d}g}wOZpE+!s^|VVU6w_Mo&^!THJ$mOCqOKbP6L2afBv*94jYX98G!o%E1o)5ESh?ItO5PSQ_Mo zjy}=XaeCc&3b7XT@MPVJpc{mLRDRd=y3c2>SDK*kp8ogg_dDEmTOUs>!G*Z>^%!Aw z4{BD0C4sgTjF)t(u{i*H^2a3nsVQ)>8Ne`RtIl^p$WR54_We2PJlw)i*{BhDy8H3t zM_qW2omZo<)1y#zwlpdRO*8(W2%Z$fUmWSeaLDGntYTgdn7_9Z-nvFDJ2`%Q;Aa}a z``<>2-#%JX*tdU!Z2OgZ`q+YdzU^@Pw94PuZQ+|jV7GVTY}PTFCz`fUNa=xCb~V56 zTczRK$!!iK>?v;z&x> zc`)owmHxDNF!o2W8!KHG&CR`9BZ}s`H-D^p<`rbgIi*Ak?%cO?yCcV^YC*)z7wWE& z@bWqqnJh487}xfcMj^?rx9keQx}(g3>+s+yEgzvM>K^wx1cdR1?Z=%Tgo$L6@8#AeRrGTwG+!FxBMq(;MQ*D+r{U{#VS_0 z=30z8`#Y{Blcp=_De90yNCD10P1dy28=1^9r)_)r+mLKgL*XH7rn8M3Q3@NJ#&5LW zi4+RNV`dtGLz%qJ7X3h{u7NZ zpouu5VJ7&HoK2MemS9|ED~?(Li*@|=`xm++XB{>kdQ3yLxUm)UrM1x|c(>M)-h`hO zDcI|$AKZ7Zg#J3Cy_T@vn6Ws1SCrJ4>Lk$0=-R0!qnOWW9&#nmp>6|SjHU24CU2U; z#dy0S-lY#v?p2cNj*h&HEBzx{jZ+5G#Zh(mBhvWG0S9jK+L`VoW%4Mc8Jww;#{4=V z;n{;+#*Kq9*X|dF;95cQj0JRXJIlDZIOUbA%6Tzjg%q5Z7t@B%dEhOFaUNrnDyM0aI)m?8EVmnf>md;94+`{xjEppQTg&lYI1IKul}eL#nzSS!;-B_kt0 zzOPKs#Q)K(DOyA+tS1cf;MEuBdJ(Uy2YpY(Fml6OGAiivJtKTX3}*Zq8!v9xay?}G z`@pEQXsocJ)m~!Go^B0kf)YeRV}zAXY3~OQMq$KoT0AnFqZC`v+iNZIHGhe2rFbhn z`nkh_4oX(TDqG#V@ij7GgWB8d`_^@~H~AkWZ<D@cZv7g3<13(i=0q(A1`F(zsN5m#-f-L&DClAF%1Yk$RcPINE z_h?wX)?09uk)nbzgEgyFl$2+=z67d^^-U;IHw?rqlN@I-m;b&i&yc;G)6V z^#4$GR$)=TVYeR`x{;DbP&$-m0BMl!?q=v3x>Hc;kQ}x4sK`wDcaz|(Myezt%h`$#Me zcmV~QpS^7Vhxb@|8YFqJ0J5oa4oU? zA#)JtGR|w#E9vjy7#b0!#9B;5bu_~s{?EtaFbxF@1IMwAi(^PaA);sYXqcjQQT zM}GjPi92~eFk~EjCGIcid}ju9SS3B~VRHKN^ z+5L?=7TFW+_9mwJ8QqYB*@x#EWZyuco>8oENNce~s3C|w;rVnA;Rb}DDn5g;-w`tj z5OCdpSUmas&h#NSuOKE(cUkIUO;h;YoNbLsr=J1!lH5#PrnX46U^U+U*Mc#tiFaG# z-9Zz#N@T%F@vogdix%7b!}&zCiw!>(hqPm9!HcMP}O{>E}xtL0cK8 zwo$avKXuSC=u26!;-mY_19eExJRcUas_2D9hA%Wg`{@f}q>Vp&F@lwEo1+PfuT%2= znOGlUt1iA@%vh|H`P4R1NSR5xo;BeN=k#>2!TUA}S2?FegvZ;0Mte(@2L;A7(}%rpeXdJKr)74tWQn~I+ObBy&eK4DfDd1}>~9MQO+ zLp~grc+@@eh%mqJ!BG27C>p$Rg*4d00bI8g4watgzCo&4x|GBpqKQ~N0yNvFFRE(Z z*TvI^Gj7yV8cxkNzOmGXLX9)BvJ5AiGITr2ePqr!!GQaEJlqa?le@oFeHJ9*=feuH z|5X;RmXNQm7LFBSAD%yV^fBaReft@1keYEseoN<(lV;{6bcS6F{Vqp6`sy=Cf2ZGH zC8t7;B%bXz_=#$?uNeSRD|ao|*b9ke=OBdye#kI`onIRH$15Mm_~{PW+OGzB40VlN z-J1ku!>u8bZV$SR74%;!_Y+0f@S@?motJa1CEgxQ5ZtZ)0y3ACdp zP*`vJZQkZd7BNBRl6T5=zhkL#3Jg*jb25yfivrZ0>3d@vL_C!(UPKHI`nWnz9yBtL zPqPV?BnPo4PCMMZHmw|>8O*D06fKu9m~~M4vJ)jxK+n)bcy!T>@vE8fNY1Fg`tL~* z1m($jU;fDXGKyCBUBB<5?pkg7V;R+KkWgj#q5@yR)R7z?z)bx{y&$(&5Ka}g1FWH{ zvbROYIK#0SpA|8$$y3y;tMmDDWn6z8%l<9PPjn>}&t4#PN!9(Yrpb^aoos?N{FC3+ zvQ`K4oeL~?CBca+3HtTx_lL>!u8V!zhaa@H6lR)rP8g7uBKZrjye8KFDC-*7Mff$u zrjyUtUHn!AxHI*`qXaH`?5hfY#ygKiko9dqSMl(h_$gZW&44X5_~}-Y0!8qf$|M*K zSu5&Xj7?PVkBc-OE00Oj{e7!eM%Qv{;YZh+T!_C;&7zbXt?$T-TSpNdxgta#Wrh%Z zU+->2EF8d&+uVDP;xuat1faRy@e$NUZO|gzw4Qhl08GN!Xeb_Q$a2Z+Er@LVpC;^R zv5sQTC?C_QaL(FfaEpA;uI_SnjK6w3 zE2Kh&WJhF%DUsUREQ^4ilfJ^;@|M%50H+41S4!sdZ$m9zlolrSkAMQTSIAR8%==QQ zDIA3l@HP)A#QXPrp3uEcVepEy%6m+V}O> zABCr4BLwwZ1Qqq}x{n8_!ztB>B)6+Q~D_j8;&z zlm7Q9{hJBDcqQNg4nh!q4Lvkoth>Z@S!wUuBo>tQt+?EB1&h?Bg-}qe<(Sx>Xf#Ve4 zAX`{`C&vF_uk>&}Nw(HzN1_T!z^E*~FSu+Sro+mrs2i%P`)7a)MUQuvxs z&bQW^qli7?4{6*A%b`9Ezf$<2j!aSHw<#yzGZ4X)jOhKVe~CpZpL1C{y5888-J;~|%cinOPbII)G~whCN~xCck@tS4CJ1u1{W}W*3Rrl-)gj`lc2{79oUwN@_YtWe9)<#1oq?FK z+d2*L!J`EQkUq-sg&^ zi2GZoRc@CqS;OsD-SWwAaY)H&k7HM|B)K`<>A-2=Ysz0X#NDgNYmJ5h8o_v1G?Mhq zaegh=E{SsA$(y!meNbEB+{xFDE0kYQvo>^k?HIguCB`6y;VEB#`X@pH{>b3|;docS zHXjam>W2uOSB71o0^Tivual4tHTA_3Ly<*W$lt!yu$l?^_QI8UB6~)1a}{v0)q_mg zMB+Jfq%T23A(1+w7| z1>IHkpYBGEtZ}i7rt$;}ZVh@UV*c;hvxvN;y3v_twE4{7Q`uwt*p_HBbWBZEh^(Tk z=8E{PBTCHUD;j)ta;VpRPv7Uqjr&5F_1DGnVRT3hGRu2Ky}K%VP72Ce)3sgB30PuGFp(OJZHNF< zNF}Ubhx-KLd1U;ZO+NcnO3#>%4Lj!jePD5U*SIuV3a57e> z1llgxfaORjSn^}>y^OG!xT~HDn=SfhHWdOHp8QY%ovHoW17H;QrA{AVb1FbT2XZZ4 zQ1Hf*QZf|2;@;LddR%65Si0H~WSY2>;Rtmh#s#)J#8%;br>7L-`r~1Mbd8(y%17Ol z==)71SHN1m&r3{ZTND_^f3gb#mPh=cdAc-lPClPWSAUT6H(qS{$#KvdFzvotyiN#> zO(Uby$evz?Be45ECYnyKqecDS0om%JRR6BOuj}_G7t}pIdh(V}9mvqe7s!WuS8MzU z5*a@8^U_4GXH`G4VhLZ9%#!D^JdVCy0EB=(KF3PU;=~9Bpn`&e-{}$YO$wCSz=wjS zbL7{b@H%CRziHyX4sj`3r^D9w03dfcB$#m7uD88;Ws}X%a==e+-Du&u0R9U$2vCoj z+OFsJ`_~TxIt`^yGVY~a$QyHjUkH_3PA7Gxj*zzLY!*S@994|J_L(cy=$hjWTTTT@ zQf9fDco$eIQVf=*pyq}=_=l#$!rKPRGxfreiJ{R zlHPbO%+Z!`_0nh6BlTtxeXDs>LFJK9v^$=K8_>fFK;W-{w}`gn8$tL64l*+`Ibih= zKnX}tqueC9-~pCVC+|u-yZb>$VAj?%UsmiyLAkqa)uDSS&&j!k#kN7A(YD z$6Qlk%~jip)`x4xYOa48?H*Dh12KW4-;5nc{=8>lI5vuG9^WV++s5lUS|j^*d}@pT z{@ve$vB}_1`*goluLdV}ri17a+B_J=^iCUdb5EbdbM=IJ` z*!`(rw^e7;A*@NXMG@CnIAy8k4X)Dxf!}Pe)0TUCS?>qo#-_%yyMAN1@&n4}XZz_I(O`rGUST4Enx>x4KG4zim?l_@8X9^4*{n|QghLTwI6 zOm*j9Y>K){du;~7?$0iG#zYX?h>nA1)c1asq&E&sZpH@fMh4Wyr{V(!M z_AGFkRB78iV=w#cJxcHts;3P6z+EXO&#+ULOKX*KB9A1gN8(am%f1&AZV-!K!~-&7 zj1*~+zv4PT5@|ZEGe{Sn#>MEka)uaqnvar8^TE*Ly`7>U;cv8MczH)VWI5D-&^u4~ z_2^({K?T%{a;3tX8K(m}{8=S!6lf{PKQlBid7HwF*{sXE+U3y~NC+q6+X_rlfBxfX zPn(dBHyenRZ7j_XLNy+YI5SzCtK-PouVNmDd8V+`tMKLwm6sDKm!27rmmjs)2}!nL zQXhV2Fm5jsNX;twG6QFr#FcCNCp6aww6y#5*Os#vqHfZknhI#**0@V>{*2~)p6OA; z9n-krLx*&mO=$*1@_T}HcXw9r{HB%|B{U26@7`r+{hc2cq-N%4BfjMTd@;z1RNzFW z*4d0D?&HAq7B|VoXH^2PHMg2;e0Z844J3GMBkQyV_yz7{8{2jL(?2sa6ZuRC25<8~ zTk}JgD_Oe>dfjV2Mrk8C;@0w5p!_$DGL!BuAOOQW+hmfc{~1TOA56cyt`((m=1$P{ zkRO=_7*S^rOslVH2JyrSKC;6}(>rMNwMy-FUpP7rK z$;i#68E*y2H5QMe18ySB{x_&0s*g~mFRZF1jo4iUITF0ZDFPeq4fkC`f7)23sQ6oo z2uF2aHPtA?2cZvxEII#zWvNN2o;)&JeIzeMM*$&u9Ot@nztTJ>*YasD-1KICy8ALM zfJ!lqb5RJI{KUx$C6ldRcGdBU{Sj#wC~>H@BsK`!qPTuN`*Tz~-g2Pc4doLKZN z2QDsd9YSHataQ{&e1mY_V2m`0ffF$Ygb>9kR)+bc;1@y4GE)3eBFCPIW-de~trao$ zE#H3Zg-FaX7jjsBk{omkDlKD9n%>yL%c+r!SCNq8iZ&_Jix<{W**Oa#$yJb$ayD?5 z1gfTFoJDvJ5$#PLWbdLW7K`3<0B@@mztE_A^O$+n*tBV1kam(NdZoNVf$<*m;}p<; z0JFLirte{DvbMx5V>H(UtElEC4D~S1Zick@7i$`F8*C7AHor+^X^d3JG21^>@?XQ< zI`tD$@u_4G=~d4b5kXti1h|B!=3RDx7zf~AeO$NEwfWgIty8}-yJOI(a3+$VR59ui z>B&`se#M%&_JVl77ri9yH=qk+Y9zfVdn{|7Q3WSFkU9Y31ok!U_NTn=Wk`%14rp zdx79{0q@{-rl6nI;b%ed36A7e0}AAj|2g6QGb%*B&owtz>6z8Azs(!%8At4hdpw4^yf)ZXvWPaIDd8djC72 z31}!V>lS~;OaM*2tl@=J>-8-2r;-m-l9CO^7#2`r-|6^K6PJ?s@yq-u&Y_S(%1+^l z>1p-S&of!W3TGspuag7bOiydB$y*7T7K@yCCmF6u*qCs&vGg54(<{#c6D11m_s^P< zv-Xv-rP?IJJ1E+V9hEP@<~d5~J8jKnh4f@JrE)g7_!kj&*Ro#sx+1b0mpj}t`sE&3 z4G^phEO3r8xBY%OMiq-d#%c_fmZYa#@|_6o>l2)*!o#m7=-$o;3%~4tAG`rk4x9WD^&733D*kME&jDhcf@N(T9S@0+n4B z3=a=ag-tE)jM+jNXVx-_MdQSVg)>f1M++cv_edz10O^J&W1NkmrG92&mkK0MMUln_QcHDcR zed1Zhvwm!iOx;$#0#Sw>gyCm73kX^}=ltuND(_Hnk7Vk`ds`MLsY}&sG@3h{7bZV-;*{o}JkwlRK7b8-bl;zTjLXhWnO{ySTTV=HYC2NmF{M`2;%9N$}4?Hh+74_QDZ@^`@hvjX$} zI}{ffQJ*o~S|_AzcuZYgUGjc*PSC&BozX%0KuPMl^N}lT70fZ3U=?4R=3i+}73Y&R zcEkL8^8{1|+X?V-(t<@h#2HsFtu-)P0BZjfd$?yCwSsp|bOC&P;0e4K-y*!my zE*FDpUs%`R0{KC6HbVP4b}I)*j+Q&#w>d)g%ta06;VOK@QTDu5QgWRn9zB{9aS+I( z(Fz_!-!1RUC8%at!Ad$4rDbVT#mZ|_!rMg-8`Z(OC;;4MNIt#i}1@ULhXAn)hz|zUJ0y@~}7QW1&e z`DaI*7LKT_a#zUtA~*9xu<|AXM9!7Cfj}*wXN8)-z)zkU>yCV6ujg2diaJUgbjRql zTR1>Yie)X9q8Mds*oSCkJq#)$qhbwDf{&l1Azh?=L=EE8?m<^q4IRPCiPn#Y2iN35 zR2HAWsC-~M)?GZ1j-6=oFn~*lhAMW_#O zo$72(lXoT3)Dj8*p}Xz{^Ou%yDl0G!Y(+V&^G8lE9{XWX2#-S`H0g=seSSHN;=!DN z{JL*IzZR-Qk0mbKV6|veJeD}t-+-Q?Nx^PMp)8A4A)NOOXP;H~TBi=KamS}hYTziH z4#U}uJ!Sq;*Ny_*+0E1=2jHZGW+{w2Htvx6^6wS(zMZ<9d!iTF>$=wIJ65Hi{NP4U z%g2w)4u~*w_j{)1EhE`Xm(uKXbr%Z1EmdE|wr6Yi$uO@9@EtyvXNLfZx;gT^Zxf%q zyUueSyDts9``x8%9_1jlE7N^_eIpz3VhB6(?sDo`{T-bXg1r4W@-+6*C1QaLB2vYp zS{f1;=1ofV&l`AMK=U~yH))IKLY&HLX$mTFb=_bEMG7H-^c?aA;{seW;To<_x_@rT zmhmo$zA5LF2+yorh`>nd}Zqd+9|VFB!i+=)Y#mifqQ-{NE^ z%NA#o$6H~{KgE$2ev?K(MzPURdyb{(+Bxlzm4cW_Fs4Fn6&0i22 zKfQe6aToex+!e8OXDaueume4Izp>7PbS*2i59%MYy*KL-MZ)S*1c zyDRP?bQ9em%kb%>;sRN<45s#|lOpamn?FdeE{hV|X1Xlx#VToiOs7;R%+Y`C|K-UG zM@BR>2)Y@a>^~>!vbg*ghPV4$*fVDa2j#my^bUp8i~jfWB3ca*2BVK&O#s-tuBRDQ zFG}d<>AE}kY>)|>J#qL$Ug&}8Qoft~=$%OZ*c~E^%U6ge{kfn;^hpp7mist5XpUJe zFn;M(#y_4>P}tWMDBPjydv&oC6jY3R?3;&%6i^P&1XWABvfsDp2M_X=(%zTRc-#P; z+XWVP0a?oVpAtlZHHCY!EBPbaRWm^N^)vg_!aMF_Vb){*lp8dPxgQrY4JVW?V|p zH%Ur{+z8i`JVQTfO`$ZeWi6c#r2!x72{zB@+)|QKL4USWmR1?Jrh)mcI1%g92ISIy zUCT2KM5WLjcHjsV-S_m$AaK{hq)Tt>aUvp6ZBVo%S`-mM&C9y5!Y z`A=QC{Mb&*4f{#WUzHpyd*WOEo(SI{PNtj_>1Y6T_>-_&3x}eBAEZb^U}5R7ZR+4V zEw}yQY#oQwH*M4TFC&bZ{jjKg9953}hEcg49$XlxQtZ<0PMH=e<(Gapl zW5?odA0ubUPFksfd4;O?zw5`uHB;T~?DQ& zJbknQseV~D299H^2ls*)qI93eQ7#xKi^ih_4{Gq3N5zKkrUD-kDS>Gw{B+{%>H7eLZ@ee=~tX@lh3io8n?`k-4cQt^^)P-y|lTFX3SV-Lx>1+;Pg}qPRmz@ ziJ7Ue5{D$!8dFD89aX1JN%~*DtTSrcGawwn($eKvlcbsbJK0=?H(%N`i9K6!v^Bpm zS?3{v)%0_48q_6qZF@grbDv#ZzLtW#;!2+==ddX)3QQYY;#yGlDy=4HTXQq${?%%d zl0}`PhN5y%tD6hzH0qElT#&yv77r=^r_ShPN2uY)^v>ve)Upj1P-jTuBY%rLYdUY} zc4FK$I)q?rUO4o(b8@2i5)B+R$(?eP$s+iXg3waFcnouUqu~qk zCfKnd_j$9YGG*o>UkV4Ser~5LQNe$8G=_x+&_nIv|0uWlAO$lUtf%LB6u8XIoFGGv zx@Zb%M;K-ElePiJ&uuaJ@NSH6^p!~eLEt_g*;nzmqRR%0%lna|hY{;^S2XrGh3OyW zoMxpHfXPu!Bf(n3PfT4G#azn6r()&Bp|(wb;BP1ZJ{k@1`0`{=Nl&7EJ>1H0>-&e) z_?#wEKc{OAI%iK}%JLlezZj*9)NdV9m_M?Habb(uc37ru6pPeOH&md#1BW zSZ*@lv{LR*>%+Qx(>nClt07pkdrq&9e{)^S`sGYE@_zI>I-}WF*sF^BgL$YRi>p4} zR8mEO%cpn5$akou`4 zYN zs1>J=<2FPNc!PA0SW!YK+jLL3Ag){=2yd}! zcknY6tw9Q@QBhVFt>i%B8XX;79`AuaAi7*-m))}Q5uRonBQigqc#l6vjc%EJ!UHS) z@X?>o8F@+1tpoEO*eN6cf9Fa1TD?_qgOE5F3~_5YR^Htbdm|TYfCqQ$CofjD^I9ze zsWt5Lid4i+f;;EqKLsh(Z84?!w0iFY{%|R7QsZCX2!c`#_X*w=Ml`tKbyN9f2Yo7v zp}3%{Mn-t+&~u{3&PTzg^_FGT7XIBdXD+8%M7cps3Eq?Q!N4fEQvqB1AmLIYb#DN7aIY^f`(3YlSo%XDjBZQClAulPpO4=7msG`C zTi|>KAj~UByeDz{ys63+xaf;Cz0s!kCZ;fJUvWVKXO}apRx<3WmOG4t6bB1u*I4Y^ znTNtkLSgW^CiHGP`~A6aX=td>!cmE9i*z?iyv2WN7k(M)5TFO>XRg@roY#GOAeJu` zN;5NzfG}lfw4WM5sHHRVW@D?EHVVW8Ge5|+cg*!Xvn!Nre^Y@#1i32tukc~`)KHyQ zo^(zb-HR;+aTZ4FTujiwr^5s90VvVa(NthTlj!4+OL_JWU{++(H$7SVQu#Mt?*1|| z9aX6&*F;>86CNwVe)HnyEtiMVb0)ri#XDzz*>WFr7UVmH6DP`ZRknod30oN9`pC6z zl?JoHnfre++`aA$h1^(2dK z8})Q?7vCL{Kz47LPWDX}IZ{ZiHx&J2amz&fJQ*spE@Bn=6b|xk;4ck0$(qn(x9Ks5 zFq8P$!7D^4zN_zDznhE>wo*(QkMsQguMqUd_3tv`doQ(Yu3w$xq0IF|q_|Xv8NGUH z0Jg7i#!YZtQ;MadM5kQcJ}-ZBhk1PP<|T zpQgw+PnEHPckKSzx}`g5>)B~?oEY_+!P*Fu3&tL7InBUJ?oTkIU!-ZDGac^mrNXAw zX&R5IcGM^7TBResC4vQC+LxMz;Ywq7pHX4U3ZmudB$K{g9RAy)jgynB*v%-fd>UyK ztO*(@7GW6$16A}JyceHJ{3hE{n$NTtw>Z-qe|9FAUw(+!x;DAoH9(7?v8&X@9$Cc8 zXj<9BO*|Fk%m=TZf{eP(6n^=W_#w(G%in|BB<%gPeG-l?QNGS1IVGF$i9q-?3TjoUN$V1>GekFFth*iE?DcS1D4b_5p`3+ER* zVs4UXc)nPVSKEQd@>|5OUc^&Za8g7Sh6BgonFtp0mJ-pqA|_N~9W)?zo-vjkh*-Bs ztGly}2|*r>x%xb$kLjwBQ)({rhH^CSV09d;9w+{ePKSoR}Zc`+V14uBnY+AT9ZGElG@n;o2X?@~5ma~F(j zaZd(B4jk0fnJdyvG*742=K*<1$cK8rt{2dK4F99YDI}>~{VlPW`!n4wboyiyqO%y^ zljl+;0Q>Bl$U7Lqh0EusrpgLDGg2{rA4?*(XC%vx9|Iy!L?>_L!Ys32z*%|gwQ*}X z<}-n0Ienh%9U5pLek|PebCO9g&l>>jsZ1JR^hJ1^f76B*_-pg8H!|tj)&$u?yjieL zM9lbe?7*kI#6DP0Y*lOD!p@*U+SGaZr5l;A3X9q;e z&>`^LQA|vXaPVz<@Iq+~>gVo#?V5E*fDW?jhdk;s=0%_PA(N6VcuBe}htj66I5VE_ z@`2AI*1YaH=^7%JJdF%Qked{NOH0fALI3`=x(U@2fyQ0-5!KXFbJfOK6HK9c`@sej zIkTT`icCg%Vv`l{nR3F*-g3E^%-<@Cyr4>uE+~YqkKqvDiQPYh27RZ69-Rk1Udf9s zz!35k?~Z94yu|J%8w#PBklW^!3^2+<>1`R>wsnyS=J1&YYUOsb{^+g^{DY-IM%M zT23EDt&?JV4Tga(FEZ_t>c5US{_T_UW&1mUEs^1@?#0{?z(!unrt>ekYE&U(cw{q! zCMMe;;{-(e)}cK{#Y)e_^Ci?1C)ZowWR;s5tpj$-XUW5^s^61Q4O6n4^j06TqtC~k zKnLhyhMXf@j*mL6PUPbae{XzuSeDl^YOdGo*EvKFToC=EMicLS+3a?ZSKlgNgP8w>EcV|5n$IK>dWq3zOuybd?1%*$M5CBK7Z^F)n+2FG zp^@^&)ZXM?cSJWJ&70Ka>pl0|^}K3EJU78UvYIjz_5^)1A1f=X?QX;fXA4O>uCi&; zUko;2cr0x^JdIdSnG9g^QQ`_-FQbn}(U-%Pn+x~0paMMwN$wdK2977<(Zs#?zmIt$ z7qjtqbm?}*0l2!0sdN>i>hG&kWJ7tsOsS%C{X5pBzR)v9$}4q%fTTYx5(-b>7kgJa z%vlCrOU~s?Pb5ZP-3Md(gd9$&UvpNg3ve4uz^Iz8>||(X2%#hM2vzWf3sdH1l*7b7 zvGFwY$Mb}}**<*H%h)(IZ!z9el)Dbrv)@>bn#Jyuo<**r^aVnR=h_|Kuy9)qE&yk*8l8w=?7MzR^1uFsx4YYRBfNad zN~xBuX7#D3_6{R}aJQ-%bGgIkbRB~G*;HrY%@&u#<*GI~NI4NH95DbNb6S>{>zSFd zkNdR!`?O2nh)|@=m`G33o6h%94+p(mPoDb)3lUKDdoH=F4wFASD70j~8~fk0wM95v z4^MZdogL{_si0 z(gm=lM!Qvg6`m`La{OiEOhe?8aCwW9D2Hd~qiFkBVBXhNz~`e9W=+hNmRo z)3aU!Z;h&b*aYW<@+(uqqnV0_m!L7cY0|k&Z0?DBs6ARiVKw6zF1HcUtBmpDZOv<;q7T9KglS#npXsF{RqgY=8y?;URB&C9v21XOFoOu&e0+s3I!WJbmog z)vhI#+&bvmedK8#&k=o8?PAv+Vgrh_=s|kasYKnUl-+Ju&xK9C9CQ9kT!#bG=Dw2k zP&M1F&#Ofy+l)(F!bn~D6M)EQr~#*Y0k9U zhL+$&B!JMp^wq@}K0ZDXSrbK=I~rhjvzB-|P549h*x^!@x`qI{#G8d)XjN-~vn~bM zQhbbqT|2k<#+lX!Hpq9QXugYIhg(+2Uxv$f>*Y`di6NY*WGuV}d5Mnlcyb%l_5S zqi=#P*l!O#FeaPKs?mOqfns-+TBuww&#wORy(m8qkH_Y7UnN8LeS0_dzY=<=Nneyn zu*|hnW0@pIg?`)_FMfR-Q!VLpaI3 zcrKr_D@=T#U|E%a`UN2F_DoN1xMeu9e1zyrSa5I~2Ly0K$#s zpvhNb^+ASbHC~)-+#B8OrNJ!H2>p3v1@DST^{@!`-gEjvI(Tw6Q3%It@A7WCF{WA8 z5XRXV>sTNsYk+^Hbd;0E_m1f!MO&Ezn)pzHV;v>5$ej>!zl}-vg#q+J#x&)NqrIDmU zbki}Shm1#I1w6_o%L@}Ni@5e4aq8syx8G@gluR_jWTq?A@_OfM1M-dIYS|=1Sh)1w zk6b@7wh$?w1xB;EpTrnq5-Y?_T;Tl@PP6uew91^(-Vlr(V7AsDt5xaanO6&zT5L#+ z@WZhu$8GeWRrKoab&{Iz#b^ET!4Dg3&u;ARIbuDMgk{U2wEt4d1kVy1-nupmhy=T_ zIpp_E_x<1F_ij%Qw{lIU$0J`T1yl~Qx*9TXp)>9>!hci`r=&aoEbO?5hIDKs?ilL& z9xF_aew?EKy%Rj%-bA-!5~{ScP|M+I2HbQ#K_EIG9WtBDTtifHAPTS9K)0~#4ygg( zzxYTa!YA#{+;a&I+ek~SPB|U}e;K|fHy@#^>T-LuL(B_R+=Wv$W#lNTt?#;(&b*YT z9GsBD5qo(fmb0dnb7YfevtY|ztwt6={z2sfXY&=T_=D`ZEG^A^?*PiX4+Rkie>I}! zj+HP+e9t-(OOBL%rmQ$jBkAtpUg|b@{uaQ>-t%hBPtC2$RTQO!T--lyJ%Aa1qE%dc zhkitl*O|<*i0_t1OF$~+jWI>YArq^Z3%bCr9jie#n}C_gGMo5PKe)sZARdj zPU`N6xT@7G9stAT$I|}oW61KdSN%lqo<>eYuh>gnkvAgYl$r)$LI1tU;s%h~O(q^z zM@2&vCyUAS>ptrVW8F;vqf5N%7NgYKr9!$Y=&}OjJ*(IU{zsiPc)L{^w9LqI_ zoe}uNr1hS&?Ul?@OSF+ifz+Y-8^KB}5bFIqlnk`dhHqvm`cfesu_NM^f}U#BCj%Xm zocORR9E9O|-`tHDCJ>5}jg|8t>3J;n;>H-$<2>H#{hbt_cHW&48K^S#C+CvEnvhaP z=9LbvS-LP{lTRZfQ_~toypiPc_ew2zeyvY+CMg~?5^Sng8pcr9QF+V;S57(XW}ogw9XxP~9(gvhFtq!V4O# zkNgHGzR^Wv?x%X9DSrR zUpi2giy|u@P|1{R2`6*9RQ_9@R3$QPD=J$ols%^U$_o}0oMv8s5iIY7SjUdAZp&!h zFn3H{wXHonra!lj{Gn@LDVaIW`^IvguQ=B@=Wl*WVbNeh$(Y;BUO|>2OYFI;hwfQ! zbfNK)WM(g85hq`rFyxUz=ZR6e%X3S9R{{t(+u#afR28|fWJh82eLgH57C{T)VF zEK+y@L3^I8*2h@JJM$MFnK>S#&bli#m!jS39wXk<0S8XAiw@s9$5eiII{bG2Y|E?d z^1H<5w|h`&{LAv{sC>T<97UeE$ylD{%x5bUUv4t@zwmh!A<4mZtdjqrWsJ{lrrn~^ z%(30oMZH5&{X+9*HHI-+hg_Sc&8Oq1CA#bT^^YuV`4I1}GP$2kKdOcb-HV-@I&PGl zdm8-({LqcHMMZ4tg*HGctjDoQhgIoQg-i0AlJSe`;y=AiHPM-qhkU2Ro0=?U;zFXM zPtKhm>K1d=l|S?jRPfwaRqbaGucn6jQuA1t^8qSP*>y6na(+N^-PHbqfo+-i(WnWB zp+z_0y-YGGG^xrwp!uDiF2*AH&_HG66TiNRqoo$xU__(f)_#t#H%;)a6s^SzGbzt1 zw0Y8lY6}y5JE?=vS>RX<`XXk?&ZcyueIpIC$lLSheI)7AWhUySVX6eiQz7uXt1JEi zTn^!m{Q4|=GnXjik@ZpZlxVJpL%#*%AZg6&}> zRpRc-D_`}~Fbh0>oJOh30MU@Si?aiyR16j}wC#6a=*g%P;!V`?&(4rcVdlkaN&C)2 z&F{WR8zls_Omj_S#az?c1&5&jSBR_Tbj5HR)roXt(X%hJG(O}YI_{U(^86&0yTA?x z_#$lhCt7Celt+KYg`c>}J3GJ0UQ|;oweL&+(Fpffjy{rP2O%!KeoX^8zZNN-;-RUp z)H(0?P*cyVySg{V{GSf?1#3s3h>TI87%*_(cip`wzoWQ+cfRSOP^B9#GPWI}%vj$=9Qb8S zvNCMfzIn7S{WWtn|2hQihou7TyLaDsp=ef6Ko>zzl<$;%q3xw-fCSr38lUf&`|a>g z^Wx<$E%CS`!h{R0Iuz}$iUn(uvEBGX7^oF%w~YVmAodcixYwC=$U(h}b|5L*!*Rtw zhxJaTMgL5?jJulwv7nobv4E%a(T@i&HWD07;;*53s^TtKB)x>BSFjdt2u5S=#o!603gVzM_$9LAC)+2aL<05>c5< zKE#b?Jt{?yHh>$@3Odzaen&i4{g>6ym=V(<;g1m%C9!3dTSO73WRcC3BDgO(IJFKP zPy;>n%q~8&^b>VaNCpN(MsuCjQsrK+>th`sHBG66d;iF9Y%RUn1XeO}_zU{R${r<0 z*F*FNJ~9Hltk9vTn^V1PAW~lP9$@SS0vB~zdQ7CfP0WGbl|wD~09P&fm*NMZwuhl! z$gAYg5S@qnIbfanp>-rhw~2Pj)c#U?NFQi^*X6VU`gk}acHbb@UOC!ZxgM3B9*u#tAAI0 znkpBW612%T zQF^C=_R>0ID_>P)_cxg>JE>^pL>%8qI{(hDLf5!IE0l|`?zr8~np+OKKRUP@SyARIX_>D5JME^7%QTR*s5yIQ zS`^2WMsiumkSER*Q~J6+_B=n10G#{J<0MXOpo9_7%)7gy1Po4lm~wlOV$K2vdxQ<; zy4YsV`;(1^z}@9kyF~F(?YT2iiaeIIwydMvBp=a+AScOvyQ_CE(m}q)J%^Kpo0yHA zNyabVtkHE!ixDtb@Xt#?$YlQyPhT0=^!NTvBT^zFFjA3}PHB*CkVZzgG^1l6lG2?U z-Hp->(%lWx-8o|S{Qh3|pGSMn=Q`(H?+j$&0rbg%?)9*10Q(ZY$@0?rU7U}VSBK$nCoPp``xORWd>7h|1^EvfYexZ>VbQ_@x8 zsMsxKFY>sJtZ6jXn92a|ma+^v9?)6}Qz~Dag$dtauDf`-0A$C)EVYElJ^hsyuP;(+ zc4-|chh>kQs52{=RMuU>xK3MdS1%0V*M@6%|BxVeZURU6;_q*_@Po?dgX+C`V*i1s zic0jNGTd@ZJ^YN^f7hi8$R2yeD=Qi^g?Bd$K1tku_a}Yv)2?RH!=Z=nDb9t+iaAe) zkDH|&x6f*{Qec*4fv~&V{tF?MOyvEr@B-*zKIhk+$^fBsTDubUU&R3;Dvx3H3AH0jbTJ)X~HMY`#7@Y1-)z^v?aMxnWes%1oG~30OUp}6jq*wyVm<_87~_;+?iO3+L{&^%bA)`t zZw39Hnp=mmKIF7XzGe_iI+C| z*gBhlM~5{2oj7JCJ?o(nQ8)Pmm5|@#T@vq0pY2TdRZs1BBnM^|7GEiR{$~{*k-Igw z2wr={TV~xvXj~adKLYxdu^cl8(`uS@ob524f9_W)T*0CBdX~?ICKJE3`Vqqw$76Bq z3qQuA&r8R+UX5zkPgXvrsAU(sbXmzDo~O7dpTX$NC(k~xCdIp?yUGI!Fy88^r zq?8Z+LyU6RGOun7@?F0}$Y=~-Nlo4l%sQ@qslv1GhwgbDc3U>E@=Z3b8#rZ^@9*fG z@hdUAwCL=B4CY?VnR)p3oN=14iQ-mV(zT?4^`!%r^1lZBwSDWog2gc^kKgSSH2&xM zZ2nq-8|a)liny!TB|O_NRX35Rw!N0A=|As!1A>G-Y&a#gb|S~NJ&ttbbOt0KF*08Z z$6K*;zaKqPysnk2FVn^>mzR2|nz)?CNG~PxX*x{+y|o~(moCgZ%IXsJ~sO|079nxoUs=0xgasI4I&O%c?7~5V$j$D-8LSq3Y`DuA&CEK@J zF)hv$!zPfmVLU2H5LGH#sEAhG|Hdi#-#A@f*#3Oz^32N47L1MD*uCYw{O5MT{?{pz zOeN&uC}qw!E!I}jd(I<_?xBghJ;a@olRo3WkOcRn$GjI0nOD`5VPc}81Wd;VhhjN| zsqIiuwOtsoLowliEv`Gm?I%B6m}fgU5%-xJtD^?IM{*`e>1Gm7QCy{-T0AO3@aSEz zK2gVo?)S2aQsAB^=E+wNiYC%0xfCH-b}-3x0Y&S+M^nRv<&21ns^`Z{DX8?BsZL3$ zo21paJ~ewt#&aavmtb1FQmRm~IbRB33)UI`V5ussBWxY>F|}G`u0=nZ@s<|iA>HHqkr7uoyyUC&X+eK-l5god2?YnfUHQ=)udA+p=irW`E~|0u zuUSK#PCqXcC0j#X3_xM|yw<9@1g+a2XMGH87lfT#mJ?-b{tmpG01ddJ9AIa%P*o@H zG|_bI%w>@xQOqD5Q?@2AX6kBlaJ{tftX92!r0q5!2IxjmBr~xwvxb@wL@mJxI$}nJ zQG7&^OawLPoVm&^pjbulfx3bX@vE3bZY7fH;l0$m80Ct!yy5k0jIRSl9?}A}_~WyP z(6k%;r*V9WA6YbTKG)Pe7?&F#|RM+v^}WL4iG(sowDCq7Ps$NckWB- z(xWK4`UwHuBu7VVZ3Vwk1>XDN6kbc9QsMOr|1y5$2rUrr?YPu3iHrUupAJzbKJ2C4Rn%m*j~?E***KSA(Hu_pXq(_| zy32j!a9QO+=IcMSj-P7Qk5=~#OTWYt+|4v_ZZ>O-WG#)z9WHW@Q;Xa6DPp_!#}Kv& z*~8-9FTZinw|lPw^91^jAoIDF9eR|}oDi^=^2Q=__x-|4T3mvN(NFMv^zA}};a*V1 zj7tj8p}m>EcN8a4v|0WFmRW(eI$a}cO%r=*i!{I~qnmvGe-=P7qPQa92E(K5@nBaJ ze(!o-<^H`g7%BIElbZc+Qn^4D*fU;PA(#aQ;HPT^gyRY91dLo#;&H2=Az9T#?RQe| z)8x4-!_ZOdwuauikOP4D9LMIw6yDv+M=*ww7a`&;_;;S|Q2OT{MWnL?Xs1YD1r^h- z9MUHryaA+xq&f$)Lub*!9$DVpJ zN$S5JQO2OXqwmFOfskXEz8cB$GIO24`6L6ps&EW#w)%v*euHH>Fr}cH9FY}0{jG&p z0mA9I0&TgoWY2de8y)TTJL9XUdqI+=FpWE(>_nxx|7yJ@pzzcV2r0eSt0 z^6!c4@4`H!Pf1w0CICR)UGBh*(7(TshpxFLH0^1O{=8kE5nHoBx4xaWzj#SbxD|3h zY+K6Kfe~=)I?QD?Yvifsi+1y(A@3@DaDgmT8?Ey<8%jWN&7=3br?Srp$NOen&qfy; z;YWbE(r6!%v#1UCYe2_b8*HX>HC}Xe;=JMp+e79TbK<;*mfJ7qulOx{lvQNYKkd!F z86F1Ip84}xL?sF!Lyk$?Zx+AtiQIMKx8+Hn67k%yS+75YhZ?F&+|~d(4#SCqMk3l+ z($#@;y`s45)j?wv?+WAX3-9e@6tkMx$&*OHjtq9q_fui9b}gH5S(Q5~o8R4=S5fea zLC;ACs8}4nhp>Mk6*=e!Y*4Bf9i#TX%xti(2o?l*jShY9OW6c@slNOElIWRymU%O} z1#jO8YuZsM>4PxGJCObcwflI__v(v2Px6qOH;VSm?t1j9`co{E(h*{73EU9{;i_7> zjJ~r970G;ixFFoAml@)z#vYOo4zF?d0n+dErd^7mLR(~Ji9+U-5dF8)7^4yuD(L2Z zB*I24_pqIK*3^Q|I(1V4t#GB_rPZ;*(cQXF(YtC4CUK{xGRgXV^ls#Lz$lZ4Ck%n` zG6TC$8_u#MC!&RyJ_Uh>or}KtsV|_aP=C`ePeF{hFiThFeWK1%0K?j}O(z*sJ5!T_ zfL2d!p4%MnJG2)UtkPJ|YOM1^|~T-FJvDR=Y8NP?Y~;^{5D+z0Wq6ZtK}kLQ68l;zI;I%NT0w8J;y2iIb&{`b9Zm8r zMXtd3JMt5fu)LZpX2D|oAd5If?@&;(o!e2Cpjm}XU65CyD|zC~(XF$I6}Doy=GJ&p z^%^x12p23*}-OWv@O!`=0u;2tavZ;Xmo?>fX>3_yVPcbV|NN zG?*VJno*5l_UMSdFszVDm`RHAB9y#i$~@fzhprP@{gU+hO<4cIRUhGkjKp4mK>;-I zLq>$!4r=Sbwwc zN$)PycN^s0{0~X!l3_n~?`=ixavZJ6JYAK|`e+WQBCNASOFFB<`wDoRMoV412bU;O zx=h=VFviEfQFe$l_gQpOrbIfX?wDQ}==RuK&9Y1dwucS2GDKWAbpM%aDAJIP;ef%^*^+ZsLL>Xpj=rk5{=F;luoF=JjSZd2vj@hOx zjCjoYWJ2y{k6bR1R4(rQPFps%Rlu;RxmBObk)^@*vfvE*XZLBNH8l#sC${41+TK@o z8p>wkt`MJsYJl>gEW>Ah0Se}8%Rq?mAMz!@vdet)vrWUo{Am~+l5L=<5=Pb5+UhxR zG*8cbfy9EEn`D7{jNnINJLaY=;(!z(xiLa0_a}pO)XG`peAa=NX2j{XF%Di$ZwI0V z`3*i%pO`n-O2OZnLugsANs1&sxd+qm2mgg}5AcX*y4d?X_uXgo4iU|P6r4Z1o|^Ui zVA@g`ex0X9b@v_^Nw+|DC}#=i3kA*R#5f2|^Jj9XlaexBMaaF4DES00pAj_RQ!JoY zy8x|F#UKhI4!MN_Rz_u%l;e;Q>WP6Y6xxWaCWjbii2?PUCj*^}KP~sdVd2~SD=N_< zKKZP_eZmI#4}-RMUB*3QyLd=PlW_y6vCaiH44gA71A2XSNIIB+E6d)GJJ}O|cL96i zo`oDw`daZ735nNC5^sq)L(0P?WC}IG{&LP1$kNjloS!Tj;jtJaf&lIZ5o8}uN4dTX zyrj8W-Ss>?*o~(-QVLq)*GJ~(2D~2fd8rs-g~3xsInjU%xdqN_zo{#PcOT09w2uG0 z?z`Vw0z*(b`ABUEXGb`(XS}~CJqZ3SE-f!CtAGFXJVz=&%CIP}Y`8>E)lV0#sG|1b!INE?ne5uzYt&dTiS0732Hyv=)(sc}j%ugDTogEu^;6aP zQG<0+O1O`9?%;`~GU={!Jl<-G7cV($mM;|>SncUORiL@cQR*XGyLIsI5Xpuwn!bA| zMd-pJSVf53K_f(r2*yH5dO$^F|LwksKy5>ru`Pi*u{0r-`Mdd6uKA@P0xRIDjs{s? zaQN%OVZICF%FjyTeF>{26`9GeYafAnzFpiTw=#bN7kvS+nzr@Q1VzaLjcxVjDBAu5 z%>Bj6)$Lqt%+4WZ!sk1GzBjSlhM^%TSWX~8E$_iBXeYZN{`}MjSkpzH^;vttU3Qc? zo)X5{o6IX(VIv(a(Ln8&q>oE4niEQ!J_r3Ac+Usxzg8u!6k=s)s|XxUaP}!?0T5qOOo^bTlAj|x(@rq=Rr8J#% zV2~uGwg1=`IFGC1{0R8#d6WQ)(6OaNE-Hmk<5_+v$hM;k8eac|P8jg10c# zYD}?Z6NTi+k5{<5Q_IO*v@RX9 z#k8T`q#vfX*(S?%_Nuz!!K&bC%VoQEr2)kQ0#I*z_y?$upr{zTX{(=p41 z#kXRGckT?r9j}a^S>A;RWy@>T#T1mq#D>F`u<3p(6zjzHz^=!nY?Zpst0G z9_EoucH0e*WS8x5f%>kDumx0iNMcBo8NN+ZFoX&tz47$VE7BI;9;aE8NE{IolU}JY z2neZRme>yv3c`_0Cc*e_ukqPIvNH*T(zbHp>o{m1ui~?k`xe7ijgh6MI{fS6!S8%w z#DSVR3^Fj8(sY{54XJ1px%eRZNx6V=`?Km`FLfe838C(U8IE}^OBhB9r&*fD1Q&kr zXI<#fcw@qpnM}+k@4|JK^UYvqk|bx>A@Z+o9G?XmqtE-+xL1}uItKA&t`vd-^RN8d z`Wpsy`8(*ZJZNLJQI1>!!UICzVXGM{%B02Tg>;2_85QDPK{WZH0$VNtwvPSs14C&q zbmB(#s-9TZE?CkH@4ATbPF9-x=F!3Ap;6j|#bepSyWzYOh_MyBL9CuJzzMoGh)|Yv zZe=4X;1$M`dRiFd9uZ*4{czHJI@*3c`&B`pVy~fe``cQP?!ET(i_0r`lU4GJ(U^_D z?P+U3x%B83y|B$-LQ`1VYSZg&KSynEV<7|-FPkEb?gr>Fk`M|4P` zbFNiePTt9w*UuVs4wP13U@luiv7q-3V@b*JX|vB41O z4<9j+SO4b#pB35qTGgUpYhp2Dvp`lJ$kZMIhx(!|);14m5kl()h_1q^<;G-SI}BPF z)^iH@C=$Zn%5d?WG6mQ~M6!Kt-jpko=R%tBahjcM3lO_kW501&>K$hNIgWjj(X3I9 zFWGdaU-kW9o>21jI>+i6{ggT{4*tzYvqqCrV}Db$YnQpL+X%H(6iXuIV$5M+(+Am~ z<13+)wCPve!g0eID|2mMf{ms5pC;`~hc0!53Y6FF;^KWVTBB0U|h1*Q;&2(4kmJ7>&%{g}xS8LNq2f8~oEY$Ye-A zgFC*VGy~Xc`8sl<`1c1p7H=?LMXO+VES2RzvUg0?vLC{}Z{b}<+p@!76XtOlilu14 z12p4o0Ul+~({(V-C4>@2M)ZhGlE&~ux8Ne_XO*u7da1OncyJxHA4JvL91*U6h-RwgsXNW zF&TUz9{gv@CZ+aEARtH4BOq-0?tCi%_*74FcDTOsO#Urq%oz;1bJ&}o?5qJpU{lD| zvzm3)TQTBD<&EK&{?zW28lZrr8A)NTP9Bz$2>gU$hp}<`e4D!>uuAb3Nrouyjx}Pv z-*2yc=i>z+?LNcF6PKBbo_9Uj9=!4f%%?`}j-F#0%iNC=UXfTSWZ5a^G=FX>2<|+} z!ScF+ja+RGJmbl`O{f!Zp-nRJN3fg`!tPoVzV1YVV<=yR6(k#yaZE7o6W=RRf`h9n z3F?z8#0`=rXgZ(R4c5N@dQZ=`ttYZDIW=c+O8xG{yxln4{bfOjr7D5&0HLn=Af4`> z`7UiNDehK6VT`K^cW>^mCFmilurp(Q)Q`nwn%{jwPpfK%-FG~WBGVn7>V!ybq8(or zX^hmkZQoc`v(LM(Riei6zhEmIdq2?!C#6iK%{(%F?~mn=PJuZIHuNpyXvM4Q`Ie|> zeE+-B@4EE%m%#c80;EvKm%5bf3&!ImwEa&_Ao1@yCh3x6kvj}nM@}l4@Hd#~_2YZK z1;cME02_1D<81}H2h9Q%B?Jaqf#wR&JfQ^yxlkht3?3WOgEF!u9G~w$4if>!7?(o( zhBIPdO}FwxqpC5>P?E<}hA|r?$jv1LQR{sq3|<&g2iFpM2klb4JdetA&to|;J|&w92t%Lp!1h`dVYf}TB4-?>g~-f~7P zL%8J(k}2QF8nnAi5po609HfJiZHea0rab_Oae7RZ`{+0Rj$a_GUT454Xf(rRUftE1 zH)H*9y6jxwFe3;#UiH#gbNb=*)y?(fZ@NM`!(_eL*yM6g$IPR;oDTJPh5Q3Wx`EfV zB^3>(zH-TD-Yzd6)5Zg!f}UVqiz&)%Q*Ms}|QK`h^Vm zE8ATaX{}YuAe}y*hDOMF+#q@6)y>~vjt7Pk;il<+2J1e>e>_O8A|`+mBh-F3@?r?j zGfkzy)b4vYH3F$Fdq%%emZ#U^jHq1;ux+4iKKbU-!8b#7UvreEE|lscVVHNyItf$$GKn2UXI%;;)Kh?7ADYF2f+a23 zSyoC*yAdgzDdx6!WoVQsswOU?Y>m2cT;{oUvY1$zit3IhUiV?#B5jH;ZsdeMY>+~9 zie^ixr%FWL=lvHddJQ{#`&{rRX}?jG~hDY~@Y%U5@Q zR+ZjI2=y1oQLGRY)6B((h#19{Eo``o&(*G5Cm44L?sjiAEF07{_@P%q)i2eu7`Kz| z#nR$=gq^L0)i$Ot8s?8>Z5KieM1J`4DE6skj6qGMX2Pew*3!uP?4iG}25%(!Z0xq1DN z=rqKhmlC~FT@uP}8)%vIAus~=70m0rA3O9ssu9g^8*CWdFZ6dhc~=ZHaM!Jv^G5b^ zDq6n5h^aVo?~v?OQnFe$;uMRg#(9jMAtt-;z!YK6nd3OeeTwJlv)-IVEywioMojPC zaeCbj`h}P}Dp#3jF+q(v9M-eO)A|7Z+B~_cDRC7C$k(3vM6fpNBoS!&`>SRyz&sda zKN0T}`mMa`@^+%K$NyLGM2!0<4}K4m4jONhB_mmimyj#bSuyA)*6H21^>z_HzCJW0 z1VH>VsS}<;Cxn=0G4u4Ho0JV5`}@nsKyZF~7&YE=fua=8%&2-|z`QW%+yx-$i&_l{ z&bm_T8uYpvcd?4~1HS0vI8H<28;r6JcnBLr2smq)n;CLMrs&^qhRt(iZb?GuIPTNr zuf*m&IzT`azXIgxp-fhjqS31>fkLSm%*xA_jWjzW2D8+#iXFliDDCt#D&-=3vDS*R zmSQHm?1Qdf$ukh_FAVrBPN3>?a819hi2uQ`rVIUCF0nOG4I)iqH5A{21 z21@w51D{KNOsHbMMPjPBugW@Yas!4Kkc>jlxY{q(PFj?2nkO;JD8?R;Yy1_)ONt;L*i#}o0U=dZ% z`1}U#elN`LaeddgAAkd|=`Z_5CV8ijlVOyElT?|WPXU;31r-z&`u;iBU~Q)lZK;T~ z>Qm@F7=8*De!brm1*EvY?s+LsEByV;h9_|ETaR7Ab;rXv>M>f!!&%;MCc_L&?pmQz z_mL#{rs(tL#lN(YQirzt9hOyb^==pK$UQqAS@Qa659Z?G#g70y0AVzn@{+yWYG_bz zBpzxy=E9C22raMP?yPVWg%If*;L*j_3Z=vS&T>FB9{nusl}VI{o7RsNrp&Klhu{74 zmVyo)?R#6J16&P20s^Shjx0B|;V#;zvDdj30;Q?X8D?4H$p*MJHr)C@rHW?M=ls>G zH0D6eigOJ_oom$eaeVpT5MNTZG@&^P10|8`XgN0HJ_1ne1~n?HU(mG;Z(b$fuMfP> z?Av#d5{@?BNkI%WDCb$9N zv^!ZX;^<#duFm9cy~nE+D$E*0DH?uC6VWQgkBmY$G1|A948lOq-kQ4?M(V6Ie;*A_ zs|jPZ4b6VYA?15YIfUGh19`AIwmKkmC-oqqStmJ6g@a^`HtIId^D{;fO3=KGNIijm zlqIP?@wN82`Da*#?CH`VRp}aM;bslYTpRuu5pK4K*rLx*4lCQA*G;J&=4ph>bQ4#P z=~1EE1K-R=>nYcR=YwZa*;+6MF^0(!#Dn1*Y|k66JlyWrJ#h0@6?Ylj9f}dLHBFzd zeLOS3FQz>hg3OJZmqNgppraaE;SqMf>E9wdlk|>UuG9JQ9f0!=|(TC(y!gFg4=#g4Ix8EI{KZl+6c>yaAP$obvQ# z>QLtt{Y|OlH|NREcp|sYaqIb)R65$&3S;qup=E~0aiI(J@Jkz`0D;mg;_8bnBW8^z zDmQIli?r7O;~8m{c?JeVf7fR~Mr&0JUzb>AgUHiGbGp-7JtMd08%kJAF~^}XJYUh~G$D1w6sk;FdUML&fA(s|LBxu+j(#TAjIxgYDXbi8cPF3`kxy#)^e<`tAB$@Qy@}6Do@QTGGxY%W z(Nfeh)#AF2=VZs`-KAoHROpElMF6&|RHs(rFNG*zAuBfE$J#<_WlX{|dl#C5nm zlCFv9tr@t{aYM$n(RRpAHW<75A=~iq9u{Ikfhx#kS=>D2?)$oKpI|7XB7wrX=;MCB zVC1B{8^$++q5BNp8FR2lCeQagA$%bP#K^g_sx7D zdq#OM(8vt%dRn-g5*>^yYVlIHE}=1uFNvrr{fU69AoDa&2=}UEXASZE%Hzy(e+C^pC1H~E$-E7NjH5Wz4WsL|X-Z2cdW2q0!eQcx!x&++a`zo@ zt9vi0GWsF|P50ghp zsXp^T^R@4`!fnpmFQG5C4w1<1tPpYu>VMDX7o%43Y*Cnl!8E+{zGc6Hue{rKy?fyZ z2EszQdBgyri-BJ^r!j(cYqu(Gk{*f9SKrPmQD{$#>CuES^L(z3z0w*I_@f57Q

V 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

h4yybvc}_4nl>48F%MDtUc*s(p(Si4 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ⅅ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

j>VlK0 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

|iT&v)T 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

_AvzBzHukY>clpn-C`yQSo<9o8&TN{DueGZho z+}Yi=A0JyAeYn^Qy!EO>x+WY4xcWGoK=gWLOid28{LTx`nGZWGZ+}lOI zp9w?DPwx|B8d>GjL}UXQuR9)QF-znk28e=pPFa!`*H$-u_A!%?^8Y5GzWUh($trw= z%j{id)=KYa!=Yb5dmP?V@J#aQnpERQzM-MNjz|~d1!@4!u9bCgW};r1m2>$x^A-P^ z{m^iy3%uJDS&Kq0S?m$oYN;{Kxf1bUv?8@~!Mew_+Ybw8>Q+;Naby>ZNz&U;UZk^Lv$Yb1nXBQ0#1p2vO7U z*&7CatM($12#>}gS(U?WkDx^xijjLjt^$s3`fDJ??EHmEN~!JD*g8G_H?#K0ETY~R zqZ*CNY(8uK66mfGdD5aP8Rth&0$2vit6-7r1Hsnkg@aJxZd>E?M{I%)nPge~N2CNW z``$B_oCP`A4I`wso|tVA6_-KR^KYGeza&i+*p~)y{@6tCXbAPNFX>vU`~X@F4x#p} zkCvN#oapa3T?$Y6KNp{UY9$%d1DB4w1w`TdA(GIJ3}Y5+AzyJq7~WrNNuTRz>lP{I zJq%9a0jc(!fHf%)!{F}3hjF*&gy1Q?lar37CO=9r!`zwJKD{||&;T(FsRmc&1YwAM z1oJ;L2EqJoq>5(($AnoD^>1gI4?}qf`X&U8_=oqMe4l8JmAfPo!X+7ZIFHBjib>Ab z$h;tmdTl|ad~=B%Tlw_mS|jype?m!STS`|&IWNV3trrdeE%etfNy-UiakPEDI6NNUW3^+^ zTKGGtfC7E4H4kuN^uTUmzVf+=1R00qg|y8U{tc{+pGolSX+1~_%eYWfZCBv3`dZ7m z=aYx0u||(y*k5=}g`c_Kai5NshlQR|_n&L!or$@*Q6yhmW;tORD5{rmCP{ zt9hIOvRn2I-CymAY9%OHH~MUq=e@X(Z5Z`4t2O|){kheBZ*;g6<`}2KM3M52@`Yb_ z0=kysCu@)Rz8NQHt53g?E*Bh9Unv$OEVjQ6q_rxj7OJhQ6NnA&d3H;=4Bn#w=H|k1 zQg^j|fe*yNru)y5z-uyben5VaN2#dC{C<+LYlm+h?4CN?q-&v1*H{K~XzoK8BhYFz z2=l)GCYB8O15QD~8z5ltzMA=lCYs^?9dTJ{A=4pRmcpcWrLVfu&Y~vPu`^K1SrL0 z+eO!dt+LcjRxCNhVDjpcc${9>0V`Y8aj(y*Y*|Y}4T4E^)$y$t<${^Ou99{cuxFyt z`(qLF^4#eXS?{P}io>$P6Wdq1N&e=V!j`>|m_tN@vXzxK2ONA2wCUyn@ixB2zXc3r zaQ}`t_yLyu5PwEMy2tR`x<=-67>f8-IW&vT0(*^y1BXXC2yymkyyFoC;M!5ZS-^ffsy|+t6D{f(4L=^gnG$fCAvm*uG?RjM^0^&30~#@lJ5i1s2Ep3~ zb{-cHW!S7TtT75N@wA#zd9zOnYln0!^mlYG$wbXW5>ePQU>8%Vfj+iuaf8Z#_H+Y` z!pl?3)S+BhO{@U?8{D<8BC!+hwY6H6S+J{LUx>rV$*ZkNO@~eJyVCf@-YWUWOOo|1 z7;NzF4PgH436Khqv-i3NF z2Rxj@oW17?zW8ZkS5^kQYzLOb_eVNSsW&2IFOC1IwZAP?KnJ$@YOGvR9xUp281i&j z!wOS0e7-z+7s9GE3?9PMVO{4Rv8x8(cV(hu8wjWB>Flsdqt>@GlcW>3`$2^8HwNjT zj+7uNsU$Ay6%OgaA4wbjd<;FBzF#!OA{7LI#UT1bgUx;jU-r>s;pf2|>eOG!M1Bc! z$RsgF%`wZT{aV9>V0>w!2wpG^=|t-AOCR^)ggr#5UWOqkzdN2?VS*@FW8`*rI*p;y zlLV44#F8na$5_TjP>4%3ZcWmLAwUMiAOOi(fyK2k8G?Y1?^~JhA94r$5`xF2rVlyr z&~88su1D@*;C+S>0g%%&mH9>P)Z!#T+EN%(F-UvN*`S((q@p0SEvoD(HP7W)chJVk z-xjs`_4eT~sXSvx4XnxK8HRMeQLewg|F`vIg3cfE} zbmvgC>m3s6BeZgeX&DN}@pa8-Q3qo+m~6)=Le5ma;io54Fz1MiJBOycilvMVl&P6B8;ZoGYnIVodDj-uLktJmJs3yVLJ> z8J3V7vv$42X))v+bF+;tY2t*?{0xk?wSK>eFaQ1Z{L5h31=j0tK5^_4>sw$ zNMXYIasjzN^sIwo?Q|T2Ka7iBk=YatThquqRRQ5mDS<{Niv)3pg(Y4VoXssTe}OBz ztQIm(_|^_N-_*_}djG7R?92|ztl&s|poX(?kcc3c-k4iH{RHd~?bttvB4olr zTk$bSO|+^y;n_DdCeQKBj;_HT5KP#Ion&-KFNd*z5H&c5)zYLhNA&A!5fGpGzMBWP z0?oPc-Ilm8^lR>$j&QwvgBsAZ&)FG82$yJcr%dknXOifD${$Ie|H+4}z|e^GzJE>L zAIAaQ=4}C2*Ew$O{**24(jgcdFxufUvN#mDNF3avZwIRkV)}SBSog zyO#)WOdf8`X}@20sNT#jgWz)$$CQ3BAoJbA2jyvrD993D-{jIpGU&6%Uci;e*JUiU zU`(>9(IryUHwh+4>{^#dFi&-=OUAZy^C5b#p#AOm;p`#Yks`Lis$IMEU0*ngHHy=Q zkT#Qg;U#e)xNiW_kis^yYBB&GWGor5+fK@~No_P4CU@@>+dN>(5(l z;6&wBMl((IV1a{QwVknlqQ+?2lur3mtcqo8I>5QC+b<<(MR&RBSSTYxtkkB{Rr(LNzQnJm{4PY^mZ zzjaDKCVh8Q{;xf(x)tL+{WkMk|9poSW)ivGJQ#O9)7te}$2^HKaF)E+&z3lG66XRP zL%BjIkr|>4y3}#k(h+!wX_ZXoqnC{RxUw@&IvN&DM2|o8)Il8~4t+*XBg~`4YPh-M zU4Jt;g5|g?M7M+Ghlpf4zS$vk-Z^bCZsdEmk=oB_A377c z11e5B-jqW6DnoDu#9;ZFL<7WZ%v4fIAj%XwLn;bEenN@`fFU5-)~HQ|BWm4WIKxh0 zf1#4GTR$sOr|Y_@N)nSjtTBERqw^S(c_|fs0$EtMKFf~tCKhF$l`YowBdv)jU4Oqj z7EA;|jadrFN*_meN<$D3dB}!XQOBb`FBPx)4zYeuz32Qi#i&Ov0be^W1*5**+X$>~ zW^~FN+!6!hS`$I&YSUJ~b4tlG|GRp~1NU8U-2ju#R=KLyBuew+ZW!!ZRs_p^9(a1m z7=!=w+TpQFVwjGV7~Hwix%cA(FD7U>CxZzRo(qb^`^~vv!E=drr!J<}Htk)gJlx$v zY18Fa=%CZkY@Y5}^4WlwFLw>ujgB6Pa=--NZj}NHSayB_kXC@h7??DE|HnH~LB7P^ z*67|Zfw;~dih%O(ty{^>>ZLw$Z-KG>Pp{s@d4mVU1C$6oQvYJQn%=cwiw(_Q+7*9p zj)LpVh1DuC7AY^fUPK*l3MV{FE|rv42J!kHDRL~@3XE87P`gEBaLKX1d&zCk)0tq^<`v5`=fC!_9d;=n5R&!RXvyEA0sq?X zLK^uGC8jnHJpQ#?ZQ62u|8RHn2L$yGzQ#*ja}>(EA3gSPFq4hwEWRFiEG(^A`r5+3 zntb`o(vaKenYuX`sKyByHjwQv5%TKyz8jZ7;=vRPUl1w)<+?;F*IQAquFs z(uIznS}VWuOqcb_GgH6)bD{G+i{us09{alugJo_eTf(6YL$j_J@h1Y`DKekk+~!RF zEEzqlrK~2a&)0GfOWA*|4wF9`qL4nJs$D&=&5F+{HZI7O^i zv>=(LTf^|Vhd>uLNLZUhdfZ59LH^SABtO|J;`F|-is9ZI21XD4bAtnr)WPf2N8dsy zczfG}ZGH^DsPpaqKVO&&u#!<)DR>(yS#y7ZS$B5|2t83=pG3_b7r8CQ4G_%M@mD2_yI&n!lP|ja}I1#f>5J# zJ)vx8KG3*DNgALXSmiqVIOAv2VVt}@$EMHE@QU~Js|m9lIJpTOHhy8CK^vsQ4UnHR zeZ6rTlDZOZ+S2$5!k3r2;+OZIZ@-&)wNARdT!=iduQX8vgRumq%x3>yt>&aH~ z8O_`}OMcWB6)J7Ig&Xqw86*BqXGLf|&19#ou6rlVlPKzGzWr}f5oP@Auf+$kXd1qxidSt?!O{~V|2T%Bns{4i%$B5vdR@)SvxTk4wfRRx^cRf^bZeRc-j(;gnsUWw){NA3TQ$ z;PP5l4)X6Cqz@r#Rr2G>a28CPjKlvi@^kL-`W9;+X?cSkG_ax5>Ze(wDLiVI4 z#4s3YcQ+kflAaL9P5WU>`ypOZ&cBlkKE;@1L-`(pv_=9^S@y&g_6vNsdH}5yoJyRo zPgpi?fcb>2Sv)!fErXLNUJayL;3%IBI)nXQypJ)wnC^%9K?AcY9l9uw)vpqV^)ssi z$1&6}FX*|*w$$GNj^K1X^mn9mLNEm<|W1SY#keaYD*%BD|&_7jZXd> z#zE8N{=eZ^>p!>4F;U+y%GlM^63SE}xkH#rxL9gO>)o=J{Y4+oL^Jf)U!%nr`Z zs+fr%bC&5gFYF860Uf{IWU}AMQb=EX;~Z}y(#3O>Q>rs_dy$;UU9~`GW7QZ#b^y8w zYB8$_rlQbB7P?k*9jN*n$e?)0qo`-SKLl0`FG0O)a-3C@Ei;dP%)5VT>#uIKLuoU_ zy!**b+^ABJCdaX;m`OK+7$M$~;+bS70x59wT8MpnPLQe`C><+3_>AKobl#5MD$^}R zoLPldGx6rjxRX~)g#X&WKMBjvv;9Y}Ic2|{=drVseM7v1tO*QW%4OG^eEC}V-^2CG~8j3MT;)0AZ zs$+vI41ZPMavYN3OaK*&+!oFxO@5{gVQckO^{m`!0O0$IJn?Ec@R7x{CFoSq>Tckd0ER494bA; z00c1f+4b$#Oru$e+jqwZLc!W>kZbv+RTzseRv+HN*N-7lQ6#Z{D55TP$_VkVGx#Ev zOh|2baV~8$?a;QgpXviiTVmnm`KF!aL~hoPptjSMl*yNy zu&1X^-}Gn0s?Omsc-Fku*_}(t50Xt1?xWa}(8rf$pIs2D3)2=`zoB_ULjm(M!S=m`mwfMkIwlmg&jD24^Sd4hC+YGK!W zRG8Ia;s5fx41-n&rksD zgWq%Q%s1oy@O#FG7e%97GX3YK5g~L=gXym_|H|JcQ1|lv99ey2$~ge1YDC2-3hJ)poR3< zJ@RJ@2?PBVtV|G4!C>_JP|Zeq;X$VkwqJ6i5$8tEG-PvWpbom^9(|GCwPb19eG=Zo z$#tGp;LWCutYCcvJdtaq1WE#Rctx87l7C*Q5lixl+ z%}+9zFjx;o;~m@+n|U;ag`q2{F$3>tsq|G@OUJcS$8}~M=Gi*#pMMf|V4z?6F%@&L zFGvhGEz{sc@e@kjM@7T=LF@mD)HEM9F>LW4dJ)(6P{P}KhXgYP`CEac4EOi4uxVx3 zy9m!)YqjQ#Rg3QYcGjeQpQ~bS2_{aZY%K(`2!d&z@0}C_s)_24*Hkf^^>mKlh{Q&S zYkk*cp#T``+$w{6UQm^^)~n$%YHsK#3@8Vu{~Guaq`P&6XgF6k9#l5*wN&oXX8(6T zF22V)&=9YH7anQn{mU!FH#FXx*|6^D#)dgPUx>YMaEx~pl>e7D1MPfdFSMhLBGTm6 z;(m(x*OtC#OP-VHVq)W;t|@}OKROfrQseo|q;7$yhoOu*v-O6s^Jmfa%@!<%6OYh` zW=EwZ;qQ!Cc}I25`AZGwQX-yE+ottgoA)d}Usm_Y6Jkudo+rSwR`w)H9rr$fIrlM3 zR*uhz`tG#i673n(XR(3^!%IB|%gM{*?aDQW&6h`x`=gu;vq?fr6l({(3LTzcS z;BerhFv{={Bb&6!m241G@5hLYgUN6BD>A_Oq2#Lv-ImeGQ5+&*jL03ii98N;8&!%y zNs7H3+<7*1#d%rLE}5!meW8l6LXQpSJ3yWAQ$Edz|3}hw$3x-&|1%yjk{^|_!L0kTin72~sTM%b4KUSv8MQlhc70PR7~2BKRDda3}9v`Kr># z;|9kM?HPF(Qu!;w9W{@{`wIkn?`O^A`1F#uyv*^xGt!e2MBj|h{#_DWL&Tp1ulP6q zWmkGien9-{_dZ4C=r?B$(zq}lbz2OB%g&1ydU)6?9NEABR#9H6hzowc9~dO+1i z+a7hh&4%BF@R>Mu`xlJ^yjRx%=ae&QWG#O}iQCy7NPW{ep5VeC?{<@ezYDp}7B=&pJJo3Ey{u+z<1J1~-TXDf{OQoBWF{*6P_A_i^ovVjah_ zbO#XpFj;fHPQGf+?`>o63lV$FD~B?PG26)dq9D9h%!dxwQ8xRzBlT7jc=**Wl~F8` z(2F*rE~1DO)A9tK=l86Y(>C^3L8(U*Hw^WL{haH@XgjOSAoS3}xSmZ`i@Ty>6{kA) z=~16pLZuJWg;T&)H28G=5I?570b0r`U5D~kQ(M|T_lE|)3MW5OC{(>1OemhWyMvOn zvyXkqXMK_c$8DPaM2LpL@vb%SQQC9S`vxy?Sj25B80k-`3(9h$7YmT??!TR+yWhtWfpoD40JcXk{lAK=Gnh1M*axzKwKOgw z)FGUTw(M}{tl49(>J$dgAy;H*t!gdDR*tlzlr4B%s_tYTaLxRty@Bw17NJkv^(XU^ zaHtXsz9xHrfV8EdsbqJIZ0ypfz!#-KWrIJEqqy2lRFa*gcHNVo3%nu%5MS)p`i_Q| zSQG$%ss)ii3cR7zQSEw^=$DP)6OGJrpW0b%z^6!5>Qanu7j(%6{rVL=BX7@8;mj~C zFwwm(J+3RIz52h$vs_N1ps%riPfOy<h)TD6Vv+6v$ zKliLR`_L~SP=Wn@cjbwiK%dN@7sp4C-5{v8v*3fC-KmieIGk6U(z#2T=UaS=mVPvqQm++Y*b8s= z{Re?$f#n(2_@lJ_V4^VNT@4~s(VPQM`9ITK%55*76j@$6S7qd?HEz;+;bPqyziz)L z5wPB$;^NkNI#n#a1U;T5F59=o_J!yj%mjF2v5WGoqP6aww6&7$5q8IB&Nlq}RP62N zqwZhTSDX9D>W&8hP#T*XCy!=?Ljxc!v$MzlsW=h ztwQ$y`r>0X6xa1;3Ny$H%fI`_Iyem^MM$jDTwP+pb6}IV8R)i|?Y$X$YA&XA z-%h#LwVmOM?}MthU(6o-oOw{ECHUF(!<##|dDwp1^Ry>~sh~;d(9(1Y#>T$Jpvlf1 z7!DW2zpB=)@Il>lcc#xb-?UiJJ)^GD#Y-wo?2d3y^vgs0o=ARg1TF1p^2458oF~e2(4!b0 z^gax!e+gzJ-{ZkB4uN+sU;cn_DT788&#At$Vbl&~hgKde#Dkec06a>y!Yp0r6?>ceXJ9J$rk>Ilxq-@6JD3(A&AU-(bB2Zg!kJ*v+f z@A#JmE>wl<^O+JQ2d&}D$rK*OP0)+X-?3&xXl_Yoz7yC!xcH!eFOqLJxk}%i3ueCj z#HN#r^t$WsiJEg1Hl2Gi(5F9TFrls_2KwUErCOI~UDPk8?bfyMz3(IOy#s4_D1@JC z)EyluyS3Ll{d$;CU@45>FM`e9qcFQ;>65(QJ%TPv!(%hY~-zO@YKU;k|3 z=MR_Zg8Ve-mRqS$eleiGad!9Q$F%wib{yA`e2qhb$!s3ag{B&g(|g})c}qG|*y&hZ zT3B0>f84Qs14yTPtDUlj<|wyxHP@0vZZ^mfMJ}P;t`-8Jv=LKgf$ho+VouIV7BlDr zKXE#3viwYpg2{i^Da57|1%iGfVUt6md7b|fhVz#F-;vY8k2kK?R zXpBKehBwg2V1w7Me-IE9lT~Ul5%II!%RhWOu_+XJHEN9>hXvd)H|Vv(n;#B6;WGXE ziNM&eIia75-G8$Z47=$wP{+So5G4OnhdmXWqlaA$uJZC@KX_tq_2uBd^>An#cLOhi z1#3N$s+x*Z^1V1%PWv@aX!(u~yIuNBs8P5lWYGlv>(I|KOp?@X;->B~9bO~O7;?@g zNNS|0=I~FVg}<1s0fSsD+MPJ`J&%Z*fBstVeghv_{7%R48+mBL`Og!sF*1E*6R>9(fw+$+5=FYEo=Jb zhQrk8dh;(yob|T#BWVTZ{2al&gu70besJAt%k3(U3#G?9a^7_pEcUwAwV1M~YYw z9Y>DA{;U;u5$K@liUK<37IRitgUpWaplv-}>O{d(Say*mbnc(a>T&TX-e5=etDYDN z3W6@fNMmmjm!Gn$ykgFX;j3dRz@=?ruvItnB{lAw3l8LJsq{Ub5k}rJPhG8@ig-1LWl5z1)c2d#%rOQ1s7`IR90iSSytBKR2 zPJ+^cN1Z^B>qxMhdjBbp$OyEeGp37`@_B=bgoUvI z#h`1rm-T{4S7uw*o#`(DFunboV4{uOrLP7qT$~k)I4P8F-73hwD$e#l<>9)#$&an! z2v#&!*aWE*6>Hc?a=+jQnD9g!YsM)nkqX+{y3N@u3<^8SwTE$G(Ui=H>xF%*sp8gY zwbhpv`okM4tsuHH#*YkJLZhggbek|Ee-56@znRRbyn8RYmn^q~e|8Zn=4_GxAEnh- zZMe4~Y{3sQzfPldB)n+6zMzkJKh&pbTLDsA&{3^Ad{aEEMr$n5wlyc61D0+4p{l1o zll8M4aNHOhuHT3gbmZ083yvFZYgHxm zZFPsJM?%n_BtNY|)9atl0xY*82H?Qe!z(FRr9e(!1LtT><;V!V(U{9URlgrEy7UTm zd{Ekz88L^wehyk~jVk|QiVps3 zgCMF0_&y>&V{)f|iR|F!?-)VFTNu4zs%VKxL)e;$Pdi=z=eB7)7JJqb4ecVvOaqCAu@I{1%|%c z62?_1cBP^qLA2XjM71-|80E6+0UjUEFXgHn3ey~67+Y8`_NOffvNU**vrc>7Q(~HB zBy4mAyhyJB>>mH#6t3CsPe!Fj+A5%QZal5udhDd?y^_Wd>K8ztQ%CC7=c|8|ZJLd~ zci2+ogD9(O{h`8p%fEQ^_&*U|TamR(avj z#fc}8rwWxBK|CPl#pJy=tG!-_)Du1NaXqE)ZIla(j^8qaOcnf_{NCau#ORXZo#wLb zvA~`kIx?rO{QzUzNZgvvlw245_0sWs^!eL&a3H0D!)wmHd%`;hFz;`iZW%pGDNJYI zB@!37q-88;a?6e>vXEf#B*We=#Yd7&t(~Pte5A+X;tKIW|AuQV-F3H@G7!@VVdm@FfNCFnLVMU-^ zm~uvF*obT9=mT8;mYN1G3DTpJGfMrxBJfE{mr2x-l|mvSJJ5EW4KHQ%6U=$Q%WGWL z1Q~%!;j#H!B&VVR|8){TURfc<9R>TtCp3tYL=*q}}}FXaEQT@9dv_uc-`yRAffB=_U0(;qe*m6Ar% zuKE$WouEyE+7Mw3NcPnc*|?b=_@K{Sm2)I}!l#+@XbDRCbZJzrCwg0?NacsGs8Q7H0v4-3UVcQta zTn(u^BA)!l^=}Yu)rtRi{*g0$;}mN>6-tN~%f76lZ01b8HeSq~-?X_1RosM)6wNnj zibSy7mV5l-b0>`~`R8>4HP)?&tmX$)6;fkQGm+$!1f-ZUxJ9!yL_yB|Sj?VV|MTrv z=EA)Svt4dp{o2;aQ8HMXxn!7xms%#hNZ=n5P=`;Nepi!U)As+@L0j=1GohtXTg3Pq zM8pe(uxPRf#HZ|7X)UOKehrlPBR;azxt5+#Dk`Pwt!pE_^LY0y|Fz-f(c4t_k2d-0 z^ZQCn_3jrv%ZJyhSFK-B#khgRO#OIssRT)J#ZH1SE~rsJi8ZyKd zlFP9>gv#Ik5Z8XC7EJltbWF7@?gn?w1?2=0XQy0Z96R+XC-rM~KrEF}{&iojLx7H2 zIA$I#a(q;L|IV0|T79ECk?JYMh<@gg=&ja@br@9Yvv%-3Z`iw=RvS=&H^3y>oWll8 zcF=B08GlUTDhBv27*;Xyrk0*)NuwqH`bw|v&wekRb-s2P$ip&B9M`WXI@a`l$L{P; zxt&-6rtXUNRoa4CLX*}G@r-&DP`W1G`?&Q&$P7D1pgB|c)1V)n2iGaYmb1F8a*^M7 zzD&qB0%t7zXr;+qd}q@)UZ`3t7PqcBw$)O)z%;%CdHmfoK!5x9^6{Cp7gLqAKYd=A z_@Q0P8p{;^p_sX5Z3ep_u2w9l%f-V|Y%eXxlJX)^&!e#OL%xq-=8UO_RfK}`4>r~P zwgjiryc|1wXwK&xCEpN~!~=%}CF{}I+!hNmJnj|!GdP%-ovsI{02Bnxd`}ZH2MTN< z3L+!%b{~ZF%SQWLC->^W(Q7 z0-lDBlgt$hkp_HaA0ZFsU?@7utSi$G^?jV*w8U>P3zVfzN(&5cLnWpj8d_(!{z|rg zE(hay#mlWEm^c-dL9NK-Q?090W-A3sIOoyvk%x-RPf%lMcdjqP zg9&?fj5D9zTeZ8hB&|{vS20IJm-B6%`S8hv_Ep%d=MyS`U)!vwK2mxSrc+S9f+{Fk z_U*JQ2zrFpK{12?D|j_g@@2un

cO=#PVB-c8jZQX9T3wN8EmraJmJPl)^ZDD+_k?{dHAx8Ea^KpJx_}5fs~v#L^A^D4LedJ3$ z`RfC$+#!!%T3J3?8MW2p2~we1tKWp+cltMHD!})_3%gU~7iE0yvq&U!(0z1G&l2Co z>1+9%!Q7zTL$FS}V)|^UE6#KI>#sHY2z_hN=Hb(a_LuL>*V+1+*T+9*EgZ9+WKVMv zYWP7}@`Q`k1f7uoWDfbuSff!u{Aja#Gxqq- zS;X3%0xSWN#>shNmwJWVB%kN`cOO^(A3n2h`;FXBH#1c8&oQ|<-K^%xi-kPFDJ!_X zmw;T>XT>T_vpB+Ol~*d>=9Q>&ynYhq68;)}My1mF@F0|Qmiv9E5b5<9#wcEengE9Ff(tC`>e`v95_fL3z$oy2Y<%!?j{$povmaSunTLxFAl zT`mgcMAr4&ORVFa|me3*J1aAUm!g^UW${sozs4U-WC0FnGBhm zpXOi9IZ)~Oo1jqcjQXK~IhSxpdOAh$)ylTG>APJf6z?@;tqWq5_*faQTMo009YzpF z=@CF2$pZ^~-N0}I5^`+pk=32ziIJg~34+4kcMQKE{s@*l8R zJQ}OSZ&zl0m~LMDRRpx&Lo$&pViUdtUa-$WT}I|3D5|*sC0HJwe+iZvR9;4ZpEJar z6L`3M&(5#rcdKOplv8KuwCXO|OiO&|M#AS*SIUcqJKWL#cb%jMA! zwinm3DlU`QFQs-iKb3 zOZD+Hu;1q0;K90udalqkQS&_#;f&d@zw6mMc{ALN?$5EUCi<}=SVmcaXoKil3gOnp zaCyg;>^hrgSI=V$M`r)Z)rvLli_+3$F&NCw?JM4Dir2UfMaF$?jQ`IqZ_zs-a3rPg z?)Ul=GXIR&V?)qycR0zzL%2Y0Mo5L7;3HU;OSsFCevIkBI2PvwZ;INGMKW5 z`{QLn@09So_%iW1wVwOHnk5xDN{!|Ts$0L>UVi4q*%^yD?>QQCCmuYkPAMPTp#F<`Hd{uGj7e7 z$&<>SB=1d!XTw-#U_a8k1l6O6RFM7SK}zwkkiQa{@=fU|2c2n53JmY z4Zf!bcs)htZIBsddaA7O(9bY4I?2ENh;R8P=Qn>Qx0*l_`C43urTow7&W$Jt8VzM_Rp4XKq_-H*SWuFL{tJJ?idE?bozVZkCcF3~VfsD=r5I`&9GDNt)or=TdEcRRG z`~`{#ib_ksf$@Q@G9^U6 zsn{j|M}@1Wxes3dTRk{Z|3r<0-tB-lkW3y%Gaz-(epLkeEK^-UhG0t5n!_Px-sMf@ zV6pjW&sk>^J4~kgWIzryGJAn>$o+dN!BGJ5Y6$H6N}CpUr;T?9N|D61sgZ`kOt)u- z5EK+V%@+~sZpX7Igb|YOYJ}*(oCAGd6G_e>1oVghL zr_J{0C!A^rmSO*8Xcx8+Aj!|V!}2*7^1?U(CAk&;pCI1?sJu}!OxAFLJw|351Ix-u zdQ!}34pg@zpB>m!{m87SjHt$e0^q@vQtR%V7e+F`({_QmFG18;j8Vi#x%FdC?{8+? zNM=&MYqxCryF125^BUWIIr3-=Ig~aC7#Pyv1Qfc-r|F}S69Xc$9 zps?$@>*NlYFY;v*br>14p}T6Ia$Jc6b}c?gnQpf`fp?G@&U```Sl=`^NGTMbk;_lQG_*slkgET85u2PdL5z{GHd-Kza@Vx;4zwbu##>1?64h+`3r6UvOaUhcy>s-KfQtEmc8HvEw(+{axUI@HP3wP`=@7i)TqgtSf(>dg)Sv20#D6yeuw3GRHXf@*ji2PB zZ5)CPQyjNd8GhuLNYG)xkErZny*#i*KF zDipFXBAjlP?R{~Ie)Z|DJvVJYzWw|u?fBNI(cF;pz|xCc@$1CZvRII8X4sTI|%Z~MG0hfF?S zKIHQz4d;3BXO>qYR_Q;N9t8EGB>GyyHp&;@yRDn&btocp1Haw05#SskstLOnVM^$P zzF^s{Z;8-7Ftfjc)rIImC^N+IKg~#t+L7wLh+7Hi#AB4?TS@aHo@d{-Q^_~(#hBhr z152_T1qQZmhAH93mDWEiEuM*Mw_j@T&|Tc-6L>|eoj>F0d!-A#Yt8j0Z??SQ{>*vN z*ouGQ{ZVO9XMTWoTs4_;OK;sG=vX?)^ZcK`oqi_GPffaIj#sIE7H$tyPoRq2IH*Hp zLHKp@<=!(l*8cHNtu^S8AwYyrbWt)FM9kz*b~3AcHJ6-2(G!fsML}MO4zw9)+^YAb zPw8a|1f{lAp+Bwf-R4uu^ZPl81y#FRu$TbZZYddhMzBUsz)|>P=^_wVTya8g*u`i; zQI)wllv4am`HsRE#rqSqMNE7zs+&ycNFB&zOo_i(a28*^dkbH*iM{A1t}I>rZiDxN*mlOw3a1dFH{b1mMd4qbW^x zNe$11ikjFEYljHo(D%>D{6{rCSf)2VKegQ?MEO;?X9sI%yK&UC;`}Rqb}jJbKkDLb z${uvP#v0eFBJVA(>`$Sy`+OAFeLsZ+eQd$irvO&c?N{1yzWiS-T@tn(UvIf}(GN%m zP1Ab=7jj*@HWE!)bbZ)r8MGCvamy8c=6gtzAi+ySNsA!V;NnJL@x~(#|BD}Q-T#hf z<0aq(5rGGK@ zuZZdpA~26r14b|DOjt;CMpw1n&hAb4Z8l|b@s}*m-7CH`2~zfBK{(T7AMqxlRy4l| z{Mf3C|G2?wtCo0qpKm9;I-)s8)k9((tL}1k|qBx?(EyXaQ;*AY&G( zqC|$*@ej8eL*dm=6_{!n-dYXdHxk%oiRjh6Y~0**o0JF#bP-8GC}?|CL4+k{zS0*l z0@#k5URFAjhpPv34wWYaVOP@>FFNRmw>>V1KI$!Hpj~#{uy32EA(;HT33#oRa}J*D zR-9#^WI^eQd`Jfc$!~UqxTMT? z{>-15MTgbJC326y^s7#x)ay$yIezlDAhSAFw+rPs{%`P2umvk?K#Y?pdN-@p1pf=P zi{z?!+)1A?P=e!_zDXD-n6 z;qoKOGCD`Ak>LclAN~DBI>U((q9}$H8N0% z{42dg`s5;T>!7Y+=h+BFC08fX348yE(F`Z6FZSK#P?-j`5YwOihuiF1%~Z_Ob*?%k z0wG(RzZo$OEoh{Kr}F`Ru80}brAHkY2IZ+xXOGoviSy@q?uK@u?#ff{aKYcjXm3-i zS@SH~{+Irxz9W(__;r zvJA$xU?oL_%h5+(fdPIxlQ!gOiS*RcUAk-Qyj^q1Dq~Q~Wwt3y{bZwdZttFgt@Y%s zVDW!eXL|!Ux3P(d5}JjnxO?!P~35l*Y9O@K~C>RG##gdEf$IAI8?66oRbEPG;g`vefPcV zx|srM;6dY>M;*{c{Oj>Rk6k0)rIDuqTJ4sKmg<1>cm4Hh2qDgkujB_&fNZsAkDFA! z6Uq8`14jTfWMbcrf5}$CFRy$YJ^C)DT$pYA;-5;OlajFM9J3`O)x8|$!=o5ayQ*E~ zec3H362ukNII1}MI^G%dPq3AxZO=`3!Le0uk97`ErIp8?v7XvqNKOdfd(sGbF&%{P zu}nZc_LhUR3r|lA+!&}%B6hpjZk{1`x1?3uovt)Pp_|ixDl=8@^0m40Oq$;d(i%?6 zSx)}5ItgsSXTAA=xO34DIfe#v_tn`bJC8;eW{`2y{twzNPXJ~xP650$>u2P8@U-h z<_qT{xVHAN2q^BkJ$TT^eXUrgy@?}EA&I~>1l`%L{|6KY_xG`qIqw2mobR4bh`wjmuLD&nyOQZzdMVL` zN!ThCBKvXDx6dkN2@P9opj>Hd5q6PHbEn7DoB2b-s}SFBt5(+Sf}wf^vHV%#B7K#; zjD&g*+?`AsxhVd0@#`722rz9`fF+WI_5xJ`CULvKy)ZXPbT6c~9$bbfWgnx`JQkNk zSkBIo&tWF=ZOA3Qu~T*@oE}5Xgw;7Fz*QQ7b_nr2;Yx_)Ehky2+C}hasPtmr9o^`yuyo!Sb*!dn?E;#E{ow= zO~<)(fsr6e;iBWCYFeuAKDX5*j`Ad-pk;vR7zBI-7 z_}=mRy)VppH55lFcg!MoB-_WinLlvH&k{*#F3pH*IyZf6+huu@1#HI>mIIH0moB=3 zBVL;ED6xjtPb`krSMTnry&?luxs2S=J*T~>Zco$ zo(}6w!-dZyhy$blUb;H}lTDio7Vd3ot`D_ih*Q4uI@1&KA($Dp8$1rQcYzN+lT~|(a z6kgQFOB`ICmBxp*)N-TevE$))_J89#-W~?@0&i6i$xC|7%2r9XhUT&dqNq-i;w_F< zKwas9#@x&Wx%>W@Y#diB#VMgaFV5YIHGx2vzw{!5vnB;!JE{4qjiN%l!w~cVBzD;@ zZU|-xNYlae*0FW_N19RYg^~H7-7_mXZF%L7I>nS-4w3uIWdqx3xYnc+*GnAHb}D#BQ`|)6!;o7Q$VGv@6~)}XxsBc z9xX2(((m|b@ZOhmwv|oOr6q#^Go?~tZ;SME0)^W7NhW5^wKvFLPd^0=)7Yp3tmzNR zNul-+M7(t$<{ZaBBKAC8;0^0@jZ5akx2d}QciQU?Yd3xBNH|I&YlYb@E#)mw$=d2K z=8J75v1a@n)Xpsm6yt7TX0J&1Ywq`5GWIAB=K2ybaZp~KG2i9h*^1lZRvSaih#e)eZS|; zn~+JTd)m@X?cQ8NO*$FLnUts}zqW(R{u7>|!;OmcO!Fp->M#&No(Bcfkvw zB&}veYy3mGYe>n9YdlHGG40A7(@z9yz695hVefRvtDtH0-JM!ESj9~i`Aly}ymF5d zN8ZUaFMRREo}v7<^*xS0aE)ZwwD+NE+*UPF5T`HCD(_smQ%gdd!kGXwhFjBQK6qYH zAK|^~@^E!%0K(Q;d3|K7H8_vY7u{NMyV#B^h=UL!o(ZUDLTU%c$Fklu)x;8DgRcl6 zAG%EK%D(nWSN{<8R+_9N#nr9SnlFcjPwm3DW1;7H%$66?PW{hKgdG=Y&rVT`Fbcxc z8pKlC`EmM8W)tZ6iPG7XX9fV_UO zaO2SW4(|K5HEs~B*y#+Qy zzX)Agb_O=3Hmy}=GumVa8ulcFlFE`NMukk1Lk>XZv&h>-_98LG{9(={sm06lCO;to zMMIZNw~W}w{fbl%QvYV;r%H9}a|))1>+dFesCr5HJ?GG_E9I;c&Z@YwE1^7SeWd=j zi$03@m`=y&F*7*=b#j)f6?t?MpN}Udr7r&I;a>GMAg5^O7{^Mk6W>bZNdGaLybQ`) zdor;1Hea2+?aNd{DvZX`{NtmbWZx-$PD1P5Ly7cH7P1FxSHDH>9Wy|=u+4Ndn^0v# zC-_0g({b%LABox#eY=jN*89_0jC}xT|G~lhkKr7CvU(&B$i!$&av!;N`n zzDn8r1R)5!$AA?cH_~fWDF&4qE%)bZKJV}5?0dGHxxd=SaX$Ov5cok=d0t3dzgX{Y z4Yaj%kUvBuCPEcAj2s;NKAnNT(Gj!O8gMTBL?oszzc29-kxod79_}E7J3_sG{HtNx zH;H;m_|(fAF67SSQ@o^>9Pty@EIoBW_ypWx%fiz6ugXBk(s|o?YbcQS-~fxoI&m;u z5Xq>;{HPHA2^FC5LPQGPHiX3Or3Yojrj1&2m2WNU`B$k-{fw7N9&Nm1z^~3+nK~55 zEkadfWX5My!5OUBV-}UrR|-}CnMCx}-F_@Am^ksM-)*U7^$&U}(9_I^cOhuSG_^xJ zG1dKYW>qUFW=Zq!VF|_R&CDB1&YM4%qOMn*reAlXB65FNx@>DI*@Yfz5t!dCJ>2^cT^rfS?8G8cX?m#ibtfq? z(s#?X{Jc&^q7dsTsuQ=A^7yY6Jy$c|9^58R@i4t|B3)zaJ^m9JtHuhK8N0yumox)iLen3~84JK9D(>0kYXe zZhm;=Qmu}B$ESH8EB@7btR}!Jl#uqTh0xg8D0_D4IkHqh1hX-wibshF?;DollFfzM z(LrTYfH||mNvC(kRjL0A?Ng!#wf&WP-F7*>SpiWQ@Pgx5We|`?A`o#kBAPSaY1gh; zpvrYU(__Z!r%AR5*?uuf^)YRq6v2ms(mGZ4PhGZWd8}?_Z?k4H_VrABHn3+_I)cb2 zI_&YD{}?i)^zb@~?Rgjp)bo-#<^>1<)K-JLGW+FTY7A4HDKE2&sY6{E031(y&LkZt z(xe`VwJ-e_BmYP^g$(Fku*O2k6#>p49`R{b%q?G?xljCs>+y?iqC7yM`0rBhc$oC= zQ%*gI-XNt#+!EQLbK*`l+YV6{QbQcp83&RPa)@CUj2ux!nKaEQ9#Py%-*u(|{eA|{ zEN+F-h_@Ep!AKm4h5uD{$0?*151C71&YRREG9ePo&+$O#b6&U5>Bh|eKxdMptUkPH zI|jQ)$*m5ppFyMTD-r%r~fc!t1~ z892%Uf6H>D*YodIt`YB-(nn^7%)Bw%Ia9wjn#p7Qr8>Jv{-`$!`Jp*@4k^t|PvSjDMR}aKJ~t2 z-Rb%AP-@++^aAs1i%oOGOdh899Cb5ZYcyM!-I#{6e%65ptN%PTJf7HRHdnvC1^1Xr zybxRby^}95x-9w>deX#DGBtE|5#!o8Op5-2LfK6lIRN9#hesLp)+gQjRM5OfP@29hj-wR2q?46p@jB_0*_|Nc z3;Pt2;+7)tSNA`z;oy!Mafp*AXReYW5=e?X z$_X3Ym&Y4vi^o~#@BNR;W0*y(41pf&{r84%$P{{##FvD6t0j?s|F+9WO34e}ARAFJ z0P{5G>PMw;{EZ$m$npGRPBL{f1#|py`^BCCN>(e{la$q5v_^yyFgeSO&|n%)B^8Uf zdGvhXy!ve?(ESr{Y82ct&M|6=SHfAG;X~7V@@7Acsrt)%fn1&4|BFOoTipb4nj^Az zc^#_IhVJKBr}1etr9m{5p7{7C?faLUM=KoRM4b8jw}WaWVb9RDXH=FJ)T!~N8549j zFh6|oam&a?=&IBQN7)bGZ?K7}H)k?4iJ;u{X6ovATPC7*0gBJTQd1%gWShCv zC)YM^Mu@Ys9ejT-tgP!TNNM1zk@DCl+t@5Xy(aMbsW??D$p4H~9sW+_+@a6R+zWLq zqV!>hZvUNqMj2DB8e6}Qa;#s%aR+|=o1YJ8Lh<-sQP*)83E@kYbj-JQ>j`DT7Za@+ z&LE*{M7})%I+hTMVaC-q`o90+p}VA{QA%z*ETns0<=|9n6ABubW9%hkhVTH9W#(ONxgL?L+OwFs~kZ$5Rs{@d zu7r>AJ=Ls=xG`9<`fJe_sA8jwfLvxDm?&xQC_JFj-X^GSfGf!-;Wpt0r+|bjo<|4; z`a?qxj19jPyJzNoZRcc3lGkTE!W%U(m!+P=9p;%leC)c)jLRN)RhXzXdNQyIDG+cMICLy-68Kf-CJPq@|I}o z(&}s^S5EaJhH#jnDSr?Pg#`>%+@39bj75J-ZG-ATTfk1j{e=;CH=egxe8%E~Qu&eC zWP+vnvaBQ9H=Xe`X3k%J-T5G**q{_JYW#O3%I-eQ71Uv?;@_}TnXAo^sbkhyQY~nQ zSMoYt`jx=ML%F4UA*{l*8mBjOlA&;Gu1^+p$~1cb1K4Tf!y&#-Y)?oSLF+s64Bguz z&B;rXgZjo)kY%GP+1k+#BlrGqCCQ$*I_dBN0}lKt_q5~23sqzd+uPro9OA&hvQs>{ z(LH*w!Fjac1m84l#BrX^)?BaO`;0G%Y1F8cpTTfYS|i|P62_v`W25y~(sMu#P=oP3 zCn<6v{%BdeU8j@aKzMZS1*sK$9zJvTdOM`|761Iwac^tH7cYA#=4G`bz*OT5-q~#! zI#VYYV#B}aHEfbNOO&^8S@S6O3{$sy>2Rki%0H=syRhE=!IksTVrrJc1RlWA&d5># z7hjhd?X(mTp^k6cSj`)0@`q762eOEq#;9FmfVKpPeI>9@;|>liXQrze!3P7!)#eDN&Wx-yk!Z=MR+)ZJWBZ&DJO8gb;0Gdv$K${9{<&jUjtu7xQMy zU4O?wn^U$R(GjQ0X=heX_M%HPQYdlP87p8LT8j0i1{5>IdNJ1kkYcVO)txS4dVvcf5uhg2ThJaO|Hl{v0IL-#mu- z!u^(_W~TN13^S|zTbv|wWebn7$cw)|C5Q#%F+Y#|t!-h%6B`xQ;x)LTDcKVmug1UbH{CU;oh z{qhP(;O4Dvu}x?tiDkMOhp-CnC*1E>lQ!`!XMu?Gz==3E1^J=$cl$x>G6aajSm*$H zfj~hrXm3_ZMp!p9jk;tx2&QUK-(DpxOqw7#G7{xf<2@OUIjP*Oh%vDH zJSH9M+^)?up3+tEwgdm)DF$YlbjrJHQ|_DCbx3{IBXQdT{`t+)oi->wg#04MuSXM3 z7Sxu=o%2n8^!~ilgw}_Hd_#xktbAGN7P&!Hxz(O^zZHq@n2Qfz#irHjT^HadV{}K` zOOHPFEu5`EBF?{kVP0!Gk$G6Titb4jIXm4ah_?Unz_W)9zHOu2#*JrSZwC7&kQ9=| zliGiFK2Tbq=31M36-IxE7?50%FKtPNP)D_(NVkTzKes){_>*0%*Hwfr3PSz+mjL6o zc#DAZCS!Citjs!AK2{yajx)(~U{4Y9oZ#QJuz4*`VK^B6$q1KGn!JOy> zi4K39e-1S+w241zzil?km!*KZ>uitnqy>Tk-iHbG%l<$N^A~>YHo|7A@+;IjnVs5n znlleQgt+F6X_y7yZ(~$qN-29>R;@!g$q7^LZiBm+;s2p(Ee?7tVtqes=Sq{FANymu zEEa4xxzbrBGAfH9Lr)lBZ;%+aSUZW;NgX|5`lAY7^7x$5eTFmU@0v%&#Ho`Vo~C>IzTlPyEoS zdnMavyPNt#NHg=3{yq@?RT<-h34n*i7uar)iMoHZ_Ux!-QCJcuv@<*flF{p_b$JIT zbT!TJ{G-uK=6KC=#{2~w6^p!x#cS_>{xci1_cdO=QHB4AFz(w=#|IT^fKCheP=#p) zE(=WS#@rrOrIcZl40=4)%-?pFW%GhGdC1|zd|_jzUoP^bg>{NO&p#cBY|0e{plFi% zg6v?&SdyIa+AL4YJS7U`swlh?a$;8nK2Yb`@0U6Ja-yEnH`_F?IfwUB)#JLkS$)14 z02yH=>~3Q%h0#kPiLF@NH(xcs)u{RTIqv8iFMnnFbeEhM#Wt5)u$kaWulH!|BtAx+Pd z9&7(-ep;M6G|X|=a&qug-MFjC?-}}MdEHzl-!=d4T7BvK207>YSxYpM1G6$K`~YQ} zKVs`!x@QQ|tlkNYoJa4EW_vd*Sgr>5p;B%PFcGBJDHKj_8uhL=qfKVgK5E9xS>akb zc2XnFca|-Ed^~#+4Z}z9Uv*a}1*vB3I3R@efI9;ptyvE-Mole;>Rpx{q|r7QpG3{q zfSV6~`Ue-J1*6MIt;Q#NXlzo-htxisngE&BftzY}ImqvO1=Q6dw#`%()-YzA(hv#+ zQ_FdML(A@9ZxRo*^q0FKKeo^VHoZbSA@7Tg9Twd+!J!a4d1P(m;CtVbzPPBZ0pCdH zxrFgQ`@3$)w_`8ui3C`l4ArYBA1(~QoiG_7<;1q_lBBYX&UEoJvZO+U(-OJr!aBqf%Jf{_0Gh% z{F{SG_TmK*(?gzmhv&?O`n?~PQMe)6yOBf%sNMu**>4zGaf~b5mgyK($mx9SKs1wEAbC>A@?mxM91pR=P3vL+tiBdW-016$8NGQWV`8`Gu#(wV{{$j^ ze02R}=9@Zbs0_5=h4FwW^xqtdgQgaRP4F>|nWy*|k=G>++=}NOBL!rJUPzXu3{;tq zXZv>t&my*no6^QK$oLJqgd1iu8fucXxpTUnfB+h-3#GD14Eh}W>Hr`-W$YoPF1qdi zoluXkMF1`Z`_sIo+W<*=3KPWM(QhsUVX18G#a%CZkVrKx_Q%83hUZ8WZW_C|;Jc+74~i2Wf+Ds= zYrBq_CmcgJOOu}rZUw1b5u+oOrQ4mS&c|f(Aun*eD?Kw`suc@ReAW6zZO3>ajMVoW z@by!EwV`X#@iM;ly=qo{fS)zrWncBNiYX4%sbUrhBqjkyEO^fG5rZK+X6Gf zk8M6B5TjeXbZenU`YGS0F*K^6|T227<4S4AHZ})?}I$-oo`UD2B{*86mjRq*h z{}87ls!x2_I68C1wFWu2SBVx|SapqxO*4+z(_i1?T~N2m;oVSRqO2p_=MK3o+j`jT zKylTqkgLt4^&z-IJ`qfR>sq!TZYe1|o{ueU4u|o(2h7rvh+S&?dQtx*hHvY!X-uF= zZ3J1NmW$5rfwr8q$NG#n-~2E`j~Ih4D`QVItZNJ+-6{zq+@s%HvEw__fL53>temhz`|%1}4YiWP{z3Zu zNda|0jC%kEeN%Y)ZrQ!pL%WT-uMGDSEd|_bnoF8M{*bO`5Knh%Ur*6chR?<8)tO&( z+>~P#s@y`b>2L2?9$`Pm6!+Yc7h)n_4@b7WiL|3R>REx{dgvn&9p_Q&D1UjXIboGiANz}X zhUw6Vr4!nBoeW(|MG-Q0*?gEoL>e`z|80j=yd80}5r5_|gUKQL-ttY+gDUb}#UM{E z%Hho*RK1hXaKEOrsCUbVvvp+EoF8k73^E z<^1eVY-@Kk-RJ#|UmLALQ6Iz=o!$5N#{|c2firK0A z-3y^A=bLt9S3_bK^t+uYDJf~d&(PLG%<=R#g8ehs3MFgG75B`K_ksT%bauE~bTCoI zI`i9Ff0}CHTj%OJJT#>mbnN*SVkeq1xn?Ta=;UeV!%&R=^rhORF_WdFggfDnZl zAifK`_mtdbWNmM#7HpTD1DtCOQH;4hsdG%%_ z!;hkL*-NthF<*^w7J0EZ-FQ^4W2VZu$<*NomulsyxKZyBCxJ|_=_W0f?MzZMEzTg> zfh)G<;PQLDQ-?3GP`rsJV2}5g{=!Yn#~%}R?D2Ju zfzN})w%@nTEC^dDG!@9}hKb~tU$p%N?tj(3Jf!jCg3gK+ON!xlbXo7>I4J>7r;|FW zn(<+V8K&uWjP8lZ=hcs^K1@0vJ5>)n4xr!BX=L1)J!Yf9IF9{8hG*>6hV)*Ly z&KOdQj&1m$dgoM;8;99=YNag`lF)$Gob}kJ+u$0R*%LHUpNr7Uhkw0xlaGw{w>Ks& z%V0lWrLA)|kxlbrYt6&LEPzSDC_to3i(`@LLWgi;r2-;ap>3(2_7LV0z~m?O za>4+3%YpZtn`#63dE!a1;XmrS3CHmGy<_s>ySvNszigMa$*#r;rk(5-nXhUwz`(Vw zoY2d(P^l6fCKg1{LcFsd+RwdQ$0cl7VJV-iGO*jx zDxYY1UAJo*X<1d^-~>H(GW*G*d=AFCu!XU)`susdq`>UJ+l-a201hrtI?w^4#}AlUe7B4E!HD=Fg<-JgE*F{8InC7 z03>ADVjT_%lT5veMmIwf`+OYzzKNTkj_RXou=}tI0pp#}BG!hajZFEAmNILMFi!%} z=yxBDlzfYgeDc29aZ52;SAkVt6mA$8(~w`dl^}}crk^>Qu8FNn*UWpRZD)q&?=e&4 zCUuzs<*3{n?qA5G`TGvBM=gA$k=M@Teqq6S!yB7S^`9^Ruq$v6itHXu*j^duG9SAe zcO{sjoxFOlRaF6i#D$vgML^L_UXoqVrW~9nyfZAL^X3$uP7`keG5R!etEjB&YSfcO z$To)Uw9(Rpv9#5yH{K?~O{0U45VEE+OCRd|UTETsTjXusR7IVZ&Mg&jvp4+j^KR z+l~Jfl8>-s3Cpaz-=HV~xo*oc%f93p&}dMg&dArs)r$PR1Cq-CGI z7jffZ2xDRY1awvG9)$&K>)IL7&uUOICSe<`d#Us}F09bV^ce}*!21T1UIb>Zc(Rba z>k!8m+}i)CH}yaKTGQ58|xTBV_*Gw@>im1DlVoJYxuD=gm zwVW07X<8nyVM>mwxy``DmI<>`-(Jg{N3dO6DZ#t!;xW0Rf!8wnZY?Q@-xEe%&&mMG zei4=0znIXujfn*%RoEZ{@{#3pp3QP{V)GHswrV31H{sEHEsvzUcBku1+D$SQgVp+t zD3mA6N*{leDjFQe^8RRVU=&)~pwcGu#4D?3VLs900a`1)S*r@GIFpokXI@Bt{(6^k zuq3LbFGMZd*OF-+zo_Pw13sr?Dbc69x~=Klgk@!tIARt7`|UWK{S{9mWjbXMEgkz$ z`gJ{GuRcarKY#2H{}7mkVBwcO52&F4_JF2~@x8&rvx~29CQ1C7n4ha`{p?=+0c9CE z&*~>b=Ek~TZ>{j|{+#{TxO0WUb$>T;`OUoc*EZ?amE_77J^X2OaEsP_PP5i|n+0QK z%@>D4ba$^ne?xV)P6D<`J(QrN#HF-|^Ot2v{~w;l-F5nk$7W~Xu~`L1)a79$=e*^; zWHEPY+R?h6B&G#z{h%_g@P`+vdx;Z<-HMp%dfmh3#?#!o`eKR*2;~-`3;I2Fyl0 zdZTYSUO^t5A%=aHA>;cRbIT1M3;{~|O#RO|*zqOH0p=_V`h0MM*2g>snIiMAcSjT- z`cBU(mq5LYT3**EPd~hWcoyFdO2ERZIuXO&8GyYn<#2{p(HDY782Ysx`Bh|}rT`q5n3|f{0UoBY|NYhO$G-&zk)?H|(@oB@` zWABWAJ>OTjtS@e1dmNJBN4JUX0@W}GGkDu%9OKQcd1B43P64=xs!XE*T?EU&uJHvh znL<@Xrl8TzF4er1JEIpz6q;!JTE_v>e*wZT(R)+aQ(V5j6L z3Fx(JIt>51d9nH%cJg@pBk2hA8?l4P!I^Hez8M4i+_u5j2|{E0l|Z+#oQSs_C_b#= zS$bd^z>D(;XfysR->VpXW~RgEMOCui|6&5rlCce8w$m9Av(59@wM#l_Y}8YoPY=^w z>(c#lEz)X2pKXGc0-(vCm)0>n#ey5K$S3VQzh7MKL$DY1gX)9Wiiohzj`zngId+Ga z>jt+eZ-Q(RJ2gm?&?8hh6jyz3OmXVwqj?!lsN#8doW)TIP;;uF_@JD6Z_pZYJRs}gZH!N9OVi^wc!DKIV zl0dEZVd}7E(YAi4=WUypq*$BQR#1Ly;!jAAfR+zTTJ>%neSiF?GPXzbs|Z%0X3Rw{ z!zAKfsw_CyQ8_srTg*ugf?l^F3oTx&OkclW);^DIkx&D0!2?(+MO|GRE~YJu}Zv5WP#!A!=Jn#jVf>1uF;y4!iXN2sy4m+WYF^LlDm9L4_{RgbXGSpaqWLhIufw6|LKvd6d^pQ61nKTb1NkD+bzEl3S{?IZoE<3QOufK8!EgsAwdck%eWs{2+@AN1 zsQTnQYsoH&JA8*sXo#dz45z~xKoLcZ>T#-IyeLl4_Y{o)rDN%Z?JZ5FJj<*8$Aqqr z)EM%Prjzabo@I#cM)&$R3oW`+E?T>u0R3In^8n!BnG$k6_X%X4EyRvQUY2E`pR@n~ zV!c6;M_SxF%|*m-15S98*M)7^p?cRPlUESYl_=y$Y$+dVr0Q~th=2z9K${%U4Nq!* zUEHbdRUdJk0z~YuzPKSLbXXkxC($8FXXqr8Gicy-PQD9#OP^sQ@X~)7dg5^qKc>R0 zB;#%~{UmhM`(b>)#}sa7G*WURI*?&~q!NK?wDz_Lyr{?zQYp<6a{ih0>n7FE^3Ki2 zCB&_y9P(!YUNI?rpxRn+`|2}>k+Iy$&~v~#-sS%?B9IyGhWXshTgb&*CN}gz6}~ocXTaBs1En=f(F4fn}5RjlaTQM%#Z-XK-VG$TUo{7J=^_JV|He zK%(oz{Kdh$KuUACo`P_mN_&R^mXZYW*Ii8nPb+uN^^j+(O1qrwdqpO+kV37Uhs{+< zT+lBX3Ca`MQvMSlkZ1DvlMP;MRRma=g8+wp#aU*Zt5qg9>F0Gb0rb=Biw)fi@LyLwK|VFImGM|I-^ph2Tq_6LGrzFk^R`99zwJ!u`K?1O8m$5y@3`trR2?=Q`tYp{Ly6aqgLn23 zMW~V7voo+G6mwfVq>{7AHwW!ZR`E}#`e+f1TgtdEb$DA$q#$l)5G{wD;1B@4Zb;rn zqa)Xh^_iY?92`8gIvDTyHS_ltD`yPzj)VD@&$>)uy0{6-&#F8lMQ1i^J?JUf0+Ld$bW;*Ly2wZeB|%_eD3kat$jY>&ZAB zsj>MydlsAnn$`%&rql30LOe#a9BO_nc$0go=snmnrKLSpt2+dgakq&R3vf?oa(L(Y zpuEp8B#Ee3#2xP&xjDR_7ymIH{xt(ks9EB$n?28)pBWx*-!F93DAz!gh9Tt!=38;+ z2-3WR7qrD#C!&bS_!_oLxte+!DR%!7bA{UMM+9Yqkp$C9!Qp6Ld4=X7?d3FWZtxGJ zJMtLgZzW`7EZMuspyTZ^qAu6Pi%H$}p)JjwOwj^;1(PW>w~$*@EWM<@7cIegwj*`` zr$_qFl?pkgPcdY!VYYU5cBHgG0`h=+Qknw#FdiZkaPpw=LToZr>od`C;8h1QwW0O& zn-RV-EC1rJBAQ^y!I7tSFGYPw^X_AYU#f`_eCjT2l)st3;VoBRk!!qZ=e^P z2-xvz6+WD_J;1#8%1X{!wjF1q+s$_LDoK2)E_ALO7-+OG-lQ(uJ)_0#-JtSke$oXAA{3;Wh+Vl@W@5Uq4s@%u85IO zFgceadD{0h7HOSo!=u2ddjdvX1=U&xudI5VZe$p)x3z%us?`PFaFcxVCnO!0Qjl$_ zP&5f7j>R78B8B*~r*>79MqT@JU9(X5gSKJ&`+Y9$l)AzNlZvI1i^SCsA-5zefP|Ivz^;FzsjZ^)pE_Zm6LV6pyh6RZqs;jeL0@R8gx zErMC{zUPIp+6{s&v>5Wr|{NkP2l+}+8Uy~2x#b z)wgTqLVsBr$ZnN2hV^1gFNWB|#$&pkV0$4=tulSx?D$LPofIz^Pu__632br=g4*4! z26>I-?^Z1oYsHy8Dzf!>q3<2RV|+$zME@sQz-V7Oa#Q2f)kpNVx0-(e?K?+@F!Fa4JS@ zqX9+f{VFD8uq80@L?Xm@K}5Yvjko+OH+F8(VdJdgD*nA>v_FGdQ_F7S!~w^8D7@h` z=+V1o!0$5Y!%Dg-fV>A;tn%lAHO@X-4?TlvG`=R0_OzELLjwmKna6G^(=9@E&IVjT zZWxg=#@qN2*T&sg9Ghy&O@p2IiXmj}x{o`alkN!s^2OMIkm&Y{lxoi*YQPU$h*?HWw(Ib2CLo_C#rANy{W_ zH3iHVDD~_qZ5;3jpSL&8$bQoCJ~JBZALMc5$I9L|1uktJ@)s;#Lr$wOE#~)si92o1 z42Mpat=Gi}p43EvrVD(A>7xCuUaDO!dp~xJ&6cWgN!j@p&^dfJuc<8E^})tHGBdjt zTN{fm63BfsC*&m=x3>|uPri;iBwfHo+n3=hz)=a47*?`)O_L`yG4_C~{GQUe&Zc{= zeB=q%rK_kDZOs_VRalTeB{=g>O5l-6*3kU*$JFyx8;w(Wf2+WYPUj?BJb~2_ha}>V z%nk`RM3}fhYzY&0&B!JziIu>ZW#^Pw*bl+1?JM}&aj*s-*r^hc*K*T8J%b2Z=}EK` z+(hKsp^a5+s{K@s+MFjUAcz7Sv}DkkbU^Zd;FRBk`@=hLWofiZVsFd!$pNbOEJofP z+^*y}+S^_@Dc|&k)Yj9FUXznw|D~HE#RK%I&sT#n3HPU`JvJ=kc@`)^2d5WY^;qPBeZntu zPx!&X_lJH;(eUUefiC3w!H?-o?QzwK#7S;qBW3h;?}w12R=JsL1_+F!aIzYPW?8EyS5 zBK*Cdm~BH9?9v@+fF!ZKin=wK2=nUJiV@fmLaHL)ud!~lB^0+oWTVRNQ$m?hY10`D zt(ZR>XxX;dmo6AwP$xrczhc-RYS%B3Db_~2Pkq++H}c01v6DWNCs~k_@w%K*p$*I& zC%RE8*DRlLVp^5|wkDCG}u({<_2I_b(|0`Hq)+(G_i7-^t?Ci zR7GLY+svfW%EO{qj^o8uK=}8|d!}bR(@gn)c2keumK=pn?|yG2tO@1|C;u~pDMT0U zJ_*4`^NCFk^&h{Tc>+pke1j4V-a1-v3(Jx1}XCQr)0k3;Jr$BKU_O{ z^Y(edS&C#8(`zr~$LGEC2O5n9XZ(*wPA@S8-^Vl?z6>s8hRFt=PSu2()M{KIvWzdA z%U7jbZyMSCST7)$QwT}!F_D7yA)CzGg!I`iBGlyXq7S#v89Gd;87vkO(N!wmblbba zQnjL$u_WC(wJZFk>J?C96vir74Mnzo-Fm=kNPu}S{oaK{vM5M#m7zU2JcD*20xR`0 zzyU51I>Y5WvbjZAUzbBz>g$+UtG74i8j@10t4F98KbQb5jumdn;cs(DVBX+ z4W+Ie$62cThEsArj?0xZ-Uk5>@C|>^4AC-&M@{&TAn!;1eMaHv%PXm@U`b_Gt$x2;LaGx=ptkcruu*#QG z2WNlC{@9;7e4_8bEXTUlivyiWB1a|-&4fa>h7=KrT+k$(@XzHQSv0y+^G6zSm_Rh< z2mRe-mh6;MnPuuPKCz?T&&toj{7`Cqu^QBYyqZlK%uTH6SWMfRju%`r95;-s^%8oA z1w_rC9h?-VDCk!)aPWs&1ADkaKYD5+R7Dd0p(QWyJl7~taLcobzV2!}cQDi>Ig87V zo0R+6o(}KBKFr68e@YdgQ{siY#Q>tXA~pbYn*enY7y-E19I!bGAjIH>zwy^S@dDdT zgF#oDFzI(FV6M53BK(eQHaW*-_8?J@$!U-ZEJ%@MG-9;IB2&SPB|ENwVo>yCF!wRk zts@g%sSMpuX0gMUmaTEgPFvcIIBjYq7f+zilz?dyh+1b4_7Oq(o6LKm9*qU%GpDIn zM|q0XB=IA66SE_xfDA2?4Rd26k=nor1OjAQNW zR|KLYRx1jmEr2eRo5C&e?VP%W&+Hb2`pnU$7_XnRAF`znH@zHTyV2Wji|LZWY92wN zcA=qxYugaaRXZ?e^QBQF{@^CrD3u_SU0|EY>Q~!CqDjS^s+9?uni7Cpc&I!3r*}rT z-t`Oqk1TcD#P;&+-9$RuN-nFgy0GdKcdZu9HbI_Hz=-Mlf?e7v5s2*s^$Hu}Z&gZ^ zH@4m19+dS&?Q|noUgvIJFYed;C{QUiWQ_`ea*aTDI7HF}SR9#UD==hB|5|isNYNq) zDrRM6QZvZ`Lv7dfUIZg$p}$=Zgzyd5FL9_N<24p!i6lZ&f`={1uK@FhkZg*|-QPh= zzF(9W+-FzbIQ+RtbtnR0Rwf~A+2Q|={~{_vD&206Zom4`{(jP3$0F&d>etO5I5-VA3wSJW7{`<{=)ka0f$#TqqFY_zOd)u ze<5GjIsN1B;olwh)YFo;p8EJy#=&hcdnTEO>EQfBl=eoE?`H#XhQ6g!(S(8Qc@Gh) z1gAs-bLpV_>=bJwSQgTEFHm=aB64Ruf|Sx}C;>NxV+%hmz&x$7{94HMx%RO33BB!< zeE&JP=qfy9o&MwY}=kc3h;S6ZG;vNWvc13N*) zYP%X^#)?Gp(kWInn1Qai;aMATCwww4w?vNyVx!0d7awbBS!`l_x3A6A#F8W~breVl zV9>v^X9;eqX7ASaJHQ_vG@!*D6PqbEJcCEm580h@{H%d_1`j_qv?pv_Y>0?HFeN(X zRLpr?!q|IZK_;DI&SPhWl^u`{0!7|^&UziQ2fbmLW^(W4Ao$IVWdKMY?*vTYUoQ1V z1h0G~9o~*b46j1b!S`Vp!9Y~}2WuX7o>9cx$Bv^EclpVdS)PKEt=~vKv2hg<><~9_ z=R@|t2y~XURJ02zJ+rqwMI+XzT@>+eS`nCcZt^4DIl*aOP>Vmfd$>bWYy9bT`BxFEFZg$JE`0dkKg19|nw^^`KUxW5@P?*6)M;G0>4eeIAJ*km<0clT|1vkuEMQEFV&_)8W0rb$W_ zipqDGBl#gdYh#QnxE=C6x8ZWaJKjRCwLJf3qOJk+G1^zkP0{G+6Vx-v$N;=WkYc6n^A>!_ts;dzE%z z@dae{wrwy!KVR;a&v(u{)C`P@N72*Kk#A8dkrT`23E~7jchj~L<;TZ$K^zTw9PDS> zkFRseGc_j*8_VP3K__m+@#K>79DUz3lPTw?hw(o3d;L7m#bn}ltc;eSIMr|)$(Qj6 ziX1&1(H5o90w&et_~SI$r_R+3;vX!lM}62P)4afDEgazt#(vE^l;V9IB5BlnvPKHw ze-m)@j)-v5>eTT%2fU}PYPzRU={sq8iL2_Ds(gX(`Q=uAv1^^bz-GASpEH^|J1K3> z1ITn~-VpQA7H<)qa*g-Uh98LS?KNRHM?L-FB7|r}!>ytl(Cme3Zna`zDyo7?Y6AA7Pdp&K7qX=5S z2|PIq#oTsdrU2<2>u7qhl=pKAel~rFG*9ffV$UEA28-wZ``&^t=L#EHG;xRB(U{## zbttnPbvF_>-r;a^@aYTXNuqQ~>^t=2gzn01sta8y;5LcHp9BkW3vEO>gfzH?ASFuW zN$c)@Ke|9>1R^xQ)W1N?Ccb;Qg|*mxXkG_X*feLTV_1if9ebMA#QQsNPH!=!73D5} z_pI1=wWmpZMd0HZCghXL$W6&RNqFEI!}%w7tC{uLcQ4lDEJg!Yv%2!EyKf}d zy~r^?MjKb$0^zh-EgG|^M>~J1ZcGn7PpaV+eMG&l3dnkmkwI5Z`nm|ItjGpG`@UKT zH`?=o*}7lrATTu3O!Ox0QEK?Ps}<1!;&^>1=?2+Fts~n$92*Nb$_6Y?*ExTkHT%Nz zoSl*o7rPrf4Ch$q@I^KY4+HR(0PvG$3H-YT{wA05i*_Z@MFhuZBhX~B zF6=BvqE3|EV8n~3twbjQTjm#sC08HW_^>$=W$m2{jMe!GIs_oR5u`A1y}^MvYjJU%sV{Q&1Fzp7k7e)RPrzG zE2Hm+WA31@V*oLW#)BvHZ2l{Wt3V)%AMB@DXaDl77;_OHi72n9r>B=8#Owm7K~EvF z7aM;^kkP&N-?HMkv0I?*s>jUBW&ajBc?YYdqo5ZOFxKe0a_UlNWjnC#FScGd-!Hn^ z@Cl18^!l)PAAv!WK7)xpz^4&g5RiGf?pG{N!V6n4S))?G+a$rZvnoF(D|fy@;lb15>kttHcX*t3EjdQ-dOFDLZm&h=D_ zL}-W*lZpHk&(*^5N#?rLBZ4{QO{qxi1@WJl*?ur02z7IgG*&oGgMk+IXvtsyD?nC$j_w0ePi)$*jk8*MGS6Qqt1z106s zkil))W)g0Z*(H0%{PV_SOU2=n*(?o+S)UljXA5D2p$dmiOddsZ4>WyLGXL4)epHY= z*>3s>)7IhsJVzNkeW+m1ZaP9qNcvWBNUrm}#gD>jGvn^QsF{gl^k)rzhts3&wEQHW z8?KIiIFbf5z!i#?+8QWi!)s@b)>_IP{C&)8czGN{ckhRWt4w}8L!5uSwZ8ZNy>s{+ zlsdiblTS4MofT5pn;M0DG2kqjpv^Mj)ejq&>u~sDl5tH3`KQi@K6ENDNBl4LWZsr# zg+SDd)A}*U6Qxw$rIg4;a=IqD;c@OP4kVe85C4^*9Wu#Xccm&`-_vilao_o4>0H8<}Cd_TH_#12LYJ#0KK--V4!$4f2-jVcKr#2n|Eb?MYAm%)Jb z7#=?Ts`vGE$@r`B!>^CHu)y>B1Njvs?_cGXl?{;{gDU6?vD>SvV z9=&%Szwd{5$Kr*98l^3gRtvVOaIlB)d@(b zMKm_i#dF)f0L3A(%Ux&rufE7&-y2{#XVN7cc>h*GxI>TqlBW*R)9nsCwuK&!Z2Iko zoB6Zb*LZTS$fuU0O}ksvqE=tPqyyC)>s8o;qUTNDahepwF3`lgZ zLl^AUO#`zW1jY(gUUj80OR~Uzp?QXN=j$TkpqC}_HtLC9H;PNAQhWq(S!w7yKLWH<(2IE7{@8LOZRJMz#N4G1$v0?B<}Z z7>5D6{{_eWYzv9c^REv)=2usLoDM$*^yRL*eB6zOG+4CPKBdhaF|R&hCj36be@Zkw z8-Ov|W~8Brm6}Qt!l|B#Sak$N%OoUCXA`Xr(1JEe0ub~UA>fnFM(fWuPl$2j9%63> zf2E!)*$Iw5Cq6GB`n|+Sgj$On3c9lq%Q-8PL*w$5+2zormCop~;L?Zp(-&v_pCIXh zGgm)P&7BUL+cFVT<}Y42&VP6R8a0!cj%w0Tn7jYqyTr_mtBmFLDdgJ==YKJAe%}gw zW8iyP?{l2#JO3GQ^v%uMWmQo0Hz9t{?H>ik0O0sIFlhX5=*_8d44Yzhxl=MuHO(*& zKCNVBRw5p)fqZFNviqHvHqWtRNCXF+`nSz>55>WyI(a})Tu@*kRGaNM4W_=BWMdX$7(VgOd;+#0H=^^L)!W9%>XZZA)kbbb{yLyQ?T6!E zoIwQoYFnrPGY7~)OSM{WRALB9{@;4MaDUcsWn+}9T5p4}mhgh45e~DQZxISkJU`R> zKGe|p;_?dqWJBQ+IFvQ0bd@eDFo)f2HNd37!b*_jTgt`P*mthv;2yqQ!ucRigL^-4 z9wf3jd$cQ42hLZ{#74w=uZm2$KV?T4iBWci*hqe#3a(iGL7RYk&9z0_tn&QoX#De(h&>GQO#ZhsH{OBPnD+k7$z}eJ(Q5MMu}cYy zpojRkQQ@XZHCY#`-AywjxeF`-$Y-M4gjy*zU}?GvftZ`~p#^DO2V*zJ_Uu9Omn_r^ zPCg{3ouCHN1X|d-9T$5;_?=lBya$%B4cnjjewEVSx3s8of=t)$UWwl`{Dn9WOFLzo zU|ZY%oN(HK>2?om!W^Gm*9$n5A$En+q9K+ zUsyO!_vImWCG&%r3*46sSYI_su{dz!L>~evfpWX;)8}-WqLF=lO=j301L`xIp4xCh z>Sff~)aziRdhXE+j$s|QUE_6j*S~AQ9p0`UI+Cu!gIc>2J^j~~O_!xB-^!%-qR7t| z_|TUuJbUBh=Y>@M$1{b{^h>jW3Y2Mcr`+UPs|(ff*SG09>49}`$8|^+A;Bv`?2Iu7 zL$d#O^OF++cZwvZf`Ne8zr~4guoIaoN4j5!8PEGI$41dZg50s4VNp|4Q$#da)E!g; z_slifH605f5VB8-um_7I<^UBpfVSiYNR{+)iPG;IeZnT~leUTuxsq0jZPrg|raC1S z*dWFudSVx+bm~S2`tbiXbroPyHQj#~cIjA<&Xo`lB@CoX1nCr(j%B4omhO};r9pN< zQc{ra5LCKTxA=bX9c{C?Tc85HYGy&pi0d+6^= zO5&Y8U9zO;xxOI!bR?8<>B7<9l(Y5fkg7bk5r2nvd z5Z69Cw$MD?hR2FkA7Xs4YCbP)LIxe8FYy=+YI;(h#tgmSpRjvEXSmzP^I2lN)Szyd z{YH)&AzA7^DE;5X#tUi}-*&&AdsF@A#r+0xY->yI>uIv+Zd1kBlJhy{y!OOUTHck7 zH9f(`4d-L3;^#Rxeb455(U6p`PWLp%Zd!B5?JT;RP)$vW3#23jB^e{oLewD59&`J% zP(?APRFCMqAH0>Y10oz<8E}|b=}3sN#9B&x=S+2)fA*k_{aU^l?5|IfAN$}o%QqZG zlsa@WEdAyZ-wj1j0D54{-yHnH!>)TcHiW~w#I(b`3kJ17zfwG? zLj>R~BJ8KP`ff|?Sl^+s-*r_~LrkzQ_`K5cwt4>za(wVH`}QuE+}*#AzOc^%Q9bUs zoca0#BO*W{8JX)u@ zNR(}ERnIucDdth{(b|aWElGFcUQ+@vX}#Y5IpdqsBdVk)c1maZDf=~$i*$*r{h&JV zpo9)x+*_0ZDwiLscZM91kw>ci z0yQKRu)abdT;I@SNcVCn(kGm|0k|$i_-^0$IbiKS(Lv|Mn>3r0 zX3QeQ0B+S@uf3eOkMwxcJV;6(ohNjYa3P2--!Z|gLd8{5+)#N zU!HRn0py3WpX|BxHz^zB+{&+_d@l+wR+EiYFq=Pi1dH>5cr3>gadA-za@yPYJl_O$ zDFnY)v{HbU(lqUg`x3xW$xf0sd|-bHEOM+Gg^uGX+ZgrkSYi9hs;Fs!9X*4|UAGJ= ztJI!pKJ< zU#yGeKZB1`r7yLz1ea%gJ0iG6vnNU zh@y?>n?ETHiy_(VI?P9&ditphd5^rRK7W7Wf$|cBH}hU7zaA%@;A!03O)no1QVd6kT&)-aP1+?^4S$IXz0%mbHgk9r$v{$*JUDXej~`4Ve_ zotytI4mLanz}@!dN3HMJMim{)7WCAF{BFD{YXS*SVnt|30h$PssE!xLHfeJ@KMSB4 z>1fJCzTf9P1;pMpIl!7E7U#+qUtbw}?c#_(o%cX3Q%Dq+HBqGEVZ*(KoA4AB9psg1 zYm_gL%i@+b5#q;VJcrfo>Yw?gz1doMtc$^=lGfT`~oeA~d_eh;ie~af^HuJr(Gtk!awl0g_-y^`%q~TLBczxNB221W65DLaJ(TR`w{txRD zyuu46Y+bx1UMBjhb41|1w0vh$_(AViyTCyxkJ!b=$6P{co&>x{u=bYvVAZN6LZt<- z=r^sM!AnF?(57E{;B9!3H);z4D2ZXz2h%jhGR~0ajone%nM;Cf6f1d!yGAObZ&*MQ zLq1D*21^_M8$0pPnnI@Gx^;rL#l^zZ)!)-3cU{sZ*5-0z zPnFmAJu>pK8n#61`0Pd2i>EGgkscr3^!IfOo_=t{Uv0)lt+A)*qY}J~$GGN0xuK|+ zQfK3JI26v94?7nC6=q`|ZIeq_VyaM95kFmP`@kKww)X6olQm0^rmOvl0j?q0glzIQ z!VY8oi~f02rC(!Ta`&piuetW++Rf5`#2AcqGYDfgBk5HoBm7re%YTBy>1yu%f>& z;|=mGHmqbcCO%s>S>(sNIx}(w`yXim7qCP%*QIkMwTvb5iWx_FmA6IAEk$GU?J zyJ+%v+DmR>TRo6FYwQp51Ci6A_tJ|v0r^%d(QZME@J* za+p71J~@%d#R@bDKrY(k`{BcqOLkouT(~)A>a4!^Yh?4i!J{7oUDMVct7{WiMpYJmGPL3?|P;VGfKoxvtc=9 zZN$)7T^3~J8!AkFM(MBW z@g{yPg5ocGhu|?Nf^JB$pD2-%HgetvV3Pa`6`4|LlRzstKR*CK6d10iB1cR>M}Vm! zmVYUufuYbp84m|@M0$E2V+atbAtwze?Pu7;6l4%E`Pa(IfIq$A0f3=a0MMT%m`sPs z001@`2*Acr;Gb(~tpCslJ z8^Blxvj)CI4xa28_g;sF;vQsdcgr{&jrW}wci+e?ggk%826l|b4Qd0n%uBFGnBmOp z=UGL3`m|>8C{lNkv2(CtMhleRi#(aNo2e!Pcmr50HcXe5m6dJv_0tt4 ztSxQN0=`8`kjk}3<|-=aD*CsxZ;e<@XK4&jo zcMf+d_k1xQ;d?QGUlwoM7h@(gGBP8y4M@|&%WrJ)^z4{=4ba~Dx8HX zy~kCr(v-}_Wu#?ONG4=3u#F^%A4w^i<(MZLKDDKH z)pU67;P>jw7NYz&zU`}yyl4?h!9};-S$Qa3{i@8!m(z%dh~Vh$XU!AIyZS?Yt`3EF zpX$)dFRxfvTu7jkC6*YiR%wlXrELf^?1SwAGR<~VUqgBb=UXQY->2}b(elP8`{H)x ziM;IITs+<{LwVnPm$R5l<&w|UU}kC8Mu~Ziqhl(Q5JNtvbaZsh%mg9TrA7Lu0i_!U z6zLIN^4|9JQvz{p-wR$8`zsotzNd(fX?GxosXjP4nKE#6wO&$;Az%Mnq_ zpTGmI1X=fc@VwSTEQyhM&Ej5V8QP@hy9YEe@Z#c4*&GvfVXDa7y!?Ef?xQ152j4@Z zph6oKNs)t3)BP{4Rts_w9%p?^xHCe_q`MTIqoWj|y;B5Um+l31O!qT`!md)-+pzHg zG&4^Et)1@OJHMuqGD+pJekV68XZ_5#-;7tgM9)RVMAXM*e@V7?H4A@ee9Q)*B;z;O zDqL-6X>!JdXHDY+B58R3{Q0A;@2@sCXDB2oW%x6&0n3eSM}?oWy!8hZY)F0A$2a!N zNh51HrDfl|QJ3w@5!(@Bfb<0f1aRut74{4qO?8hKGb;BfSC&iT=-s+VlB|o2{7hP~z)=k1HJh??8q$?KlN63StsFlshJrOvgt;T&pwvR@OPb3yM-|BTZNp_xa>@+q$P0@N?00ADY}C~& z+6M=JLCNu@M%~qpG{T-;&LRhlyOL^?y*#yLvegZBs8)yTOE?T??laUm=FL$@7nLrn zk*(37-4t+sMlb*xbK)pAZdkv8?miWuIp~fkc_|OR6TABUARIrdtSr`3g@Ay-7M+hs zdC0?~67&N~!lW24V%|8An)kIfiKjEEBrT2=Oii7?XAdz)eVDoO0$83Lx7J2mzAMk^ z#snnsBbMjHQP8^IsHUDuT?8Xu6%h}nk93!#bCh>+aj7pY+8rcR}%H7`wJBEN$y9o#oq{)R90R!WhnH4s#Cz@lZ>PKKa?4yplP{ z2OQ;uaBT5{-sBcr_Sm%k-I*HI5H(7g$8jezY8E44wDmg1c>JsFlunvPku$*z;3mco z8SXC2(6{2WvU)MnHgaJ`4i!`o8cPdZ$^U?ftpBw2LHSE@3(Pib{3b&NhkJJZdWeW2 z3dGRk%r}A6^!w^cRLFG)=Hce%c2-g|r$-Ew%>r|OP&wL9`+6#Bm?7Z44Rxp;so`mf zQ&uT^$I4G^v)*dT;Lb>@v<0oe-%Ex;t%KY~XkUbTRhr*DW=hI~Wmwk=dyB4Govb{`DSjz@6H*NP_@$lSnNYGS z*o|`UlsY$m&ETUM5L+O4_Ce@jKd-K)gqgX9=*B=_$V4y33v12v2)be18ITi1MXI5# z?MfIl|1hlkX(pU8IEM261D#dJOq{P%f;r~zzOwdSv}qB%4q}0dyM5;? zfp$DH@-&-dj!MoGk{W#>g~nB7EYz%I3>EJv&(E4JEV!iOcxlCkBJX~(lN-Cc!IuE0 zc&R8ym5VQzt0(MvY$;KFpyTdKG3U^|NweZ;up8Sw*W_g^8?Z@RFQyglqnf5S&a`dC zOLw!=;gm#OnfJ?*$<(=rwO)}XC`eq!n6D$ef?)YRO?o^|_g!sXuxry95_j{7qaUO4mpbK+gT3s3l`$tq< z@=?LbY`cf=cta|~^X{4@OdYWBRT&Yy#a()}EgozimA!S+l$04FsY{8|S7kFXCxl$< zWrf4x945!<`!~nbp&Fqd{m2Iw+XOM+>^ktqVhhGGbiN~A0;ZuSzt3Mxc{2W2>Q-5M93*!GhBcM{Lva`iILazS>}ZJ3HqvS#Ela2@D)9DA7o~ zEb+GF4xdWwD#`B3?M=#p$q&}5X@F+Pps+3s1`8ybq>BD(@fl1c-J`4;gCk=MCC;+) zd>zok?Pm_6d=dnEHaf}>`En4fZXi>UCYy(JT=3yf?_&x)VC7Q~%kTPyLD?S6aoj7H z)J0QYW1oZXkZ2SIlNvv7JJ)`rK4ht@ySb{yDHsJh({2xsVlYoEpsy~VCFZu8B@c#g2Pt-U7 literal 0 HcmV?d00001 diff --git a/macos/Info.plist b/macos/Info.plist new file mode 100644 index 0000000..3b44832 --- /dev/null +++ b/macos/Info.plist @@ -0,0 +1,18 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIconFile + WiFiCoconut.icns + CFBundleIdentifier + org.hak5.wifi-coconut + CFBundleName + Wi-Fi Coconut + CFBundleVersion + 1.0 + CFBundleDisplayName + Wi-Fi Coconut + + diff --git a/macos/WiFiCoconut b/macos/WiFiCoconut new file mode 100755 index 0000000..77f4f70 --- /dev/null +++ b/macos/WiFiCoconut @@ -0,0 +1,12 @@ +#!/usr/bin/osascript + + +tell app "Terminal" + if not (exists window 1) then reopen + activate + + set UnixPath to POSIX path of ((path to me as text) & "::") + set Coconut to "exec '" & UnixPath & "wifi_coconut'" + + do script Coconut +end tell diff --git a/macos/finish_release.zsh b/macos/finish_release.zsh new file mode 100755 index 0000000..8c7e571 --- /dev/null +++ b/macos/finish_release.zsh @@ -0,0 +1,30 @@ +#!/bin/zsh + +# Ultimately this should be in a cmake target but getting cmake to build an app +# with multiple executable components is proving extremely difficult. + + +# Step one: Make the basic app structure +mkdir WiFiCoconut.app +mkdir WiFiCoconut.app/Contents +mkdir WiFiCoconut.app/Contents/MacOS +mkdir WiFiCoconut.app/Contents/Framework +mkdir WiFiCoconut.app/Contents/Resources + +# Step two: Copy the pieces of the app together +cp wifi_coconut WiFiCoconut.app/Contents/MacOS +cp ../macos/WiFiCoconut WiFiCoconut.app/Contents/MacOS +cp /usr/local/lib/libusb-1.0.0.dylib WiFiCoconut.app/Contents/Framework +cp -r ../libwifiuserspace/firmware WiFiCoconut.app/Contents/Resources +cp ../macos/AppIcon.icns WiFiCoconut.app/Contents/Resources/WiFiCoconut.icns +cp ../macos/Info.plist WiFiCoconut.app/Contents/ +cp ../LICENSE WiFiCoconut.app/Contents/Resources +cp ../LICENSE.firmware WiFiCoconut.app/Contents/Resources + +# Step three: Rewrite the native code library path +install_name_tool \ + -change /usr/local/opt/libusb/lib/libusb-1.0.0.dylib @executable_path/../Frameworks/libusb-1.0.0.dylib \ + WiFiCoconut.app/Contents/MacOS/wifi_coconut + +# At this point, WiFiCoconut.app should be built + diff --git a/simple_ringbuf_c/simple_ringbuf_c.c b/simple_ringbuf_c/simple_ringbuf_c.c new file mode 100644 index 0000000..12fa975 --- /dev/null +++ b/simple_ringbuf_c/simple_ringbuf_c.c @@ -0,0 +1,363 @@ +/* + This file is part of Kismet + + Kismet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Kismet is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Kismet; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* An extremely basic ring buffer implemented as a complete header in pure C; + * for use with datasource implementations in C */ + +#include +#include +#include +#include + +#include "simple_ringbuf_c.h" + +/* Allocate a ring buffer + * + * Returns NULL if allocation failed + */ +kis_simple_ringbuf_t *kis_simple_ringbuf_create(size_t size) { + kis_simple_ringbuf_t *rb; + rb = (kis_simple_ringbuf_t *) malloc(sizeof(kis_simple_ringbuf_t)); + + if (rb == NULL) + return NULL; + + rb->buffer = (uint8_t *) malloc(size); + + if (rb->buffer == NULL) { + free(rb); + return NULL; + } + + rb->buffer_sz = size; + rb->start_pos = 0; + rb->length = 0; + rb->mid_peek = 0; + rb->mid_commit = 0; + rb->free_peek = 0; + rb->free_commit = 0; + + return rb; +} + +/* Destroy a ring buffer + */ +void kis_simple_ringbuf_free(kis_simple_ringbuf_t *ringbuf) { + free(ringbuf->buffer); + free(ringbuf); +} + +/* Clear ring buffer + */ +void kis_simple_ringbuf_clear(kis_simple_ringbuf_t *ringbuf) { + ringbuf->start_pos = 0; + ringbuf->length = 0; +} + +/* Get available space + */ +size_t kis_simple_ringbuf_available(kis_simple_ringbuf_t *ringbuf) { + return ringbuf->buffer_sz - ringbuf->length; +} + +/* Get used space + */ +size_t kis_simple_ringbuf_used(kis_simple_ringbuf_t *ringbuf) { + return ringbuf->length; +} + +/* Get total space + * */ +size_t kis_simple_ringbuf_size(kis_simple_ringbuf_t *ringbuf) { + return ringbuf->buffer_sz; +} + +/* Append data + * + * Returns amount written + */ +size_t kis_simple_ringbuf_write(kis_simple_ringbuf_t *ringbuf, + void *data, size_t length) { + size_t copy_start; + + if (kis_simple_ringbuf_available(ringbuf) < length) + return 0; + + copy_start = + (ringbuf->start_pos + ringbuf->length) % ringbuf->buffer_sz; + + /* Does the write op fit w/out looping? */ + if (copy_start + length < ringbuf->buffer_sz) { + memcpy(ringbuf->buffer + copy_start, data, length); + ringbuf->length += length; + + return length; + } else { + /* We have to split up, figure out the length of the two chunks */ + size_t chunk_a = ringbuf->buffer_sz - copy_start; + size_t chunk_b = length - chunk_a; + + memcpy(ringbuf->buffer + ringbuf->start_pos + ringbuf->length, data, chunk_a); + memcpy(ringbuf->buffer, (uint8_t *) data + chunk_a, chunk_b); + + /* Increase the length of the buffer */ + ringbuf->length += length; + + return length; + } + + return 0; +} + +size_t kis_simple_ringbuf_reserve(kis_simple_ringbuf_t *ringbuf, void **data, size_t size) { + size_t copy_start; + + if (kis_simple_ringbuf_available(ringbuf) < size) + return 0; + + if (ringbuf->mid_commit) { + fprintf(stderr, "ERROR: kis_simple_ringbuf_t mid-commit when reserve called\n"); + return 0; + } + + copy_start = + (ringbuf->start_pos + ringbuf->length) % ringbuf->buffer_sz; + + /* Does the write op fit w/out looping? */ + if (copy_start + size < ringbuf->buffer_sz) { + ringbuf->mid_commit = 1; + ringbuf->free_commit = 0; + *data = ringbuf->buffer + copy_start; + return size; + } else { + *data = malloc(size); + + if (*data == NULL) { + fprintf(stderr, "ERROR: Could not allocate split-op sz write buffer\n"); + return 0; + } + + ringbuf->mid_commit = 1; + ringbuf->free_commit = 1; + + return size; + } + + return 0; +} + +size_t kis_simple_ringbuf_commit(kis_simple_ringbuf_t *ringbuf, void *data, size_t size) { + if (!ringbuf->mid_commit) { + fprintf(stderr, "ERROR: kis_simple_ringbuf_t not in a commit when commit called\n"); + return 0; + } + + size_t copy_start; + + copy_start = + (ringbuf->start_pos + ringbuf->length) % ringbuf->buffer_sz; + + if (!ringbuf->free_commit) { + ringbuf->mid_commit = 0; + ringbuf->length += size; + return size; + } else { + /* Does the write op fit w/out looping? */ + if (copy_start + size < ringbuf->buffer_sz) { + memcpy(ringbuf->buffer + copy_start, data, size); + ringbuf->length += size; + + return size; + } else { + /* We have to split up, figure out the length of the two chunks */ + size_t chunk_a = ringbuf->buffer_sz - copy_start; + size_t chunk_b = size - chunk_a; + + memcpy(ringbuf->buffer + ringbuf->start_pos + ringbuf->length, data, chunk_a); + memcpy(ringbuf->buffer, (uint8_t *) data + chunk_a, chunk_b); + + /* Increase the length of the buffer */ + ringbuf->length += size; + + return size; + } + } + + return 0; +} + +/* Free a previously reserved chunk without committing it. + */ +void kis_simple_ringbuf_reserve_free(kis_simple_ringbuf_t *ringbuf, void *data) { + if (!ringbuf->mid_commit) { + fprintf(stderr, "ERROR: kis_simple_ringbuf_t not in a commit when commit_reserve_free called\n"); + } + + if (ringbuf->free_commit) + free(data); + + ringbuf->mid_commit = 0; +} + +/* Copies data into provided buffer. Advances ringbuf, clearing consumed data. + * + * If requested amount is not available, reads amount available and returns. + * + * Returns amount copied + */ +size_t kis_simple_ringbuf_read(kis_simple_ringbuf_t *ringbuf, void *ptr, + size_t size) { + /* Start with how much we have available - no matter what was + * requested, we can't read more than this */ + size_t opsize = kis_simple_ringbuf_used(ringbuf); + + if (opsize == 0) + return 0; + + /* Only read the amount we requested, if more is available */ + if (opsize > size) + opsize = size; + + /* Simple contiguous read */ + if (ringbuf->start_pos + opsize < ringbuf->buffer_sz) { + if (ptr != NULL) + memcpy(ptr, ringbuf->buffer + ringbuf->start_pos, opsize); + ringbuf->start_pos += opsize; + ringbuf->length -= opsize; + return opsize; + } else { + /* First chunk, start to end of buffer */ + size_t chunk_a = ringbuf->buffer_sz - ringbuf->start_pos; + /* Second chunk, 0 to remaining data */ + size_t chunk_b = opsize - chunk_a; + + if (ptr != NULL) { + memcpy(ptr, ringbuf->buffer + ringbuf->start_pos, chunk_a); + memcpy((uint8_t *) ptr + chunk_a, ringbuf->buffer, chunk_b); + } + + /* Fastforward around the ring to where we finished reading */ + ringbuf->start_pos = chunk_b; + ringbuf->length -= opsize; + + return opsize; + } + + return 0; +} + +/* Peeks at data by copying into provided buffer. Does NOT advance ringbuf + * or consume data. + * + * If requested amount of data is not available, peeks amount available and + * returns; + * + * Returns amount copied + */ +size_t kis_simple_ringbuf_peek(kis_simple_ringbuf_t *ringbuf, void *ptr, + size_t size) { + /* Start with how much we have available - no matter what was + * requested, we can't read more than this */ + size_t opsize = kis_simple_ringbuf_used(ringbuf); + + if (opsize == 0) + return 0; + + /* Only read the amount we requested, if more is available */ + if (opsize > size) + opsize = size; + + /* Simple contiguous read */ + if (ringbuf->start_pos + opsize < ringbuf->buffer_sz) { + memcpy(ptr, ringbuf->buffer + ringbuf->start_pos, opsize); + return opsize; + } else { + /* First chunk, start to end of buffer */ + size_t chunk_a = ringbuf->buffer_sz - ringbuf->start_pos; + /* Second chunk, 0 to remaining data */ + size_t chunk_b = opsize - chunk_a; + + memcpy(ptr, ringbuf->buffer + ringbuf->start_pos, chunk_a); + memcpy((uint8_t *) ptr + chunk_a, ringbuf->buffer, chunk_b); + + return opsize; + } + + return 0; +} + +size_t kis_simple_ringbuf_peek_zc(kis_simple_ringbuf_t *ringbuf, void **ptr, size_t size) { + /* Start with how much we have available - no matter what was + * requested, we can't read more than this */ + size_t opsize = kis_simple_ringbuf_used(ringbuf); + + if (ringbuf->mid_peek) { + fprintf(stderr, "ERROR: simple_ringbuf_peek_zc mid-peek already\n"); + return 0; + } + + if (opsize == 0) + return 0; + + /* Only read the amount we requested, if more is available */ + if (opsize > size) + opsize = size; + + /* Simple contiguous read */ + if (ringbuf->start_pos + opsize < ringbuf->buffer_sz) { + ringbuf->mid_peek = 1; + ringbuf->free_peek = 0; + *ptr = ringbuf->buffer + ringbuf->start_pos; + return opsize; + } else { + /* First chunk, start to end of buffer */ + size_t chunk_a = ringbuf->buffer_sz - ringbuf->start_pos; + /* Second chunk, 0 to remaining data */ + size_t chunk_b = opsize - chunk_a; + + *ptr = malloc(opsize); + + if (*ptr == NULL) { + fprintf(stderr, "ERROR: simple_ringbuf_peek_zc could not allocate buffer for split peek\n"); + return 0; + } + + ringbuf->mid_peek = 1; + ringbuf->free_peek = 1; + + memcpy(*ptr, ringbuf->buffer + ringbuf->start_pos, chunk_a); + memcpy((uint8_t *) *ptr + chunk_a, ringbuf->buffer, chunk_b); + + return opsize; + } + + return 0; +} + +void kis_simple_ringbuf_peek_free(kis_simple_ringbuf_t *ringbuf, void *ptr) { + if (!ringbuf->mid_peek) { + fprintf(stderr, "ERROR: kis_simple_ringbuf_peek_free called with no peeked data\n"); + return; + } + + if (ringbuf->free_peek) + free(ptr); + + ringbuf->mid_peek = 0; +} + diff --git a/simple_ringbuf_c/simple_ringbuf_c.h b/simple_ringbuf_c/simple_ringbuf_c.h new file mode 100644 index 0000000..59a3f0d --- /dev/null +++ b/simple_ringbuf_c/simple_ringbuf_c.h @@ -0,0 +1,129 @@ +/* + This file is part of Kismet + + Kismet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Kismet is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Kismet; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* An extremely basic ring buffer implemented in pure C; for use with datasource + * implementations in C */ + +#ifndef __RINGBUF_C_H__ +#define __RINGBUF_C_H__ + +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +struct kis_simple_ringbuf { + uint8_t *buffer; + size_t buffer_sz; + size_t start_pos; /* Where reading starts from */ + size_t length; /* Amount of data in the buffer */ + + int mid_peek, mid_commit; /* Are we in a peek or reserve? */ + int free_peek, free_commit; /* Do we need to free the peek or reserved buffers */ +}; +typedef struct kis_simple_ringbuf kis_simple_ringbuf_t; + +/* Allocate a ring buffer + * + * Returns NULL if allocation failed + */ +kis_simple_ringbuf_t *kis_simple_ringbuf_create(size_t size); + +/* Destroy a ring buffer + */ +void kis_simple_ringbuf_free(kis_simple_ringbuf_t *ringbuf); + +/* Clear ring buffer + */ +void kis_simple_ringbuf_clear(kis_simple_ringbuf_t *ringbuf); + +/* Get available space + */ +size_t kis_simple_ringbuf_available(kis_simple_ringbuf_t *ringbuf); + +/* Get used space + */ +size_t kis_simple_ringbuf_used(kis_simple_ringbuf_t *ringbuf); + +/* Get total size + */ +size_t kis_simple_ringbuf_size(kis_simple_ringbuf_t *ringbuf); + +/* Append data + * + * Returns amount written + */ +size_t kis_simple_ringbuf_write(kis_simple_ringbuf_t *ringbuf, + void *data, size_t length); + +/* Reserve a writeable chunk, striving to make it a zero-copy operation. Only + * one chunk may be reserved at a time. A reserved chunk must be written + * with kis_simple_ringbuf_commit or discard with kis_simple_ringbuf_reserve_free + * + * Returns amount available. Returns 0 if that amount cannot be reserved because + * the buffer is full. + */ +size_t kis_simple_ringbuf_reserve(kis_simple_ringbuf_t *ringbuf, void **data, size_t size); + +/* Commit a previously reserved chunk. Commits the specified number of bytes. + * + * Returns the amount committed. + */ +size_t kis_simple_ringbuf_commit(kis_simple_ringbuf_t *ringbuf, void *data, size_t size); + +/* Free a previously reserved chunk without committing it. + */ +void kis_simple_ringbuf_reserve_free(kis_simple_ringbuf_t *ringbuf, void *data); + + +/* Copies data into provided buffer. Advances ringbuf, clearing consumed data. + * + * If requested amount is not available, reads amount available and returns. + * + * Returns amount copied + */ +size_t kis_simple_ringbuf_read(kis_simple_ringbuf_t *ringbuf, void *ptr, size_t size); + +/* Peeks at data by copying into provided buffer. Does NOT advance ringbuf + * or consume data. + * + * If requested amount of data is not available, peeks amount available and + * returns; + * + * Returns amount copied + */ +size_t kis_simple_ringbuf_peek(kis_simple_ringbuf_t *ringbuf, void *ptr, size_t size); + +/* Peeks at data, using a zero-copy method if possible. Does NOT advance ringbuf + * or consume data. + * + * Peeked data MUST BE 'returned' via kis_simple_ringbuf_peek_free. + * + * Returns amount peeked. + */ +size_t kis_simple_ringbuf_peek_zc(kis_simple_ringbuf_t *ringbuf, void **ptr, size_t size); + +/* Frees peeked zc data. Must be called after peeking. + * + */ +void kis_simple_ringbuf_peek_free(kis_simple_ringbuf_t *ringbuf, void *ptr); + +#endif + diff --git a/wifi_capture.c b/wifi_capture.c new file mode 100644 index 0000000..ed21405 --- /dev/null +++ b/wifi_capture.c @@ -0,0 +1,500 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 LLC + * + */ + +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#include +#else +#include +#define sleep(x) Sleep(x*1000) +#define usleep(x) Sleep((x) < 1000 ? 1 : (x) / 1000) +#endif + +#include "kernel/cfg80211.h" +#include "kernel/endian.h" +#include "kernel/ieee80211.h" +#include "kernel/ieee80211_radiotap.h" + +#include + +#include "userspace/userspace.h" + +struct wifi_test_context { + /* + * USB context + */ + struct userspace_wifi_context *context; + + /* + * Device we plan to open + */ + struct userspace_wifi_probe_dev* probedev; + + /* + * The device we're operating on + */ + struct userspace_wifi_dev *dev; + + /* + * Runtime options + */ + bool disable_leds; + bool disable_blink; + bool invert_leds; + bool no_radiotap; + bool quiet; + bool diagnostics_mode; + bool diagnostics_only; + int device_number; + int channel; + + /* + * pcap logging + */ + bool enable_pcap_log; + FILE *dump_filep; + int num_packets; + pthread_mutex_t pcap_mutex; +}; + +int open_wifi_device(struct wifi_test_context *test_context) { + int r; + + r = userspace_wifi_device_open(test_context->context, test_context->probedev, &test_context->dev); + + if (r != 0) { + printf("Failed to open device: %d %s\n", r, strerror(r)); + return -1; + } + + userspace_wifi_device_set_channel(test_context->context, + test_context->dev, + test_context->channel, + NL80211_CHAN_WIDTH_20_NOHT); + + if (test_context->disable_leds) + userspace_wifi_device_set_led(test_context->context, test_context->dev, false); + else + userspace_wifi_device_set_led(test_context->context, test_context->dev, true); + + if (!test_context->disable_blink) + userspace_wifi_device_enable_led_control(test_context->context, test_context->dev); + + return 0; +} + +int start_wifi_capture(struct wifi_test_context* test_context) { + /* + * If LEDs are inverted, turn off LEDs once we've enumerated all the radios. + */ + if (test_context->invert_leds) + userspace_wifi_device_set_led(test_context->context, test_context->dev, false); + + userspace_wifi_device_start_capture(test_context->context, test_context->dev); + + return 0; +} + +#define DLT_IEEE802_11 105 /* IEEE 802.11 wireless */ +#define DLT_IEEE802_11_RADIO 127 /* 802.11 plus radiotap radio header */ + +int open_pcap(const char *file, struct wifi_test_context *test_context) { + struct { + uint32_t magic_number; /* magic number */ + uint16_t version_major; /* major version number */ + uint16_t version_minor; /* minor version number */ + int32_t thiszone; /* GMT to local correction */ + uint32_t sigfigs; /* accuracy of timestamps */ + uint32_t snaplen; /* max length of captured packets, in octets */ + uint32_t network; /* data link type */ + } pcap_hdr_t; + + pcap_hdr_t.magic_number = 0xa1b2c3d4; + pcap_hdr_t.version_major = 2; + pcap_hdr_t.version_minor = 4; + pcap_hdr_t.thiszone = 0; + pcap_hdr_t.sigfigs = 0; + pcap_hdr_t.snaplen = 8192; + + test_context->enable_pcap_log = true; + pthread_mutex_init(&test_context->pcap_mutex, NULL); + + if (test_context->no_radiotap) + pcap_hdr_t.network = DLT_IEEE802_11; + else + pcap_hdr_t.network = DLT_IEEE802_11_RADIO; + + if (strcmp(file, "-") == 0) + test_context->dump_filep = stdout; + else + test_context->dump_filep = fopen(file, "wb"); + + if (test_context->dump_filep == NULL) { + fprintf(stderr, "ERROR: Could not open dump: %d %s\n", errno, strerror(errno)); + return -1; + } + + fwrite(&pcap_hdr_t, sizeof(pcap_hdr_t), 1, test_context->dump_filep); + + return 1; +} + +int pcap_rx_packet(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + struct userspace_wifi_rx_signal *signal, + unsigned char *data, unsigned int len) { + + struct wifi_test_context *test_context = (struct wifi_test_context *) context->local_data; + + typedef struct { + uint32_t ts_sec; /* timestamp seconds */ + uint32_t ts_usec; /* timestamp microseconds */ + uint32_t incl_len; /* number of octets of packet saved in file */ + uint32_t orig_len; /* actual length of packet */ + } pcaprec_hdr_t; + + pcaprec_hdr_t pcap_hdr; + + struct timeval tv; + + typedef struct { + uint16_t version; + uint16_t length; + uint32_t bitmap; + uint8_t flags; + uint8_t pad0; + uint16_t channel_freq; + uint16_t channel_flags; + uint8_t antsignal; + + } _rtap_hdr; + + _rtap_hdr rtap_hdr = { + .version = 0, + .length = htole16(sizeof(_rtap_hdr)), + .bitmap = htole32((1 << IEEE80211_RADIOTAP_FLAGS) | + (1 << IEEE80211_RADIOTAP_CHANNEL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL)), + .flags = 0, + .channel_freq = htole16(ieee80211_channel_to_frequency(signal->channel, signal->band)), + .channel_flags = 0, + .antsignal = (u8) signal->signal, + }; + + if (!signal->crc_valid) + rtap_hdr.flags |= IEEE80211_RADIOTAP_F_BADFCS; + + if (signal->short_gi) + rtap_hdr.flags |= IEEE80211_RADIOTAP_F_SHORTGI; + + if (signal->band == NL80211_BAND_2GHZ) + rtap_hdr.channel_flags |= IEEE80211_CHAN_2GHZ; + else if (signal->band == NL80211_BAND_5GHZ) + rtap_hdr.channel_flags |= IEEE80211_CHAN_5GHZ; + + /* + * Only blink if we're told to blink. + * Default LED state is "not inverted" (so on). + * If we're inverted, we let the timer override, so active LEDs stay + * ON longer as the timer gets extended; this looks better. + */ + if (!test_context->disable_blink) + userspace_wifi_device_blink_led(context, dev, 100000, !test_context->invert_leds, test_context->invert_leds); + + if (test_context->diagnostics_mode) { + fprintf(stderr, "PACKET %u %u %d %02x %02x %02x %02x %02x %02x ...\n", + len, signal->channel, signal->signal, data[0], data[1], data[2], data[3], data[4], data[5]); + } + + if (!test_context->enable_pcap_log) + return 1; + + gettimeofday(&tv, NULL); + + pcap_hdr.ts_sec = tv.tv_sec; + pcap_hdr.ts_usec = tv.tv_usec; + + pthread_mutex_lock(&test_context->pcap_mutex); + + if (test_context->no_radiotap) { + pcap_hdr.incl_len = pcap_hdr.orig_len = len; + fwrite(&pcap_hdr, sizeof(pcaprec_hdr_t), 1, test_context->dump_filep); + fwrite(data, len, 1, test_context->dump_filep); + } else { + pcap_hdr.incl_len = pcap_hdr.orig_len = sizeof(_rtap_hdr) + len; + fwrite(&pcap_hdr, sizeof(pcaprec_hdr_t), 1, test_context->dump_filep); + fwrite(&rtap_hdr, sizeof(_rtap_hdr), 1, test_context->dump_filep); + fwrite(data, len, 1, test_context->dump_filep); + } + + test_context->num_packets++; + + if (!test_context->quiet && test_context->num_packets % 100 == 0) + fprintf(stderr, "Got %d packets\n", test_context->num_packets); + + pthread_mutex_unlock(&test_context->pcap_mutex); + + return 1; +} + +void print_device_list(struct userspace_wifi_probe_dev* devs) { + int dev_num = 0; + int i; + + while (devs != NULL) { + fprintf(stderr, "DEVICE %d: Driver %s USB ID %x %x ", + dev_num, devs->driver_name, devs->device_id_match->idVendor, devs->device_id_match->idProduct); + + for (i = 0; i < devs->usb_bus_path_len; i++) { + fprintf(stderr, "/%u", devs->usb_bus_path[i]); + } + + fprintf(stderr, "\n"); + + dev_num++; + devs = devs->next; + } +} + +struct userspace_wifi_probe_dev* find_device_by_number(int device_number, struct userspace_wifi_probe_dev* devs) { + int dev_num = 0; + + if (devs == NULL) + return NULL; + + if (device_number < 0) + return devs; + + while (devs != NULL) { + if (dev_num == device_number) + return devs; + dev_num++; + devs = devs->next; + } + + return NULL; +} + +void print_usage(char *argv) { + printf("Userspace Wifi Test\n"); + printf("Usage: %s [options] [output file]\n", argv); + printf("Options:\n"); + printf(" --list List devices and exit\n" + " --device=X If you have multiple supported Wi-Fi devices, specify\n" + " which one to use\n" + " --channel=X Set Wi-Fi Channel (1-14)\n" + " --plain-dot11 Log plain 802.11 packets instead of radiotap\n" + " formatted packets with signal and channel\n" + " --disable-leds Go fully dark; don't enable any LEDs\n" + " --invert-leds Normally we enable all the LEDs\n" + " and blink during traffic; Invert only lights\n" + " when there is traffic.\n" + " --disable-blinking Disable blinking the LEDs on traffic\n" + " --quiet Disable most output\n" + " --diagnostics Diagnostic statistics mode\n" + " --diagnostics-only Enable diagnostics-only mode, disable pcap\n"); +} + +int main(int argc, char *argv[]) { +#define OPT_HELP 'h' +#define OPT_LIST 2 +#define OPT_DEVNO 3 +#define OPT_PLAINDOT11 5 +#define OPT_DISABLELED 6 +#define OPT_INVERTLED 7 +#define OPT_DISABLEBLNK 8 +#define OPT_QUIET 9 +#define OPT_DIAG 10 +#define OPT_DIAGONLY 11 +#define OPT_CHANNEL 12 + static struct option longopt[] = { + { "help", no_argument, 0, OPT_HELP }, + { "list", no_argument, 0, OPT_LIST }, + { "device", required_argument, 0, OPT_DEVNO }, + { "plain-dot11", no_argument, 0, OPT_PLAINDOT11 }, + { "disable-leds", no_argument, 0, OPT_DISABLELED }, + { "invert-leds", no_argument, 0, OPT_INVERTLED }, + { "disable-blinking", no_argument, 0, OPT_DISABLEBLNK }, + { "quiet", no_argument, 0, OPT_QUIET }, + { "diagnostics", no_argument, 0, OPT_DIAG }, + { "diagnostics-only", no_argument, 0, OPT_DIAGONLY }, + { "channel", required_argument, 0, OPT_CHANNEL }, + { 0, 0, 0, 0 } + }; + int option_idx = 0; + optind = 0; + opterr = 0; + int r; + + bool list_only = false; + char *pcap_fname = NULL; + + struct userspace_wifi_context *context; + struct userspace_wifi_probe_dev *probed; + int probed_count; + + struct wifi_test_context test_context; + + memset(&test_context, 0, sizeof(struct wifi_test_context)); + + test_context.device_number = -1; + test_context.channel = 1; + + while ((r = getopt_long(argc, argv, "h", longopt, &option_idx)) != -1) { + switch (r) { + case OPT_HELP: + /* help */ + print_usage(argv[0]); + exit(0); + break; + case OPT_LIST: + list_only = true; + break; + case OPT_DISABLELED: + test_context.disable_leds = true; + break; + case OPT_INVERTLED: + test_context.invert_leds = true; + break; + case OPT_DISABLEBLNK: + test_context.disable_blink = true; + break; + case OPT_QUIET: + test_context.quiet = true; + break; + case OPT_DEVNO: + if (sscanf(optarg, "%u", &test_context.device_number) != 1) { + print_usage(argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "Expected a number for --device, such as --device=5\n"); + exit(1); + } + break; + case OPT_PLAINDOT11: + test_context.no_radiotap = true; + break; + case OPT_DIAG: + test_context.diagnostics_mode = true; + break; + case OPT_DIAGONLY: + test_context.diagnostics_only = true; + test_context.diagnostics_mode = true; + break; + case OPT_CHANNEL: + if (sscanf(optarg, "%u", &test_context.channel) != 1) { + print_usage(argv[0]); + fprintf(stderr, "\nExpected a number for --channel, such as --channel=6\n"); + exit(1); + } + + if (test_context.channel < 1 || test_context.channel > 14) { + print_usage(argv[0]); + fprintf(stderr, "\nExpected a channel between 1 and 14\n"); + exit(1); + } + break; + } + } + + if (!list_only && !test_context.diagnostics_only && optind >= argc) { + print_usage(argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "FATAL: Expected pcap file name\n"); + exit(1); + } else if (!test_context.diagnostics_only && !list_only) { + pcap_fname = strdup(argv[optind]); + } + + /* + * If LEDs are disabled, blinking is disabled + */ + if (test_context.disable_leds) + test_context.disable_blink = true; + + r = userspace_wifi_init(&context); + + if (r != 0) { + fprintf(stderr, "FATAL: Failed to initialize USB subsystem, %d\n", r); + exit(1); + } + + context->local_data = &test_context; + test_context.context = context; + + probed_count = userspace_wifi_probe(context, &probed); + + if (probed_count == 0) { +#ifdef _WIN32 + fprintf(stderr, "ERROR: No compatible USB Wi-Fi cards found. Make sure you have a supported Wi-Fi device " + "and that you have installed the required drivers via Zadig!\n"); +#elif defined(__APPLE__) + /* + * Whine about root + */ + if (getuid() != 0) { + fprintf(stderr, "ERROR: No compatible USB Wi-Fi devices found. Not running as root. Root is often required for " + "raw USB access if you are not the primary user.\n"); + } else { + fprintf(stderr, "ERROR: No compatible USB Wi-Fi devices found.\n"); + } +#else + if (getuid() != 0) { + fprintf(stderr, "ERROR: No compatible USB Wi-Fi devices found. Not running as root. Root is typically required for " + "raw USB access; if you see no USB devices, try running as root\n"); + } else { + fprintf(stderr, "ERROR No compatible USB Wi-Fi devices found.\n"); + } +#endif + exit(1); + } + + if (!test_context.quiet) + print_device_list(probed); + + if (list_only) + goto end; + + /* Look for the device we were asked for */ + test_context.probedev = find_device_by_number(test_context.device_number, probed); + + userspace_wifi_set_packet_cb(context, &pcap_rx_packet); + + if (!test_context.diagnostics_only && !list_only) { + r = open_pcap(pcap_fname, &test_context); + if (r < 0) { + fprintf(stderr, "FATAL: Could not open pcap\n"); + exit(1); + } + } + + open_wifi_device(&test_context); + + /* + * Activate capture + */ + if (!test_context.quiet) + fprintf(stderr, "Activating capture...\n"); + start_wifi_capture(&test_context); + + while (1) { + sleep(1); + } + +end: +/* This makes win32 sad right now; not sure why + userspace_wifi_free_probe(probed); + userspace_wifi_free(context); +*/ + return 0; +} diff --git a/wifi_coconut.c b/wifi_coconut.c new file mode 100644 index 0000000..ae4623e --- /dev/null +++ b/wifi_coconut.c @@ -0,0 +1,1023 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 LLC + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#include +#else +#include +#define sleep(x) Sleep(x*1000) +#define usleep(x) Sleep((x) < 1000 ? 1 : (x) / 1000) +#endif + +#ifdef __APPLE__ +#include +#include +#include +#endif + +#include "kernel/cfg80211.h" +#include "kernel/endian.h" +#include "kernel/ieee80211.h" +#include "kernel/ieee80211_radiotap.h" + +#include + +#include "userspace/userspace.h" +#include "wifi_coconut/wifi_coconut.h" + +/* + * Global tool context + */ +struct coconut_tool_context { + /* + * Reference to the coconut context from wifi_coconut.h + */ + struct wifi_coconut_context *coconut_context; + + /* + * Tool-specific options + */ + bool wait_for_coconut; + bool interactive; + bool no_radiotap; + bool diagnostics_mode; + bool list_only; + + /* + * Pcap file we log to + */ + char *pcap_fname; + + /* + * If we're doing log rotation... + */ + unsigned int log_rotation_interval; + unsigned int log_rotation_number; + + /* + * pcap logging runtime + */ + bool enable_pcap_log; + FILE *dump_filep; + int num_packets; + pthread_mutex_t pcap_mutex; + + /* + * Interactive and non-interactive UI cb states + */ + int interactive_spinner_pos; + bool warned_nodevs; + bool warned_partial; +}; + +/* + * It's easiest to implement pcap ourselves rather than + * include libpcap and add another dependency + */ + +#define DLT_IEEE802_11 105 /* IEEE 802.11 wireless */ +#define DLT_IEEE802_11_RADIO 127 /* 802.11 plus radiotap radio header */ + +int open_coconut_pcap(struct coconut_tool_context *tool_context) { + struct { + uint32_t magic_number; /* magic number */ + uint16_t version_major; /* major version number */ + uint16_t version_minor; /* minor version number */ + int32_t thiszone; /* GMT to local correction */ + uint32_t sigfigs; /* accuracy of timestamps */ + uint32_t snaplen; /* max length of captured packets, in octets */ + uint32_t network; /* data link type */ + } pcap_hdr_t; + + if (tool_context->pcap_fname == NULL) + return 0; + + pcap_hdr_t.magic_number = 0xa1b2c3d4; + pcap_hdr_t.version_major = 2; + pcap_hdr_t.version_minor = 4; + pcap_hdr_t.thiszone = 0; + pcap_hdr_t.sigfigs = 0; + pcap_hdr_t.snaplen = 8192; + + tool_context->enable_pcap_log = true; + pthread_mutex_init(&tool_context->pcap_mutex, NULL); + + if (tool_context->no_radiotap) + pcap_hdr_t.network = DLT_IEEE802_11; + else + pcap_hdr_t.network = DLT_IEEE802_11_RADIO; + + if (strcmp(tool_context->pcap_fname, "-") == 0) + tool_context->dump_filep = stdout; + else + tool_context->dump_filep = fopen(tool_context->pcap_fname, "wb"); + + if (tool_context->dump_filep == NULL) { + fprintf(stderr, "ERROR: Could not open dump: %d %s\n", errno, strerror(errno)); + return -1; + } + + fwrite(&pcap_hdr_t, sizeof(pcap_hdr_t), 1, tool_context->dump_filep); + + if (!tool_context->coconut_context->quiet && tool_context->dump_filep != stdout) { + fprintf(stderr, "Opened PCAP file '%s'\n", tool_context->pcap_fname); + } + + return 1; +} + +void ANSI_PREP() { +#ifdef _WIN32 + HANDLE *console; + DWORD mode; + + console = GetStdHandle(STD_OUTPUT_HANDLE); + + if (console == INVALID_HANDLE_VALUE) { + fprintf(stderr, "ERROR: Failed to get the windows console handle.\n"); + exit(1); + } + + GetConsoleMode(console, &mode); + + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + /* mode |= DISABLE_NEWLINE_AUTO_RETURN; */ + + SetConsoleMode(console, mode); +#endif +} + +void ANSI_CLEAR() { + printf("\x1b[2J"); +} + +void ANSI_MOVE(unsigned int x, unsigned int y) { + printf("\x1b[%u;%uH", x, y); +} + +void ANSI_CLEAR_LINE() { + printf("\x1b[K"); +} + +void ANSI_UNDERLINE() { + printf("\x1b[4m"); +} + +void ANSI_NORMAL() { + printf("\x1b[0m"); +} + +void scale_bar(int v, int min_v, int max_v, int width, char *buf) { + int p; + int scale_v = width * ((float) (v - min_v) / (float) (max_v - min_v)); + + if (scale_v < 0) + scale_v = 0; + + for (p = 0; p < width; p++) { + if (p < scale_v) + buf[p] = '#'; + else + buf[p] = '-'; + } + + buf[width] = '\0'; +} + +void find_max_value(int *arr, unsigned int len, int *max, int *pos) { + *max = 0; + *pos = 0; + + for (unsigned int x = 0; x < len; x++) { + if (arr[x] > *max) { + *max = arr[x]; + *pos = x; + } + } +} + +#define coconut_logo_height 6 +void print_coconut() { + ANSI_MOVE(1, 0); + printf(" /''//''\\ _ ___ _______ ______ Hak 5 __"); + ANSI_MOVE(2, 0); + printf(" __//_ | | / (_) ____(_) / ____/___ _________ ____ __ __/ /_"); + ANSI_MOVE(3, 0); + printf(" /() () \\ | | /| / / / /_ / / / / / __ \\/ ___/ __ \\/ __ \\/ / / / __/"); + ANSI_MOVE(4, 0); + printf(" \\ () / | |/ |/ / / __/ / / / /___/ /_/ / /__/ /_/ / / / / /_/ / /_ "); + ANSI_MOVE(5, 0); + printf(" `-..-' |__/|__/_/_/ /_/ \\____/\\____/\\___/\\____/_/ /_/\\__,_/\\__/ "); +} + +#ifdef _WIN32 +/* Simulate a very very basic glibc getline() */ +void win32_getline(char **buffer, size_t max_len) { + size_t i = 0; + char c; + *buffer = (char *) malloc(max_len); + + while (i < max_len - 1) { + c = getchar(); + + if (c == '\n' || c == '\r') { + (*buffer)[i] = 0; + return; + } + + (*buffer)[i++] = c; + } +} +#endif + +#ifdef __APPLE__ +/* Really ugly hacky function to modify the provided path to have a prepended + * documents directory on MacOS + */ +int prepend_documents_dir(char *path, size_t max) { + char *tmp = strdup(path); + struct passwd *pwd; + + const char *home_dir = getenv("HOME"); + if (home_dir == NULL) { + pwd = getpwuid(getuid()); + + if (pwd) { + snprintf(path, max, "%s/Documents/%s", pwd->pw_dir, tmp); + free(tmp); + return 0; + } else { + free(tmp); + return -1; + } + } else { + snprintf(path, max, "%s/Documents/%s", home_dir, tmp); + free(tmp); + return 0; + } + + free(tmp); + return -1; +} +#endif + +int interactive_pcap_name(struct coconut_tool_context *tool_context, int xpos) { + const char *prompt1 = "PCAP file name (or leave blank for no pcap logging)"; + const char *prompt2 = "File name:"; + + char *line = NULL; + size_t len; + + ANSI_MOVE(xpos, 0); + printf("%s", prompt1); + ANSI_MOVE(xpos + 1, 0); + printf("%s", prompt2); + ANSI_MOVE(xpos + 1, strlen(prompt2) + 2); + ANSI_UNDERLINE(); + printf("______________________________"); + ANSI_MOVE(xpos + 1, strlen(prompt2) + 2); + fflush(stdout); + +#ifdef _WIN32 + win32_getline(&line, 1024); + if (strlen(line) > 0) + tool_context->pcap_fname = strdup(line); +#else + len = 0; + getline(&line, &len, stdin); + + if (strlen(line) > 1) { + +#ifdef __APPLE__ + /* Hack the home dir into it */ + if (strstr(line, "/") == NULL) { + char linebuf[2048]; + snprintf(linebuf, 2048, "%s", line); + prepend_documents_dir(linebuf, 2048); + + free(line); + line = strdup(linebuf); + } +#endif + + tool_context->pcap_fname = strndup(line, strlen(line) - 1); + } +#endif + + + ANSI_NORMAL(); + ANSI_MOVE(xpos + 2, 0); + + free(line); + + return 1; +} + +int interactive_coconut_cb(struct wifi_coconut_context *coconut_context, + void *cbaux, int state, int dev, struct wifi_coconut *coconuts) { + struct coconut_tool_context *tool_context = (struct coconut_tool_context *) cbaux; + + int v_base_offt = 0; + + const char *searching = "Searching for a Wi-Fi Coconut..."; + const char *opening = "Opening Wi-Fi Coconut..."; + const char *spinner = "|/-\\"; + + int i, r; + + ANSI_CLEAR(); + ANSI_MOVE(0, 0); + + print_coconut(); + v_base_offt = coconut_logo_height; + + /* + * Print the searching spinner while we're still looking. + * Add warnings about needed root, etc if we need to. + */ + if (state == WIFI_COCONUT_SEARCH_STATE_NO_RADIOS || + state == WIFI_COCONUT_SEARCH_STATE_NO_COCONUT) { + + ANSI_MOVE(v_base_offt + 1, 0); + printf("%s", searching); + + ANSI_MOVE(v_base_offt + 1, strlen(searching) + 1); + printf(" [ %c ]", spinner[tool_context->interactive_spinner_pos++ % strlen(spinner)]); + ANSI_MOVE(v_base_offt + 2, 0); + + if (state == WIFI_COCONUT_SEARCH_STATE_NO_RADIOS) { +#if defined(__APPLE__) + ANSI_MOVE(v_base_offt + 2, 0); + printf("*** No Wi-Fi Coconut radios found. Make sure your USB cable is plugged into the"); + ANSI_MOVE(v_base_offt + 3, 0); + printf(" data port of the Wi-Fi Coconut. IF YOU ARE RUNNING MACOS CATALINA, you may"); + ANSI_MOVE(v_base_offt + 4, 0); + printf(" need to quit ALL APPS using USB, INCLUDING GOOGLE CHROME before plugging in"); + ANSI_MOVE(v_base_offt + 5, 0); + printf(" your Wi-Fi Coconut."); + ANSI_MOVE(v_base_offt + 6, 0); +#elif defined(_WIN32) + ANSI_MOVE(v_base_offt + 2, 0); + printf("*** No Wi-Fi Coconut radios found. Make sure that you have installed the USB drivers"); + ANSI_MOVE(v_base_offt + 3, 0); + printf(" via Zadig, and that your USB cable is plugged into the data port "); + ANSI_MOVE(v_base_offt + 4, 0); + printf(" of the Wi-Fi Coconut."); + ANSI_MOVE(v_base_offt + 5, 0); +#else + ANSI_MOVE(v_base_offt + 2, 0); + if (getuid() != 0) { + printf("*** No Wi-Fi Coconut radios found, and you ARE NOT RUNNING AS ROOT. Root is"); + ANSI_MOVE(v_base_offt + 3, 0); + printf(" REQUIRED for USB access. Run the Wi-Fi Coconut tool via 'sudo'."); + ANSI_MOVE(v_base_offt + 4, 0); + } else { + printf("*** No Wi-Fi Coconut radios found. Make sure that your USB cable is plugged"); + ANSI_MOVE(v_base_offt + 3, 0); + printf(" into the data port of the Wi-Fi Coconut."); + ANSI_MOVE(v_base_offt + 4, 0); + } +#endif + } else if (state == WIFI_COCONUT_SEARCH_STATE_NO_COCONUT) { +#ifdef __APPLE__ + ANSI_MOVE(v_base_offt + 2, 0); + printf("*** Some Wi-Fi USB devices found, but could not find a Wi-Fi Coconut"); + ANSI_MOVE(v_base_offt + 3, 0); + printf(" IF YOU ARE RUNNING MACOS CATALINA, you may need to QUIT ALL OTHER"); + ANSI_MOVE(v_base_offt + 4, 0); + printf(" APPS using USB, INCLUDING GOOGLE CHROME, before plugging in your"); + ANSI_MOVE(v_base_offt + 5, 0); + printf(" Wi-Fi Coconut."); + ANSI_MOVE(v_base_offt + 6, 0); +#else + ANSI_MOVE(v_base_offt + 2, 0); + printf("*** Some Wi-Fi USB devices found, but could not find a Wi-Fi Coconut"); + ANSI_MOVE(v_base_offt + 3, 0); + printf(" Some systems may take 10-20 seconds to find all the USB devices."); + ANSI_MOVE(v_base_offt + 4, 0); + printf(" You may need to provide additional power via the second USB port"); + ANSI_MOVE(v_base_offt + 5, 0); + printf(" on the Wi-Fi Coconut"); + ANSI_MOVE(v_base_offt + 6, 0); +#endif + } + + fflush(stdout); + } + + /* If we've just found a coconut, opened a device, failed a + * device, or opened ALL the devices, print out the list of + * open devices... */ + if (state == WIFI_COCONUT_SEARCH_STATE_FOUND || + state == WIFI_COCONUT_SEARCH_STATE_DEV_OPENED || + state == WIFI_COCONUT_SEARCH_STATE_DEV_ERROR || + state == WIFI_COCONUT_SEARCH_STATE_DONE) { + ANSI_MOVE(v_base_offt + 1, strlen(searching) + 1); + printf(" [ OK ]"); + + fflush(stdout); + + /* Clear the errors */ + for (i = 0; i < 6; i++) { + ANSI_MOVE(v_base_offt + i, 0); + ANSI_CLEAR_LINE(); + } + + ANSI_MOVE(v_base_offt + 2, 0); + printf("%s [ .............. ]", opening); + ANSI_MOVE(v_base_offt + 3, 0); + fflush(stdout); + + for (i = 0; i < coconut_context->coconut->device_num; i++) { + if (coconut_context->coconut->active_devices[i] != NULL) { + ANSI_MOVE(v_base_offt + 2, strlen(opening) + 5 + i); + printf("*"); + } + } + + if (state == WIFI_COCONUT_SEARCH_STATE_DEV_ERROR) { + ANSI_MOVE(v_base_offt + 2, strlen(opening) + 5 + dev); + printf("X"); + ANSI_MOVE(v_base_offt + 3, 0); + printf("Failed to open device %d\n", dev); + fflush(stdout); + return -1; + } + + ANSI_MOVE(v_base_offt + 4, 0); + + fflush(stdout); + } + + /* + * If we're done, we printed out all the devices, prompt for pcap + */ + if (state == WIFI_COCONUT_SEARCH_STATE_DONE) { + /* Get the pcap name */ + interactive_pcap_name(tool_context, v_base_offt + 5); + + ANSI_MOVE(v_base_offt + 6, 0); + + /* Fire up the pcap */ + r = open_coconut_pcap(tool_context); + + if (r < 0) { + ANSI_MOVE(v_base_offt + 7, 0); + printf("ERROR: Could not open PCAP log\n"); + } + + fflush(stdout); + return 0; + } + + return 0; +} + +/* Non-interactive text-only search and open */ +int noninteractive_coconut_cb(struct wifi_coconut_context *coconut_context, + void *cbaux, int state, int dev, struct wifi_coconut *coconuts) { + struct coconut_tool_context *tool_context = (struct coconut_tool_context *) cbaux; + + int r; + + if (state == WIFI_COCONUT_SEARCH_STATE_NO_RADIOS) { + if (!tool_context->warned_nodevs) { + if (!tool_context->wait_for_coconut) { +#if defined(__APPLE__) + fprintf(stderr, "ERROR: No Wi-Fi Coconut radios found. Make sure your USB cable is plugged into the\n" + " data port of the Wi-Fi Coconut. If you are running MacOS Catalina, you may\n" + " need to quit all other apps using USB, *including Google Chrome*, before \n" + " plugging in your Wi-Fi Coconut\n"); +#elif defined(_WIN32) + fprintf(stderr, "ERROR: No Wi-Fi Coconut radios found. Make sure that you have installed the USB\n" + " drivers via Zadig, and that your USB cable is plugged into the data port\n" + " of the Wi-Fi Coconut.\n"); +#else + if (getuid() != 0) { + fprintf(stderr, "ERROR: No Wi-Fi Coconut radios found, and you are not running as root. Typically\n" + " root is required for raw USB device access; try running the wifi_coconut\n" + " tool under 'sudo'\n"); + } else { + fprintf(stderr, "ERROR: No Wi-Fi Coconut radios found. Make sure that your USB cable is plugged\n" + "into the datsa port of the Wi-Fi Coconut.\n"); + } +#endif + fprintf(stderr, "Use the '--wait' option to wait for a Wi-Fi Coconut to be connected.\n"); + return -1; + } else { + /* If we have no devices on linux and we're not running as root, + * blow up immediately */ +#if !defined(__APPLE__) && !defined(_WIN32) + if (getuid() != 0) { + fprintf(stderr, "ERROR: No Wi-Fi Coconut radios found, and you are not running as root. Typically\n" + " root is required for raw USB device access; try running the wifi_coconut\n" + " tool under 'sudo'\n"); + return -1; + } +#endif + fprintf(stderr, "Waiting for a Wi-Fi Coconut. Make sure your USB cable is plugged into the \n" + "data port of the Wi-Fi Coconut.\n"); + } + } + + tool_context->warned_nodevs = true; + + } + + if (state == WIFI_COCONUT_SEARCH_STATE_NO_COCONUT) { + if (!tool_context->warned_partial) { + if (!tool_context->wait_for_coconut) { +#ifdef __APPLE__ + fprintf(stderr, "ERROR: Some Wi-Fi USB devices found, but could not find a Wi-Fi Coconut.\n" + " If you are running MacOS Catalina, you may need to quit all other\n" + " apps using USB, *including Google Chrome*, before plugging in your\n" + " Wi-Fi Coconut.\n"); + +#elif defined(_WIN32) + fprintf(stderr, "ERROR: Some Wi-Fi USB devices found, but could not find a Wi-Fi Coconut.\n" + " Try waiting 10 to 20 seconds after plugging in your Wi-Fi Coconut\n" + " before running this tool. Try supplying additional power to\n" + " the Wi-Fi Coconut by plugging in the second USB port.\n"); +#else + fprintf(stderr, "ERROR: Some Wi-Fi USB devices found, but could not find a Wi-Fi Coconut.\n" + " Train waiting 10 to 20 seconds after plugging in your Wi-Fi Coconut\n" + " before running this tool. Try supplying additional power to the \n" + " Wi-Fi Coconut by plugging in the second USB port.\n"); +#endif + fprintf(stderr, "Use the '--wait' option to wait for a Wi-Fi Coconut to be connected.\n"); + return -1; + } else { +#ifdef __APPLE__ + fprintf(stderr, "Some Wi-Fi radios were found, but could not find a Wi-Fi Coconut. Often\n" + "the USB system takes some time after plugging in a device to recognize all devices.\n" + "If you are running MacOS Catalina, you may need to quit all other apps using USB,\n" + "*including Google Chrome*, before plugging in the Wi-Fi Coconut.\n"); +#else + fprintf(stderr, "Some Wi-Fi radios were found, but could not find a Wi-Fi Coconut. Often\n" + "the USB system takes some time after plugging in a device to recognize all devices.\n" + "If the Wi-Fi Coconut is still not found in 10-20 seconds, try supplying additional\n" + "power via the second USB port.\n"); +#endif + } + + } + + tool_context->warned_partial = true; + } + + if (state == WIFI_COCONUT_SEARCH_STATE_LIST) { + if (!coconut_context->quiet || tool_context->list_only) { + print_wifi_coconuts(coconuts); + + if (tool_context->list_only) + return -1; + } + } + + if (state == WIFI_COCONUT_SEARCH_STATE_MISMATCH) { + if (!tool_context->wait_for_coconut) { + fprintf(stderr, "ERROR: Wi-Fi Coconut %d not found. Plug in your device before running\n" + " this tool or use interactive more or --wait-for-coconut\n", + coconut_context->coconut_number); + return -1; + } + } + + if (state == WIFI_COCONUT_SEARCH_STATE_FOUND) { + if (!coconut_context->quiet) { + fprintf(stderr, "Found Wi-Fi Coconut %d\n", coconut_context->coconut->coconut_number); + } + } + + if (state == WIFI_COCONUT_SEARCH_STATE_DEV_OPENED) { + if (!coconut_context->quiet) + fprintf(stderr, "Opened coconut-%d radio %d\n", coconut_context->coconut->coconut_number, dev + 1); + } + + if (state == WIFI_COCONUT_SEARCH_STATE_DEV_ERROR) { + fprintf(stderr, "ERROR: Failure opening coconut-%d radio %d\n", coconut_context->coconut->coconut_number, dev + 1); + + return -1; + } + + if (state == WIFI_COCONUT_SEARCH_STATE_DONE) { + /* Fire up the pcap */ + r = open_coconut_pcap(tool_context); + + if (r < 0) { + fprintf(stderr, "ERROR: Could not open pcap file!\n"); + return -1; + } + } + + return 0; +} + +int coconut_pcap_rx_packet(struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + struct userspace_wifi_rx_signal *signal, + unsigned char *data, unsigned int len) { + + struct coconut_tool_context *tool_context = + (struct coconut_tool_context *) context->local_data; + struct wifi_coconut_context *coconut_context = tool_context->coconut_context; + + typedef struct { + uint32_t ts_sec; /* timestamp seconds */ + uint32_t ts_usec; /* timestamp microseconds */ + uint32_t incl_len; /* number of octets of packet saved in file */ + uint32_t orig_len; /* actual length of packet */ + } pcaprec_hdr_t; + + pcaprec_hdr_t pcap_hdr; + + struct timeval tv; + + time_t now; + int i; + + int v_base_offt = 0; + + int total_pkts_sec; + + char diag_bar_packets[31]; + char diag_bar_data[31]; + + int max_val_packets, max_pos_packets; + int max_val_data, max_pos_data; + + typedef struct { + uint16_t version; + uint16_t length; + uint32_t bitmap; + uint8_t flags; + uint8_t pad0; + uint16_t channel_freq; + uint16_t channel_flags; + uint8_t antsignal; + + } _rtap_hdr; + + _rtap_hdr rtap_hdr = { + .version = 0, + .length = htole16(sizeof(_rtap_hdr)), + .bitmap = htole32((1 << IEEE80211_RADIOTAP_FLAGS) | + (1 << IEEE80211_RADIOTAP_CHANNEL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL)), + .flags = 0, + .channel_freq = htole16(ieee80211_channel_to_frequency(signal->channel, signal->band)), + .channel_flags = 0, + .antsignal = (u8) signal->signal, + }; + + if (!signal->crc_valid) + rtap_hdr.flags |= IEEE80211_RADIOTAP_F_BADFCS; + + if (signal->short_gi) + rtap_hdr.flags |= IEEE80211_RADIOTAP_F_SHORTGI; + + if (signal->band == NL80211_BAND_2GHZ) + rtap_hdr.channel_flags |= IEEE80211_CHAN_2GHZ; + else if (signal->band == NL80211_BAND_5GHZ) + rtap_hdr.channel_flags |= IEEE80211_CHAN_5GHZ; + + /* + * Only blink if we're told to blink. + * Default LED state is "not inverted" (so on). + * If we're inverted, we let the timer override, so active LEDs stay + * ON longer as the timer gets extended; this looks better. + */ + if (!coconut_context->disable_blink) + userspace_wifi_device_blink_led(context, dev, 100000, !coconut_context->invert_leds, coconut_context->invert_leds); + + if (tool_context->diagnostics_mode) { + pthread_mutex_lock(&coconut_context->diagnostics.mutex); + + now = time(0); + + coconut_context->diagnostics.total_packets[dev->dev_id]++; + coconut_context->diagnostics.total_data[dev->dev_id] += len; + + if (coconut_context->diagnostics.total_min_signal[dev->dev_id] == 0 || + coconut_context->diagnostics.total_min_signal[dev->dev_id] > signal->signal) + coconut_context->diagnostics.total_min_signal[dev->dev_id] = signal->signal; + + if (coconut_context->diagnostics.total_max_signal[dev->dev_id] == 0 || + coconut_context->diagnostics.total_max_signal[dev->dev_id] < signal->signal) + coconut_context->diagnostics.total_max_signal[dev->dev_id] = signal->signal; + + if (coconut_context->diagnostics.last_sec != now) { + if (coconut_context->diagnostics.last_sec != 0) { + total_pkts_sec = 0; + + ANSI_CLEAR(); + ANSI_MOVE(0, 0); + +#ifndef _WIN32 + print_coconut(); + v_base_offt = coconut_logo_height; +#else + v_base_offt = 0; +#endif + + find_max_value(coconut_context->diagnostics.sec_packets, 14, &max_val_packets, &max_pos_packets); + find_max_value(coconut_context->diagnostics.sec_data, 14, &max_val_data, &max_pos_data); + + ANSI_MOVE(v_base_offt + 1, 0); + printf("Ch Pkts/s ------------------------------ Bytes/s ------------------------------ Sig\n"); + + for (int x = 0; x < 14; x++) { + total_pkts_sec += coconut_context->diagnostics.sec_packets[x]; + + scale_bar(coconut_context->diagnostics.sec_packets[x], 0, max_val_packets, 30, diag_bar_packets); + scale_bar(coconut_context->diagnostics.sec_data[x], 0, max_val_data, 30, diag_bar_data); + + ANSI_MOVE(v_base_offt + 2 + x, 0); + printf("%2d %6d %s %6d %s %ddBm\n", + x + 1, + coconut_context->diagnostics.sec_packets[x], + diag_bar_packets, + coconut_context->diagnostics.sec_data[x], + diag_bar_data, + coconut_context->diagnostics.sec_max_signal[x]); + } + + ANSI_MOVE(v_base_offt + 2 + 14, 0); + printf("Curr %6d Totl: %6d\n", total_pkts_sec, tool_context->num_packets); + + if (tool_context->pcap_fname != NULL) { + ANSI_MOVE(v_base_offt + 2 + 16, 0); + printf("Logging to: %s\n", tool_context->pcap_fname); + ANSI_MOVE(v_base_offt + 4 + 16, 0); + } else { + ANSI_MOVE(v_base_offt + 4 + 14, 0); + } + + fflush(stdout); + } + + for (i = 0; i < 14; i++) { + coconut_context->diagnostics.sec_packets[i] = 0; + coconut_context->diagnostics.sec_data[i] = 0; + coconut_context->diagnostics.sec_min_signal[i] = 0; + coconut_context->diagnostics.sec_max_signal[i] = 0; + } + + coconut_context->diagnostics.last_sec = now; + } + + coconut_context->diagnostics.sec_packets[dev->dev_id]++; + coconut_context->diagnostics.sec_data[dev->dev_id] += len; + + if (coconut_context->diagnostics.sec_min_signal[dev->dev_id] == 0 || + coconut_context->diagnostics.sec_min_signal[dev->dev_id] > signal->signal) + coconut_context->diagnostics.sec_min_signal[dev->dev_id] = signal->signal; + + if (coconut_context->diagnostics.sec_max_signal[dev->dev_id] == 0 || + coconut_context->diagnostics.sec_max_signal[dev->dev_id] < signal->signal) + coconut_context->diagnostics.sec_max_signal[dev->dev_id] = signal->signal; + + pthread_mutex_unlock(&coconut_context->diagnostics.mutex); + } + + if (!tool_context->enable_pcap_log) + return 1; + + if (!signal->crc_valid) + return 1; + + gettimeofday(&tv, NULL); + + pcap_hdr.ts_sec = tv.tv_sec; + pcap_hdr.ts_usec = tv.tv_usec; + + pthread_mutex_lock(&tool_context->pcap_mutex); + + if (tool_context->no_radiotap) { + pcap_hdr.incl_len = pcap_hdr.orig_len = len; + fwrite(&pcap_hdr, sizeof(pcaprec_hdr_t), 1, tool_context->dump_filep); + fwrite(data, len, 1, tool_context->dump_filep); + } else { + pcap_hdr.incl_len = pcap_hdr.orig_len = sizeof(_rtap_hdr) + len; + fwrite(&pcap_hdr, sizeof(pcaprec_hdr_t), 1, tool_context->dump_filep); + fwrite(&rtap_hdr, sizeof(_rtap_hdr), 1, tool_context->dump_filep); + fwrite(data, len, 1, tool_context->dump_filep); + } + + fflush(tool_context->dump_filep); + + tool_context->num_packets++; + + pthread_mutex_unlock(&tool_context->pcap_mutex); + + return 1; +} + +void coconut_handle_error(const struct userspace_wifi_context *context, + struct userspace_wifi_dev *dev, + const char *errstr, int errnum) { + + fprintf(stderr, "\n\nERROR "); + + if (dev != NULL) + fprintf(stderr, "DEVICE %d ", userspace_wifi_device_get_id(context, dev)); + + fprintf(stderr, "%s\n", errstr); + + exit(1); +} + +void print_usage(char *argv) { + printf("Wi-Fi Coconut\n"); + printf("Usage: %s [options]\n", argv); + printf("By default, the %s tool opens in interactive mode.\n", argv); + printf("Universal options:\n" + " --disable-leds Go fully dark; don't enable any LEDs\n" + " --invert-leds Normally a Wi-Fi Coconut enables all the LEDs\n" + " and blinks during traffic; Invert only lights\n" + " when there is traffic.\n" + " --disable-blinking Disable blinking the LEDs on traffic\n"); + /* + " --ht40 Use radios 13 and 14 for HT40 1+ and 11- instead\n" + " of international channels\n"); + */ + + printf("Non-interactive modes:\n" + " --no-display Don't display channel UI while logging\n" + " --wait Wait for a coconut to be found\n" + " --pcap=[fname] Log packets to a pcap file. If file is '-',\n" + " a pcap file will be echoed to stdout so that it can\n" + " be piped to other tools." + " --wait-for-coconut Wait for a coconut to be connected and identified\n" + " --list-coconuts List Wi-Fi Coconut devices and exit\n" + " --coconut-device=X If you have multiple Wi-Fi Coconuts, specify\n" + " which one to use\n" + " --enable-partial Enable a Wi-Fi Coconut even if not all the\n" + " radios have been identified.\n" + " --plain-dot11 Log plain 802.11 packets instead of radiotap\n" + " formatted packets with signal and channel\n" + " --quiet Disable most output\n"); +} + +int main(int argc, char *argv[]) { +#define OPT_HELP 'h' +#define OPT_LIST 2 +#define OPT_DEVNO 3 +#define OPT_PARTIAL 4 +#define OPT_PLAINDOT11 5 +#define OPT_DISABLELED 6 +#define OPT_INVERTLED 7 +#define OPT_DISABLEBLNK 8 +#define OPT_QUIET 9 +#define OPT_WAIT 12 +#define OPT_PCAP 13 +#define OPT_NO_DISPLAY 14 +#define OPT_HT 15 + static struct option longopt[] = { + { "help", no_argument, 0, OPT_HELP }, + { "list-coconuts", no_argument, 0, OPT_LIST }, + { "coconut-device", required_argument, 0, OPT_DEVNO }, + { "enable-partial", no_argument, 0, OPT_PARTIAL }, + { "plain-dot11", no_argument, 0, OPT_PLAINDOT11 }, + { "disable-leds", no_argument, 0, OPT_DISABLELED }, + { "invert-leds", no_argument, 0, OPT_INVERTLED }, + { "disable-blinking", no_argument, 0, OPT_DISABLEBLNK }, + { "quiet", no_argument, 0, OPT_QUIET }, + { "wait", no_argument, 0, OPT_WAIT }, + { "pcap", required_argument, 0, OPT_PCAP }, + { "no-display", no_argument, 0, OPT_NO_DISPLAY }, + { "ht40", no_argument, 0, OPT_HT }, + { 0, 0, 0, 0 } + }; + int option_idx = 0; + optind = 0; + opterr = 0; + int r; + + struct userspace_wifi_context *context; + struct coconut_tool_context tool_context; + struct wifi_coconut_context *coconut_context; + + memset(&tool_context, 0, sizeof(struct coconut_tool_context)); + + tool_context.coconut_context = init_coconut_context(); + coconut_context = tool_context.coconut_context; + + coconut_context->coconut_number = -1; + + tool_context.interactive = true; + tool_context.diagnostics_mode = true; + + while ((r = getopt_long(argc, argv, "h", longopt, &option_idx)) != -1) { + switch (r) { + case OPT_HELP: + /* help */ + print_usage(argv[0]); + exit(0); + break; + case OPT_LIST: + tool_context.list_only = true; + tool_context.interactive = false; + tool_context.diagnostics_mode = false; + break; + case OPT_DISABLELED: + coconut_context->disable_leds = true; + break; + case OPT_INVERTLED: + coconut_context->invert_leds = true; + break; + case OPT_DISABLEBLNK: + coconut_context->disable_blink = true; + break; + case OPT_QUIET: + coconut_context->quiet = true; + tool_context.diagnostics_mode = false; + tool_context.interactive = false; + break; + case OPT_DEVNO: + if (sscanf(optarg, "%u", &coconut_context->coconut_number) != 1) { + print_usage(argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "Expected a number for --coconut-device, such as --coconut_device=5\n"); + exit(1); + } + break; + case OPT_PLAINDOT11: + tool_context.no_radiotap = true; + break; + case OPT_PCAP: + tool_context.pcap_fname = strdup(optarg); + tool_context.interactive = false; + break; + case OPT_WAIT: + tool_context.wait_for_coconut = true; + tool_context.interactive = false; + break; + case OPT_NO_DISPLAY: + tool_context.interactive = false; + tool_context.diagnostics_mode = false; + break; + case OPT_HT: + coconut_context->ht40 = true; + break; + } + } + + /* + * If LEDs are disabled, blinking is disabled + */ + if (coconut_context->disable_leds) + coconut_context->disable_blink = true; + + r = userspace_wifi_init(&context); + + if (r != 0) { + fprintf(stderr, "FATAL: Failed to initialize USB subsystem, %d\n", r); + exit(1); + } + + context->local_data = &tool_context; + coconut_context->context = context; + + userspace_wifi_set_error_cb(context, coconut_handle_error); + + /* Prep the console for win32 to do ANSI mode */ + ANSI_PREP(); + + if (tool_context.interactive) + r = coconut_search_and_open(coconut_context, true, -1, + &interactive_coconut_cb, &tool_context); + else + r = coconut_search_and_open(coconut_context, tool_context.wait_for_coconut, + coconut_context->coconut_number, + &noninteractive_coconut_cb, &tool_context); + + if (r != WIFI_COCONUT_SEARCH_STATE_DONE || tool_context.list_only) + exit(1); + + userspace_wifi_set_packet_cb(context, &coconut_pcap_rx_packet); + + /* + * Activate capture + */ + start_wifi_coconut_capture(coconut_context); + + while (1) { + sleep(1); + } + + userspace_wifi_free(context); +} diff --git a/wifi_coconut/wifi_coconut.c b/wifi_coconut/wifi_coconut.c new file mode 100644 index 0000000..8520841 --- /dev/null +++ b/wifi_coconut/wifi_coconut.c @@ -0,0 +1,654 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 LLC + * + */ + +#include "wifi_coconut/wifi_coconut.h" +#include "userspace/userspace.h" + +struct wifi_coconut_context *init_coconut_context() { + struct wifi_coconut_context *ctx = + (struct wifi_coconut_context *) malloc(sizeof(struct wifi_coconut_context)); + + if (ctx == NULL) + return NULL; + + memset(ctx, 0, sizeof(struct wifi_coconut_context)); + + pthread_mutex_init(&ctx->diagnostics.mutex, NULL); + + return ctx; +} + + +/* + * Map the bus positions to device numbers so we can open + * them in order. + */ +const int device_number_map[7][4] = { + { 0, 1, 2, 3 }, + { 4, 5, 6, 7 }, + { 8, 9, 0, 0 }, + { 10, 0, 0, 0 }, + { 13, 0, 0, 0 }, + { 12, 0, 0, 0 }, + { 11, 0, 0, 0 }, +}; + +int find_coconuts_cluster(struct wifi_coconut_context *coconut_context, + struct userspace_wifi_probe_dev *devicelist, + struct wifi_coconut **coconut) { + + /* + * Potential coconuts we've found so far + */ + struct wifi_coconut *potential_coconuts = NULL; + struct wifi_coconut *coconut_iter = NULL; + struct wifi_coconut *matched_coconuts = NULL; + int root_number = 0; + int index_offt = 0; + struct userspace_wifi_probe_dev *device; + bool continue_descent = true; + int device_pos_num; + bool found_partial = false; + + /* + * Fallback enumeration of just 14 rt2800 radios without looking at the bus path + */ + int num_raw_devices = 0; + struct userspace_wifi_probe_dev *raw_devices[14]; + + int i; + + for (num_raw_devices = 0; num_raw_devices < 14; num_raw_devices++) + raw_devices[num_raw_devices] = NULL; + num_raw_devices = 0; + + while (continue_descent) { + device = devicelist; + + continue_descent = false; + + while (device) { + device_pos_num = -1; + +#ifdef FIND_DEBUG + printf("device %x %x bus len %d ", device->device_id_match->idVendor, device->device_id_match->idProduct, device->usb_bus_path_len); + for (int x = 0; x < device->usb_bus_path_len; x++) + printf("/%d", device->usb_bus_path[x]); + printf("\n"); +#endif + + /* + * Immediately exclude anything that isn't homed on a nested hub + * or doesn't have the right pid/vid; We don't need to check the + * driver string because of the vid/pid matching. + */ + if (device->usb_bus_path_len + index_offt < 2 || + device->device_id_match->idVendor != 0x148f || + device->device_id_match->idProduct != 0x5370) { +#ifdef FIND_DEBUG + printf("invalid device, bus len too short %d offt %d\n", device->usb_bus_path_len, index_offt); +#endif + device = device->next; + continue; + } + + /* + * If we have any device which has enough of a path to continue + * past this cycle, flag to keep going when we're done. + */ + if (device->usb_bus_path_len - index_offt > 3) { + continue_descent = true; + device = device->next; + continue; + } + + root_number = device->usb_bus_path[index_offt]; + + /* Look for a potential coconut that already matches root */ + coconut_iter = potential_coconuts; + while (coconut_iter != NULL) { + if (coconut_iter->coconut_number == root_number) + break; + + coconut_iter = coconut_iter->next; + } + + /* Make a new potential record to populate if this is the first + * device of this root tree + */ + if (coconut_iter == NULL) { + /* Allocate a coconut if it doesn't exist */ + coconut_iter = (struct wifi_coconut *) malloc(sizeof(*coconut_iter)); + if (coconut_iter == NULL) { + goto failure; + } + memset(coconut_iter, 0, sizeof(*coconut_iter)); + +#ifdef FIND_DEBUG + printf("setting up coconut %d\n", root_number); +#endif + + /* + * Set up the coconut + */ + coconut_iter->coconut_context = coconut_context; + coconut_iter->coconut_number = root_number; + coconut_iter->valid = true; + coconut_iter->bus_count[0] = 4; + coconut_iter->bus_count[1] = 4; + coconut_iter->bus_count[2] = 4; + coconut_iter->bus_count[3] = 2; + + coconut_iter->next = potential_coconuts; + potential_coconuts = coconut_iter; + + found_partial = true; + } + + /* Is the coconut already in error? */ + if (!coconut_iter->valid) { + device = device->next; + continue; + } + + /* Is there room in this coconut? */ + if (coconut_iter->device_num >= 14) { + coconut_iter->valid = false; + device = device->next; + continue; + } + + /* Validate bus layout */ + if (device->usb_bus_path_len - index_offt == 3) { + if (device->usb_bus_path[index_offt + 1] < 1 || + device->usb_bus_path[index_offt + 1] > 3 || + device->usb_bus_path[index_offt + 2] < 1 || + device->usb_bus_path[index_offt + 2] > 4) { + device = device->next; + continue; + } + + if (--coconut_iter->bus_count[device->usb_bus_path[index_offt + 1]] < 0) { +#ifdef FIND_DEBUG + printf("coconut no longer valid bus count [%d] negative\n", index_offt + 1); +#endif + coconut_iter->valid = false; + device = device->next; + continue; + } + + device_pos_num = device_number_map[device->usb_bus_path[index_offt + 1] - 1][device->usb_bus_path[index_offt + 2] - 1]; + + } else if (device->usb_bus_path_len - index_offt == 2) { + if (device->usb_bus_path[index_offt + 1] < 4 || + device->usb_bus_path[index_offt + 1] > 7) { +#ifdef FIND_DEBUG + printf("coconut no longer valid, path 2/4-7 violated\n"); +#endif + coconut_iter->valid = false; + device = device->next; + continue; + } + + if (--coconut_iter->bus_count[0] < 0) { +#ifdef FIND_DEBUG + printf("coconut no longer valid, bus count [0] negative\n"); +#endif + coconut_iter->valid = false; + device = device->next; + continue; + } + + device_pos_num = device_number_map[device->usb_bus_path[index_offt + 1] - 1][0]; + } + + if (device_pos_num < 0 || device_pos_num >= 14) { +#ifdef FIND_DEBUG + printf("Got invalid number %d\n", device_pos_num); +#endif + } else { + coconut_iter->probed_devices[device_pos_num] = device; + coconut_iter->device_num++; + } + + device = device->next; + } + + /* Merge any coconuts that were valid */ + coconut_iter = potential_coconuts; + while (coconut_iter != NULL) { + struct wifi_coconut *tmp; + tmp = coconut_iter->next; + + if (coconut_iter->valid && coconut_iter->device_num == 14) { + coconut_iter->next = matched_coconuts; + matched_coconuts = coconut_iter; + + for (i = 0; i < 14; i++) { + if (coconut_iter->probed_devices[i] != NULL) { + memcpy(coconut_iter->first_usb_serial, coconut_iter->probed_devices[i]->usb_serial, 64); + break; + } + } + } else { +#ifdef FIND_DEBUG + printf("Invalid coconut, valid %u device num %u\n", coconut_iter->valid, coconut_iter->device_num); +#endif + free(coconut_iter); + } + + coconut_iter = tmp; + } + + /* Reset the potential list and increment down the path */ + potential_coconuts = NULL; + index_offt++; + } + + *coconut = matched_coconuts; + + /* If we didn't find any coconuts on a nested bus, look for just 14 radios. some platforms + * like catalina are having real trouble exposing the bus tree through libusb right now. + */ + if (*coconut == NULL) { + device = devicelist; + while (device && num_raw_devices < 14) { + if (device->device_id_match->idVendor != 0x148f || + device->device_id_match->idProduct != 0x5370) { + device = device->next; + continue; + } + + raw_devices[num_raw_devices] = device; + num_raw_devices++; + device = device->next; + } + + /* If we found at least 14 raw compatible devices, just make a coconut out of them + * and call it good enough */ + if (num_raw_devices == 14) { + coconut_iter = (struct wifi_coconut *) malloc(sizeof(*coconut_iter)); + if (coconut_iter == NULL) { + goto failure; + } + +#ifdef FIND_DEBUG + printf("Creating catch-all coconut-0 for 14 devices not in the right order\n"); +#endif + + memset(coconut_iter, 0, sizeof(*coconut_iter)); + + /* + * Set up the coconut + */ + coconut_iter->coconut_context = coconut_context; + coconut_iter->coconut_number = 0; + coconut_iter->valid = true; + + /* + * Copy the raw list of devices + */ + coconut_iter->device_num = 0; + for (coconut_iter->device_num = 0; coconut_iter->device_num < 14; coconut_iter->device_num++) + coconut_iter->probed_devices[coconut_iter->device_num] = raw_devices[coconut_iter->device_num]; + + coconut_iter->next = NULL; + + *coconut = coconut_iter; + + for (i = 0; i < 14; i++) { + if (coconut_iter->probed_devices[i] != NULL) { + memcpy(coconut_iter->first_usb_serial, coconut_iter->probed_devices[i]->usb_serial, 64); + break; + } + } + } + } + + if (*coconut == NULL) { + if (found_partial) + return WIFI_COCONUT_FIND_CLUSTER_PARTIAL; + return WIFI_COCONUT_FIND_CLUSTER_NONE; + } + + return WIFI_COCONUT_FIND_CLUSTER_OK; + +failure: +#ifdef FIND_DEBUG + printf("coconut find fell into failure\n"); +#endif + + coconut_iter = potential_coconuts; + while (coconut_iter != NULL) { + struct wifi_coconut *tmp; + + tmp = coconut_iter; + coconut_iter = coconut_iter->next; + free(tmp); + } + + coconut_iter = matched_coconuts; + while (coconut_iter != NULL) { + struct wifi_coconut *tmp; + + tmp = coconut_iter; + coconut_iter = coconut_iter->next; + free(tmp); + } + + return -ENOMEM; +} + +void free_coconuts(struct wifi_coconut *coconuts) { + struct wifi_coconut *next; + + while (coconuts) { + next = coconuts->next; + free(coconuts); + coconuts = next; + } +} + +void print_wifi_coconuts(struct wifi_coconut *coconuts) { + struct wifi_coconut *iter = coconuts; + + while (iter != NULL) { + fprintf(stderr, "I've got a lovely bunch of coconuts! coconut-%d\n", iter->coconut_number); + iter = iter->next; + } +} + +int coconut_search_and_open(struct wifi_coconut_context *coconut_context, + bool wait_for_coconut, int coconut_number, + int (*status_callback)(struct wifi_coconut_context *, void *, int, int, struct wifi_coconut *), + void *cb_aux) { + struct userspace_wifi_probe_dev *probed; + int probed_count; + struct wifi_coconut *coconuts = NULL, *ci = NULL; + int r, d, htch; + + while (1) { + probed_count = userspace_wifi_probe(coconut_context->context, &probed); + + if (probed_count == 0) { + if (status_callback != NULL) { + r = (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_NO_RADIOS, -1, NULL); + + /* Override waiting for a coconut if the callback returns a 'do not + * continue'; such as running as non-root */ + if (r < 0) + return WIFI_COCONUT_SEARCH_STATE_NO_RADIOS; + } + + if (!wait_for_coconut) + return WIFI_COCONUT_SEARCH_STATE_NO_RADIOS; + + sleep(1); + continue; + } + + r = find_coconuts_cluster(coconut_context, probed, &coconuts); + + if (coconuts == NULL) { + userspace_wifi_free_probe(probed); + probed = NULL; + + /* + * We actually ignore the cluster return value here; we'd only + * have gotten this far if we found SOME usb radios, just not what + * we need. + */ + + if (status_callback != NULL) { + r = (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_NO_COCONUT, -1, NULL); + + /* Allow the callback to reject a continued wait */ + if (r < 0) + return WIFI_COCONUT_SEARCH_STATE_NO_COCONUT; + } + + if (!wait_for_coconut) + return WIFI_COCONUT_SEARCH_STATE_NO_COCONUT; + + sleep(1); + continue; + } + + if (status_callback != NULL) { + r = (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_LIST, -1, coconuts); + + if (r < 0) + return WIFI_COCONUT_SEARCH_STATE_ERROR; + } + + if (coconut_number >= 0) { + ci = coconuts; + + while (ci != NULL) { + if (ci->coconut_number == coconut_number) { + coconut_context->coconut = ci; + coconut_context->coconut_number = coconut_number; + coconut_context->coconuts = coconuts; + break; + } + + ci = ci->next; + } + } else { + coconut_context->coconut = coconuts; + coconut_context->coconuts = coconuts; + coconut_context->coconut_number = coconuts->coconut_number; + } + + if (coconut_context->coconut == NULL) { + free_coconuts(coconuts); + userspace_wifi_free_probe(probed); + + if (status_callback != NULL) { + r = (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_MISMATCH, -1, NULL); + + if (r < 0) + return WIFI_COCONUT_SEARCH_STATE_MISMATCH; + + } + + if (!wait_for_coconut) + return WIFI_COCONUT_SEARCH_STATE_MISMATCH; + + sleep(1); + continue; + } + + /* Otherwise we've got a coconut assigned, drop out of the spinloop + * and move to opening */ + break; + } + + if (status_callback != NULL) + (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_FOUND, -1, NULL); + + /* We might need to handle partial devices */ + for (d = 0; d < 14; d++) { + if (coconut_context->coconut->probed_devices[d] == NULL) { + if (status_callback != NULL) + (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_NO_DEV, d, NULL); + continue; + } + + /* TODO how do we handle channel mapping w partial devices? */ + + r = userspace_wifi_device_open(coconut_context->context, + coconut_context->coconut->probed_devices[d], + &coconut_context->coconut->active_devices[d]); + + /* + * If we failed to open, and have a callback, call it and use that to + * decide if we abort opening entirely; otherwise, abort opening the + * rest of the coconut and fail out + */ + if (r < 0) { + if (status_callback != NULL) { + if ((*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_DEV_ERROR, d, NULL) < 0) { + coconut_context->coconut = NULL; + free_coconuts(coconuts); + userspace_wifi_free_probe(probed); + return WIFI_COCONUT_SEARCH_STATE_ERROR; + } + + continue; + } else { + coconut_context->coconut = NULL; + free_coconuts(coconuts); + userspace_wifi_free_probe(probed); + return WIFI_COCONUT_SEARCH_STATE_ERROR; + } + } + + userspace_wifi_device_set_id(coconut_context->context, + coconut_context->coconut->active_devices[d], d); + + if (!coconut_context->ht40 || d < 12) { + userspace_wifi_device_set_channel(coconut_context->context, + coconut_context->coconut->active_devices[d], + d + 1, + NL80211_CHAN_WIDTH_20); + } else { + if (d == 12) + htch = 1; + if (d == 13) + htch = 11; + + userspace_wifi_device_set_channel(coconut_context->context, + coconut_context->coconut->active_devices[d], + htch, + NL80211_CHAN_WIDTH_40); + } + + if (coconut_context->disable_leds) + userspace_wifi_device_set_led(coconut_context->context, + coconut_context->coconut->active_devices[d], false); + else + userspace_wifi_device_set_led(coconut_context->context, + coconut_context->coconut->active_devices[d], true); + + if (!coconut_context->disable_blink) + userspace_wifi_device_enable_led_control(coconut_context->context, + coconut_context->coconut->active_devices[d]); + + if (status_callback != NULL) + (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_DEV_OPENED, d, NULL); + } + + if (status_callback != NULL) + (*status_callback)(coconut_context, cb_aux, WIFI_COCONUT_SEARCH_STATE_DONE, -1, NULL); + + return WIFI_COCONUT_SEARCH_STATE_DONE; +} + +/* + * Open all the devices in a wifi coconut, setting each one to a channel + */ +int open_wifi_coconut(struct wifi_coconut_context *coconut_context, struct wifi_coconut *coconut) { + int d; + int r; + int htch; + + coconut_context->coconut = coconut; + + if (!coconut_context->quiet) + printf("Opening coconut with %d devices\n", coconut->device_num); + + for (d = 0; d < 14; d++) { + if (coconut_context->coconut->probed_devices[d] == NULL) { + if (!coconut_context->quiet) + printf("Device %d null!\n", d); + continue; + } + + if (!coconut_context->quiet) { + if (!coconut_context->quiet) { + fprintf(stderr, "Opening Coconut-%d #%d... ", coconut->coconut_number, d + 1); + fflush(stderr); + } + } + + r = userspace_wifi_device_open(coconut->coconut_context->context, + coconut->probed_devices[d], &coconut->active_devices[d]); + + if (r != 0) { + if (!coconut_context->quiet) + printf("Failed to open device %d: %d %s\n", d, r, strerror(r)); + return -1; + } + + userspace_wifi_device_set_id(coconut->coconut_context->context, + coconut->active_devices[d], d); + + if (!coconut_context->ht40 || d < 12) { + userspace_wifi_device_set_channel(coconut->coconut_context->context, + coconut->active_devices[d], + d + 1, + NL80211_CHAN_WIDTH_20); + } else { + if (d == 12) + htch = 1; + if (d == 13) + htch = 11; + + userspace_wifi_device_set_channel(coconut->coconut_context->context, + coconut->active_devices[d], + htch, + NL80211_CHAN_WIDTH_40); + } + + if (coconut_context->disable_leds) + userspace_wifi_device_set_led(coconut->coconut_context->context, + coconut->active_devices[d], false); + else + userspace_wifi_device_set_led(coconut->coconut_context->context, + coconut->active_devices[d], true); + + if (!coconut_context->disable_blink) + userspace_wifi_device_enable_led_control(coconut->coconut_context->context, + coconut->active_devices[d]); + + if (!coconut_context->quiet) { + fprintf(stderr, "OK!\n"); + fflush(stderr); + } + + } + + return 0; +} + +/* + * Activate all the devices in a wifi coconut + */ +int start_wifi_coconut_capture(struct wifi_coconut_context *coconut_context) { + int d; + + for (d = 0; d < 14; d++) { + if (coconut_context->coconut->active_devices[d] == NULL) { + fprintf(stderr, "debug - missing active device %d\n", d); + continue; + } + + /* + * If LEDs are inverted, turn off LEDs once we've enumerated all the radios. + */ + if (coconut_context->invert_leds) + userspace_wifi_device_set_led(coconut_context->context, + coconut_context->coconut->active_devices[d], false); + + userspace_wifi_device_start_capture(coconut_context->context, + coconut_context->coconut->active_devices[d]); + } + + return 0; +} + diff --git a/wifi_coconut/wifi_coconut.h b/wifi_coconut/wifi_coconut.h new file mode 100644 index 0000000..57ac17d --- /dev/null +++ b/wifi_coconut/wifi_coconut.h @@ -0,0 +1,254 @@ +/* + * GPL-2.0-or-later + * + * Userspace port (C) 2019 Hak5 LLC + * + */ + +#ifndef __WIFI_COCONUT_H__ +#define __WIFI_COCONUT_H__ + +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#include +#else +#include +#define sleep(x) Sleep(x*1000) +#define usleep(x) Sleep((x) < 1000 ? 1 : (x) / 1000) +#endif + +#include "kernel/cfg80211.h" +#include "kernel/endian.h" +#include "kernel/ieee80211.h" +#include "kernel/ieee80211_radiotap.h" + +#include + +#include "userspace/userspace.h" + +/* + * Diagnostics struct + */ +struct wifi_coconut_diagnostics { + pthread_mutex_t mutex; + + unsigned int total_packets[14]; + unsigned int total_data[14]; + int total_min_signal[14]; + int total_max_signal[14]; + + time_t last_sec; + int sec_packets[14]; + int sec_data[14]; + int sec_min_signal[14]; + int sec_max_signal[14]; +}; + +/* + * A wifi coconut always has 14 radios; each radio is configured for its + * own channel and the device reports packets as an aggregate + * A Wi-Fi Coconut device; can be a linked list or a single device + */ +struct wifi_coconut { + struct wifi_coconut *next; + + struct wifi_coconut_context *coconut_context; + struct userspace_wifi_probe_dev *probed_devices[14]; + struct userspace_wifi_dev *active_devices[14]; + + /* + * How many devices have we found / allocated, either during scan or in case we can't + * allocate all devices and decide to continue anyhow + */ + int device_num; + + /* Per-bus counts */ + int bus_count[4]; + + /* + * What number coconut is this (base hub id) + */ + int coconut_number; + + /* + * What is the USB serial number of the first device in the coconut? This should be + * predictable on most platforms but macos catalina seems to have some problems with + * libusb + */ + unsigned char first_usb_serial[64]; + + + /* + * Is this coconut valid or did we error out? + */ + bool valid; +}; + +/* + * Wifi coconut global context + */ +struct wifi_coconut_context { + /* + * USB context + */ + struct userspace_wifi_context *context; + + /* + * All coconuts + * */ + struct wifi_coconut *coconuts; + + /* + * The coconut we're operating on + */ + struct wifi_coconut *coconut; + + /* + * Diagnostics + */ + struct wifi_coconut_diagnostics diagnostics; + + /* + * Runtime options + */ + bool disable_leds; + bool disable_blink; + bool invert_leds; + bool quiet; + bool ht40; + + /* + * Target coconut device if we have multiple ones + */ + int coconut_number; +}; + +/* + * Search through a list of radios to try to find what looks like a + * wifi coconut. + * + * - A coconut will have 14 radios + * - All radios in a coconut are connected via hubs; they will either be + * on hub/subhub/radio or hub/radio + * - All radios in a coconut will be on the same base hub + * - All radios in a coconut will be rt2800usb + * - All radios in a coconut will be vid/pid 148f/5370 + * - Radios will be organized as: + * {/foo}/base/1/[1..4] + * {/foo}/base/2/[1..4] + * {/foo}/base/3/[1..2] + * {/foo}/base/[4..7] + * + * We do a somewhat inefficient clustering of radios to try to find + * coconut groups. + * + * Coconuts will be numbered by their root hub ID because a user may + * plug in additional coconut devices later, which will get a higher + * root ID because of the USB topology + * + * We take control of the devicelist and parse it ourselves instead of + * using the for_each API. + * + */ + +struct wifi_coconut_context *init_coconut_context(); + +/* + * Map the bus positions to device numbers so we can open + * them in order. + */ +const extern int device_number_map[7][4]; + +/* + * Find a coconut; returns negative on hard failure and one of the following + * on success or logical failure + */ +#define WIFI_COCONUT_FIND_CLUSTER_OK 0 +#define WIFI_COCONUT_FIND_CLUSTER_NONE 1 +#define WIFI_COCONUT_FIND_CLUSTER_PARTIAL 2 +int find_coconuts_cluster(struct wifi_coconut_context *coconut_context, + struct userspace_wifi_probe_dev *devicelist, + struct wifi_coconut **coconut); + +void free_coconuts(struct wifi_coconut *coconuts); +void print_wifi_coconuts(struct wifi_coconut *coconuts); + +/* + * Open all the devices in a wifi coconut, setting each one to a channel + */ +int open_wifi_coconut(struct wifi_coconut_context *coconut_context, struct wifi_coconut *coconut); + +/* + * Scan for coconuts. Optionally wait for a coconut to be found, and optionally + * call a callback function reporting the status of the search. + * + * When a coconut has been found, it will be assigned to the coconut context. + * + * When a proper coconut has been found, it will be opened. Final activation + * is deferred to the caller. + * + * This can be used by a tool to shim the searching methods. + * + * If a callback function is available it will be called with state updated + * during each phase, allowing it to format the user output as appropriate. + * + * In some situations, the callback function may return a 0 to continue operation + * or a negative to abort; these situations are: + * WIFI_COCONUT_SEARCH_STATE_NO_RADIOS (No usb devices found); allow the + * callback to cancel the normal behavior controlled by wait_for_coconut +* WIFI_COCONUT_SEARCH_STATE_NO_COCONUT (No complete coconut found); allow the +* callback to cancel the normal behavior controlled by wait_for_coconut + * WIFI_COCONUT_SEARCH_STATE_DEV_ERROR (Failure to open a device) + */ + +/* Generic error */ +#define WIFI_COCONUT_SEARCH_STATE_ERROR -1 + +/* Successful find and open of coconut */ +#define WIFI_COCONUT_SEARCH_STATE_DONE 0 + +/* No USB radios of any sort detected */ +#define WIFI_COCONUT_SEARCH_STATE_NO_RADIOS 1 + +/* No complete wifi coconut detected */ +#define WIFI_COCONUT_SEARCH_STATE_NO_COCONUT 2 + +/* No coconut matching the specified coconut_number found */ +#define WIFI_COCONUT_SEARCH_STATE_MISMATCH 3 + +/* Status update - target coconut has been found */ +#define WIFI_COCONUT_SEARCH_STATE_FOUND 4 + +/* Status update - coconut device (in cb devnum) opened */ +#define WIFI_COCONUT_SEARCH_STATE_DEV_OPENED 5 + +/* Status update - coconut device (in cb devnum) failed to open */ +#define WIFI_COCONUT_SEARCH_STATE_DEV_ERROR 6 + +/* Status update - coconut device (in cb devnum) was not found */ +#define WIFI_COCONUT_SEARCH_STATE_NO_DEV 7 + +/* Status update - one or more coconuts found, returned as list in cb coconut_list */ +#define WIFI_COCONUT_SEARCH_STATE_LIST 8 + +int coconut_search_and_open(struct wifi_coconut_context *coconut_context, + bool wait_for_coconut, int coconut_number, + int (*status_callback)(struct wifi_coconut_context *, void *cb_aux, + int state, int devnum, struct wifi_coconut *coconut_list), + void *cb_aux); + + +/* + * Activate all the devices in a wifi coconut + */ +int start_wifi_coconut_capture(struct wifi_coconut_context *coconut_context); + + +#endif /* ifndef WIFI_COCONUT_H */ diff --git a/windows/LICENSE_LIBUSB.txt b/windows/LICENSE_LIBUSB.txt new file mode 100644 index 0000000..5ab7695 --- /dev/null +++ b/windows/LICENSE_LIBUSB.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/windows/LICENSE_PTHREADS.txt b/windows/LICENSE_PTHREADS.txt new file mode 100644 index 0000000..1753209 --- /dev/null +++ b/windows/LICENSE_PTHREADS.txt @@ -0,0 +1,148 @@ +pthreads-win32 License - +a POSIX threads library for Microsoft Windows + +This file is Copyrighted +------------------------ + + This file is covered under the following Copyright: + + Copyright © 2001,2006 Ross P. Johnson + All rights reserved. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Pthreads-win32 is covered by the GNU Lesser General Public License +------------------------------------------------------------------ + + Pthreads-win32 is open software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation version 2.1 of the + License. + + Pthreads-win32 is several binary link libraries, several modules, + associated interface definition files and scripts used to control + its compilation and installation. + + Pthreads-win32 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + A copy of the GNU Lesser General Public License is distributed with + pthreads-win32 under the filename: + + COPYING.LIB + + You should have received a copy of the version 2.1 GNU Lesser General + Public License with pthreads-win32; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place + Suite 330 + Boston, MA 02111-1307 + USA + + The contact addresses for pthreads-win32 is as follows: + + Web: https://sources.redhat.com/pthreads-win32 + Email: Ross Johnson + Please use: Firstname.Lastname@homemail.com.au + + + +Pthreads-win32 copyrights and exception files +--------------------------------------------- + + With the exception of the files listed below, Pthreads-win32 + is covered under the following GNU Lesser General Public License + Copyrights: + + Pthreads-win32 - POSIX Threads Library for Win32 + Copyright © 1998 John E. Bossom + Copyright © 1999,2006 Pthreads-win32 contributors + + The current list of contributors is contained + in the file CONTRIBUTORS included with the source + code distribution. The current list of CONTRIBUTORS + can also be seen at the following WWW location: + https://sources.redhat.com/pthreads-win32/contributors.html + + Contact Email: Ross Johnson + Please use: Firstname.Lastname@homemail.com.au + + These files are not covered under one of the Copyrights listed above: + + COPYING + COPYING.LIB + tests/rwlock7.c + + This file, COPYING, is distributed under the Copyright found at the + top of this file. It is important to note that you may distribute + verbatim copies of this file but you may not modify this file. + + The file COPYING.LIB, which contains a copy of the version 2.1 + GNU Lesser General Public License, is itself copyrighted by the + Free Software Foundation, Inc. Please note that the Free Software + Foundation, Inc. does NOT have a copyright over Pthreads-win32, + only the COPYING.LIB that is supplied with pthreads-win32. + + The file tests/rwlock7.c is derived from code written by + Dave Butenhof for his book 'Programming With POSIX(R) Threads'. + The original code was obtained by free download from his website + https://home.earthlink.net/~anneart/family/Threads/source.html + and did not contain a copyright or author notice. It is assumed to + be freely distributable. + + In all cases one may use and distribute these exception files freely. + And because one may freely distribute the LGPL covered files, the + entire pthreads-win32 source may be freely used and distributed. + +General Copyleft and License info +--------------------------------- + + For general information on Copylefts, see: + + https://www.gnu.org/copyleft/ + + For information on GNU Lesser General Public Licenses, see: + + https://www.gnu.org/copyleft/lesser.html + https://www.gnu.org/copyleft/lesser.txt + + +Why pthreads-win32 did not use the GNU General Public License +------------------------------------------------------------- + + The goal of the pthreads-win32 project has been to + provide a quality and complete implementation of the POSIX + threads API for Microsoft Windows within the limits imposed + by virtue of it being a stand-alone library and not + linked directly to other POSIX compliant libraries. For + example, some functions and features, such as those based + on POSIX signals, are missing. + + Pthreads-win32 is a library, available in several different + versions depending on supported compilers, and may be used + as a dynamically linked module or a statically linked set of + binary modules. It is not an application on it's own. + + It was fully intended that pthreads-win32 be usable with + commercial software not covered by either the GPL or the LGPL + licenses. Pthreads-win32 has many contributors to it's + code base, many of whom have done so because they have + used the library in commercial or proprietry software + projects. + + Releasing pthreads-win32 under the LGPL ensures that the + library can be used widely, while at the same time ensures + that bug fixes and improvements to the pthreads-win32 code + itself is returned to benefit all current and future users + of the library. + + Although pthreads-win32 makes it possible for applications + that use POSIX threads to be ported to Win32 platforms, the + broader goal of the project is to encourage the use of open + standards, and in particular, to make it just a little easier + for developers writing Win32 applications to consider + widening the potential market for their products. diff --git a/windows/README.txt b/windows/README.txt new file mode 100755 index 0000000..9c5f25d --- /dev/null +++ b/windows/README.txt @@ -0,0 +1,65 @@ +Wi-Fi Coconut Win64 + +** Requirements ** + +You MUST INSTALL THE ZADIG USB DRIVERS BEFORE CONNECTING YOUR WI-FI COCONUT +or THERE IS A RISK OF HARDWARE DAMAGE. + +** Installing ** + + 1. Download Zadig from https://zadig.akeo.ie + 2. Run the Zadig tool + 3. From the menus, select Device->Create New Device + 4. Enter "RT2800" in the name field (the large field next to the + checkbox named "Edit") + 5. Under USB ID enter: + 148F 5370 + Leave the third field next to USB ID blank. + 6. Click "Install Driver". Zadig may appear to hang - just wait! + Zadig will then install the USB drivers required for raw + access to the radio. + + NOTE: Installing the Zadig drivers for the rt2800 family of Wi-Fi cards + will disable any other Wi-Fi cards using this chipset. These Wi-Fi cards + are USB ONLY and this will typically not affect the built-in Wi-Fi card + on your system, however if your device ONLY HAS USB for Wi-Fi you should + MAKE SURE IT DOES NOT USE THE rt2800 CHIPSET. + + IF YOU ARE UNSURE, we recommend TAKING A SYSTEM SNAPSHOT before installing + the Zadig drivers! + + +** Running ** + + 1. Plug in coconut + 2. Open a terminal, navigate to coconut download + 3. Run .\wifi_coconut.exe --help for info + + Useful commands: + + .\wifi_coconut.exe --diagnostics-only + .\wifi_coconut.exe foo.pcap + .\wifi_coconut.exe --diagnostics foo.pcap + +** Controlling LEDs ** + + By default the Wi-Fi Coconut enables all LEDs. LEDs blink when there is traffic on + the corresponding channel. + + The Wi-Fi Coconut can be used in "stealth mode" by disabling LEDs entirely: + + .\wifi_coconut.exe --disable-leds foo.pcap + + The LEDs can be inverted, so that they are normally off and blink only when there is + traffic: + + .\wifi_coconut.exe --invert-leds foo.pcap + + If blinking LEDs causes a health issue or is annoying, LED blinking can be disabled + with: + + .\wifi_coconut.exe --disable-blinking + + The LEDs will still light up as the radio is enabled, but will not strobe. + + diff --git a/windows/finish_release.bat b/windows/finish_release.bat new file mode 100644 index 0000000..45df775 --- /dev/null +++ b/windows/finish_release.bat @@ -0,0 +1,6 @@ + +xcopy ..\libwifiuserspace\firmware\* Release\ +copy ..\windows\README.txt Release\. +copy ..\windows\LICENSE_LIBUSB.txt Release\. +copy ..\windows\LICENSE_PTHREADS.txt Release\. +copy ..\LICENSE Release\License.txt