diff options
author | benjsc <benjsc@FreeBSD.org> | 2007-11-05 11:47:19 +0000 |
---|---|---|
committer | benjsc <benjsc@FreeBSD.org> | 2007-11-05 11:47:19 +0000 |
commit | b43c03d6682636f92920eef2e92d1de212dd4c3b (patch) | |
tree | 53275d0c918180a6eccc5570f2a2b9937c8392d7 | |
parent | 9ae733819b7cdf0eef51ba1b18d39feb136a9dbf (diff) | |
download | FreeBSD-src-b43c03d6682636f92920eef2e92d1de212dd4c3b.zip FreeBSD-src-b43c03d6682636f92920eef2e92d1de212dd4c3b.tar.gz |
Initial Import of wpi driver based on p4 changeset 128641.
This import includes:
o wpi Wireless driver for the Intel 3945 Wireless Lan Controller (802.11abg) (sys/dev/wpi)
o Intel firmware revision 2.14.4 & associated LICENSE (sys/dev/contrib/wpi, sys/contrib/dev/wpi/LICENSE)
o wpifw Firmware driver (sys/modules/wpifw)
Approved by: mlaier, sam (co-mentors)
-rw-r--r-- | share/doc/legal/intel_wpi/Makefile | 8 | ||||
-rw-r--r-- | sys/contrib/dev/wpi/LICENSE | 39 | ||||
-rw-r--r-- | sys/contrib/dev/wpi/iwlwifi-3945-2.14.4.fw.uu | 2628 | ||||
-rw-r--r-- | sys/dev/wpi/if_wpi.c | 3903 | ||||
-rw-r--r-- | sys/dev/wpi/if_wpireg.h | 727 | ||||
-rw-r--r-- | sys/dev/wpi/if_wpivar.h | 269 | ||||
-rw-r--r-- | sys/modules/wpi/Makefile | 8 | ||||
-rw-r--r-- | sys/modules/wpifw/Makefile | 14 |
8 files changed, 7596 insertions, 0 deletions
diff --git a/share/doc/legal/intel_wpi/Makefile b/share/doc/legal/intel_wpi/Makefile new file mode 100644 index 0000000..81014be --- /dev/null +++ b/share/doc/legal/intel_wpi/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +NO_OBJ= +FILES= ${.CURDIR}/../../../../sys/contrib/dev/wpi/LICENSE +FILESDIR= ${SHAREDIR}/doc/legal/intel_wpi + +.include <bsd.prog.mk> + diff --git a/sys/contrib/dev/wpi/LICENSE b/sys/contrib/dev/wpi/LICENSE new file mode 100644 index 0000000..e86fd69 --- /dev/null +++ b/sys/contrib/dev/wpi/LICENSE @@ -0,0 +1,39 @@ +Copyright (c) 2006, Intel Corporation.
+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 Intel 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. Intel 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/sys/contrib/dev/wpi/iwlwifi-3945-2.14.4.fw.uu b/sys/contrib/dev/wpi/iwlwifi-3945-2.14.4.fw.uu new file mode 100644 index 0000000..80642b6 --- /dev/null +++ b/sys/contrib/dev/wpi/iwlwifi-3945-2.14.4.fw.uu @@ -0,0 +1,2628 @@ +begin-base64 644 iwlwifi-3945.ucode +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 +z3ABAAIOQMBBxULFAdrPcIAAbEIAiGPCDRwCMA4cRDPPcIAA3AlEwM9wgADACEXAz3B4Rq2dRsBH +wotwINnW/wjYCHHP/89wgABQHqOgpKAb2HwaAjApBm//qMDxwOHF63DYEoSwOdnPcoAA4DtOD2// +ANsJBk//8cAD2gDbz3GgANQHFRmYgM9xoADQDw4ZGIAI2Ahxu//PcIAAUB5joNHA4H9koOB48cBi +DW//CHID3QDez3CgANAPEhhYgxEYmIMY2wAfwEAC23wawjAfEgM2AB/AQBvbfBrCMD8SAzcB4z8a +3DAAH4BA9hICtgAfgEAAH4RDAB9AQM9yoADIH4wSAQAAH0BAkBIAANv/z3CgANQHFhhYgwjYANmZ +uZn/aSBAAFEFT//PcaAAyB/YGQAA3BEAAOB+8cAD2gDbz3GgANQHFRmYgM9xoABkC6QZAgAI2Ahx +i//PcIAAUB5joNHA4H9koOB48cAD2gDbz3GgANQHFRmYgM9xoABUC7QZBAAI2Ahxf//PcIAAUB5j +oNHA4H9koOB48cDhxQPaANvPcaAA1AcVGZiAz3GgANAPDhkYgAjYz3WAAFAeJIUDpUGFAeEwciSl +BfcIcW3/Y6Vkpa0ET//gePHABNgAHwBAA9kA289woADUBxUYWID2yc9xoADQDw4ZGIAI2AhxYf/P +cIAAUB5joNHA4H9koOB4gOEIckHyQCHDA8O5j+F6AC0AJLvMcPAmTHCAAOw7AHwggAQaUAAggAQa +UAAggAQaUAAggAQaUAAggAQaUAAggAQaUAAggAQaUAAggAQaUAAggAQaUAAggAQaUAAggAQaUAAg +gAQaUAAggAQaUAAggAQaUAAggAQaUAAggIAj/48EGlAAzvXgf0hw4HgAFgJACHFAoQAWAkBBoQAW +AkBCoQAWAkBDoQAWAkBEoQAWAkBFoQAWAkBGoQAWAkBHoQAWAkBIoQAWAkBJoQAWAkBKoQAWAkBL +oQAWAEDgfwyh4HiA4uB8Y2rBuoPi4SDNByK78CaMcIAALDwAfECABBmQAATgQIAEGZAABOBAgAQZ +kAAE4ECAgCP/jwTg4SDBBwQZkADt8YDi4HxAIsMDw7qP4uEgzQcku/AmjHCAADw8AHxAiAEZkgAB +4ECIARmSAAHgQIgBGZIAAeBAiAEZkgAB4ECIARmSAAHgQIgBGZIAAeBAiAEZkgAB4ECIARmSAAHg +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 +AAAAAHgMAwBNTU1NTQAAAAAAAAB8DAMATU1NTU0AAAAAAAAAgAwDAE1NTU1NAAAAAAAAAIQNAwBN +TU1NTQAAAAAAAACIDQQATU1NTU0AAAAAAAAAjA0EAE1NTU1NAAAAAAAAAJENBABNTU1NTQAAAAAA +AACVDQQATU1NTU0AAAAAAAAAmQ4EAE1NTU1NAAAAAAAAAJ0OBABNTU1NTQAAAAAAAAChDgQATU1N +TU0AAAAAAAAApQ4EAE1NTU1NAAAAAAAAALcFAQBNTU1NTQAAAAAAAAC4BQEATU1NTU0AAAAAAAAA +uQUBAE1NTU1NAAAAAAAAALsFAQBNTU1NTQAAAAAAAAC8BQEATU1NTU0AAAAAAAAAvQUBAE1NTU1N +AAAAAAAAAMAFAQBNTU1NTQAAAAAAAADEBQEATU1NTU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAsAOAAEgAAAAAAAAAAAAAAPgDgAAIAAAAAAAAAAAAAAAABIAABAAAAAAAAAAAAAAABASAABQA +AAAAAAAAAAAAABgEgABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAVGwAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAD/AAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3CyAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAA//////8AAAAAAAAAAAAAAAoU +bjdkLoAAZC6AAGQugAAAAAAAAAAAAAAAAQADAAAAEAABAAoAAAAQAAEAAAAAABAAAQAGAAAAZC6A +AGQugABkLoAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAMz8AABjAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAA +AAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAAAAAACAAAAAAAAADvvq3eAAAAAAAAAAAAAAAAAQAAAP// +AAACAAAAAAAAAAAAAAD//wAAAAAAAP8AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAP8A8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAAAAAAAAAA +AAADAAAAtDEBAAQAAADAqQAAAgAAAAAlAQAIAAAAZNAAAAoAAAA80QAACwAAAJTVAAAMAAAAwNUA +AAcAAAAg8gAADgAAAHgMAQARAAAAuK8AAAkAAABE6wAAEAAAAPAJAAANAAAApJcAAA8AAABsCAEA +AQAAAFC6AAAGAAAAmAgBABIAAACsBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAA9BWAAC8AAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAFCg8ABQAFAAUBBwAFAgkABQML +AAUEAQAFBQMABQYKAAUIFAAFCDcABQluAAUKAAAAAAAAAAAAAAAAAAAAAA0ABQoPAAUABQAFAQcA +BQIJAAUDCwAFBAEABQUDAAUGCgAFCBQABQg3AAUJbgAFCgAAAAAAAAAAAAAAAAAAAAA0GQAANBkA +ADQZAAAwKQAANBkAADQZAAAkKAAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAA +VBcAAKCFAABgFwAAJIYAAKCHAACAhgAA1IcAADQZAADcLAAAFC8AAOAvAAA0GQAANBkAADQZAADM +KwAANBkAANhSAAB8UwAANBkAADQZAAA0GQAANCkAADQoAAA0GQAANBkAADQZAAA0GQAANBkAADQZ +AAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkA +ADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQqAAB0KQAA +NBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0 +GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAAsKEAADQZAAA0GQAANBkAADQZ +AAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAABzqAAA47QAANBkA +APDRAAA0GQAATNMAAHS+AAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAAOQMAQCcHwEA +NBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0 +GQAA7CQBADQZAABkJwEANBkAADQZAAA0GQAAkBcAALzOAAA0GQAANBkAAHgyAQD0CQAANBkAADQZ +AAA0GQAAoLoAADQZAAA0GQAAZJgAADQZAAA0GQAANBkAADQZAAA0GQAAZLsAALQsAAA0GQAANBkA +ADQZAAA0GQAANBkAADQZAACoAQEANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAA +NBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0 +GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZ +AAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkA +ADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAADQZAAA0GQAA +NBkAADQZAAA0GQAANBkAADQZAAA0GQAANBkAAGgqAABsKgAANBkAADQZAAA0GQAAEAIAAAAAAP// +/////////xACAAAAAAD///////////8QAgAAAAAA////////////EAIAAAAAAP///////////xAC +AAAAAAD///////////8QAgAAAAAA////////////EAIAAAAAAP///////////xACAAAAAAD///// +//////8QAgAAAAAA////////////EAIAAAAAAP///////////xACAAAAAAD///////////8QAgAA +AAAA////////////EAIAAAAAAP///////////xACAAAAAAD///////////8QAgAAAAAA//////// +////EAIAAAAAAP///////////xACAAAAAAD///////////8QAgAAAAAA////////////EAIAAAAA +AP///////////xACAAAAAAD///////////8QAgAAAAAA////////////EAIAAAAAAP////////// +/xACAAAAAAD///////////8QAgAAAAAA////////////EAIAAAAAAP///////////wAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAuAsAAAMAAAAAAAAACAAAAAAAAAA0UAAAkDcAAJiCAABQTgAAzEwAAEyJ +AABEigAAmIoAALSIAACUigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICA +AQECAAAAAAAA/wD/AP8A////AP8BAAAAAAAAAAUAAAAAAAAAVLEAABSyAAAktQAAcLMAAFiyAAAE +tgAAcLYAAKS2AADotgAAAAAAACwBAABeAQAAAQAAAAEAAAABAAAAAQAAAAMAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAADAgMDAwEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAgAAAAACgABAnAADoAwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdNkAALzaAAAY3QAAzN4AALjhAACc5QAACNwAACwF +gACkHoAAGAAAAIwegAAAAAAAAAAAALgsgADYHoAAWOcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAMAIAAQABQA +AwAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAAc +ABoAEAARAAAAAABZAFoAKgAqACoAKgATABMAFUEBAABDAAAHEAMAAUEqrAJBGwATQQAAHhACADzS +AQA90gEAItJQAGEQAgBLEAYAahAYAGsQEgAKEFMADBAoAAsQRgBsEBgAVxAbAAVzQxFukBQAb5AA +MA0QOgAIED8AGxCbAGgQAQBTEA8AVRAeAAuCAQAMggEAJIUDAAiUAAAwhQEAMoUNAD2FDAYTQQAA +FEEwAAGRAP8Ckf/+A5H9/QSR/QAFkQcSBpEiNQeRSl4IkW97CZF/ewqRb14LkUo1DJEiEg2RBwAO +kf39D5H9/hCR/f4Rkf//AgAAACYAAgAnAIAAFgB3ABcAPwAYAAAAGgB3ABsAPwAcAAAAHgB3AB8A +PwAgAAAAIgB3ACMAPwAkAAAACgACALQAOAC1AAEAtgADAIsAAQAjAAEAiQBVAIoAVQB4AAEAeQAj +AHoAJQB8ACIAkgBVAJMAVQBRAAkAMwAJAOYABQDlAAYAANoAAAHaAQAC2gEAA9oCAATaAwAF2gMA +BtoEAAfaBQAI2gUACdoGAAraBwAL2gcADNoIAA3aCQAO2gkAD9oKABDaCwAR2gsAEtoMABPaDQAU +2g0AFdoOABbaDwAX2g8AGNpAABnaQAAa2kEAG9pBABzaQgAd2kMAHtpDAB/aRAAg2kUAIdpFACLa +RgAj2kcAJNpHACXaSAAm2kkAJ9pJACjaZQAp2mYAKtpmACvaZwAs2mgALdpoAC7aaQAv2mkAMNpq +ADHaawAy2msAM9psADTabQA12m0ANtpuADfabwA42m8AOdpwADracQA72nEAPNpyAD3acwA+2nMA +P9p0AEDadQBB2nUAQtp2AEPadwBE2ncARdp4AEbaeQBH2nkASNp6AEnaewBK2nsAS9p8AEzafQBN +2n0ATtp+AE/afwBQ2n8ATxAVAE4QHAAm0koAABArAAIQGAADEBgAUBAYABRBKgAA2gEAAdoCAALa +AgAD2gMABNoEAAXaBAAG2gUAB9oGAAjaBgAJ2gcACtoIAAvaCAAM2gkADdoKAA7aCgAP2gsAENoM +ABHaDAAS2g0AE9oOABTaDgAV2iQAFtokABfaJQAY2iYAGdomABraJwAb2igAHNooAB3aKQAe2ioA +H9oqACDaKwAh2iwAItpBACPaQgAk2kIAJdpDACbaRAAn2kQAKNpFACnaRgAq2kYAK9pHACzaSAAt +2kgALtpJAC/aSgAw2koAMdpLADLaTAAz2kwANNpNADXaTgA22k4AN9pqADjaagA52msAOtpsADva +bAA82m0APdpuAD7abgA/2m8AQNpwAEHacABC2nEAQ9pyAETacgBF2nMARtp0AEfadABI2nUASdp2 +AEradgBL2ncATNp4AE3aeABO2nkAT9p6AFDaegBR2nsATxAVAE4QGAAm0kUAABAqAAIQFAADEBQA +UBAUABRBMgDMAAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAMwADADM +AAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAJkACQCZAAkAmQAJAJkA +CQCZAAkAmQAJAJkACQCZAAkAmQAJAJkACQCZAAkAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAM +AMwADAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAACACAAAgAgAAIAIAACACAAAgAgAAIAIAACACAAAgA +gAAIAIgACACIAAgAiAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAIAIgACACIAAgAiAAIAIgACACIAAgAiAAIAIgA +CADMAAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAM +AMwADADMAAwAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAJkACQCZAAkAmQAJAJkACQCZAAkA +mQAJAJkACQCZAAkAmQAJAJkACQCZAAkAzAAMAMwADADMAAwAzAAMAMwADADMAAwAzAAMAMwADAAN +AAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAADdAAAA3QAAAN0AAADdAAAA3QAAAN0A +AADdAAAA3QAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAhAAAAIQAA +ABAAAAAAAAAAygAAAJkAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAAAtAAkA +LgAUAC8AigBEAAsARgAEAEgAAQBJAAcASgAHAEsADABMABQAWgADAFsAFABcABQAXQAUAF4AFABf +AGMAYAAjAGEAIwBiACMALQAJAC4AFAAvACgARAALAEYABABIAAEASQAHAEoABwBLAAwATAAUAFoA +AwBbABQAXAAUAF0AFABeABQAXwAjAGAAIwBhACMAYgAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAH//wID////BP////////// +////////////Bf8G/wf/CP8J/wr/C/8M/w3/Dv///w7///8P////EP////////////////////// +////////////////////////Ef///xL///8T////FP///xX///8W////F////xj///8Z////Gv// +/xv/////HP///x3///8e////H////yD///8h//////////////////////8iIyT/JSYn//8o//// +/wAAAMz8AAA0AAAAzPwAADUAAADM/AAANgAAAMz8AAA3AAAAzPwAADgAAADM/AAAUgAAAMz8AABT +AAAAzPwAAFQAAADM/AAAVQAAAMz8AABWAAAAcPwAAFBwAABw/AAAUXAAAJD8AAAEggAAkPwAAAWC +AABw/AAACNIAAHD8AAAJ0gAAkPwAAACCAACQ/AAAAYIAAHD8AAAG0gAAcPwAAD6QAABw/AAAP5AA +AHD8AAAT0gAACAAAAO++rd7vvq3eCAAAAO++rd4QAAAAAwAAAAQAAAAEAAAABQAAAAUAAAAFAAAA +BgAAAAYAAAAGAAAACAAAAAwAAADvvq3eCAAAABAAAAAsBYAApB6AABgAAACMHoAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA6 +gADYHoAAAAAAACwFgACkHoAAGAAAAIwegAAAAAAAAAAAAEQ6gADYHoAATDABACwFgACkHoAAGAAA +AIwegAAAAAAAAAAAACwFgACkHoAAGAAAAIwegAAAAAAAAAAAAFw6gADYHoAAKDIBAAAUBQAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAABpbnRlcnJ1cHRfaGFuZGxlcnMuYwBzdGF0ZV9tYWNoaW5lLmMA +AAAAKAAoADAALAAsACgAPAA0ACgAKAA0ADAALAAsAEQAPABAADwAjABsAFgASAD0ALAAVABUAGwA +YABcAFQAjAB4ADoBAgHVAN8A2gCiAHUAfwBqARoB2QDoAAoBugB5AIgAigUqAzkBqAGKBcoC2QBI +AfQCRAK1AdUBlAKEAfUAQQJ01B0AJtQ9EIbSXSBGWH0wRtSdQEY0vlD//////////xiYFBQODhQU +BAwMCAQMBARAAAAAgAAAAAABAAAAAgAAQAAAAAAEAABAAAAAQAAAAHJ4dHhfZGF0YS5jAAEAAAAD +AAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAACgAAABQAAABuAAAANwAAAHJ4b25fZnVuY3MuYwAA +AABhdXhfZnVuY3MuYwAIGwAAYhsAAFwbAABWGwAAUBsAAEobAABEGwAAPhsAADgbAAAyGwAALBsA +ACYbAAAgGwAAGhsAABQbAAAOGwAA4hsAAPobAADyGwAA6hsAACgcAACgHAAAmBwAAJAcAACIHAAA +gBwAAHgcAABwHAAAaBwAAGAcAABYHAAAUBwAAEgcAABAHAAAOBwAADAcAABoY2NhX2Z1bmNzLmMA +dGltZV91dGlsc19jb21wbGV0ZS5jAAABAAICbWlzY19jbWQuYwAAAAAAAA8APwABAAAADwA/AAEA +AAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwACAAAAAQAAAHR4X2Z1bmNzLmMA +c3RhdGlvbklELmMAAKXGhPiZ7o32Df+91rHeVJFQYAMCqc59VhnnYrXmTZrsRY+dH0CJh/oV7+uy +yY4L++xBZ7P9X+pFvyP3U5bkW5vCdRzhrj1qTFpsQX4C9U+DXGj0UTTRCPmT4nOrU2I/KgwIUpVl +Rl6dKDChNw8KtS8JDjYkmxs93ybNaU7Nf5/qGxKeHXRYLjQtNrLc7rT7W/akTXZht859e1I+3XFe +lxP1pmi5AAAswWBAH+PIee22vtRGjdlnS3LelNSY6LBKhWu7KsXlTxbtxYbXmlVmlBHPihDpBgSB +/vCgRHi6JeNL86L+XcCAigWtP7whSHAE8d9jwXd1r2NCMCAa5Q79bb9MgRQYNSYvw+G+ojXMiDku +V5PyVYL8R3qsyOe6KzKV5qDAmBnRnn+jZkR+VKs7gwvKjCnH02s8KHmn4rwdFnatO9tWZE50HhTb +kgoMbEjkuF2fbr3vQ6bEqDmkMTfTi/Iy1UOLWW632owBZLHSnOBJtNj6rAfzJc+vyo706UcYENVv +iPBvSnJcJDjxV8dzUZcjy3yhnOghPt2W3GGGDYUPkOBCfMRxqszYkAUGAfcSHKPCX2r5rtBpkRdY +mSc6uSc42RPrsyszIrvScKmJB6czti0iPJIVIMlJh/+qeFB6pY8D+FmACRca2mUx18aEuNDDgrAp +d1oRHst7/KjWbTosc2VjX2Z1bmNzLmMAZGxwX2Jsb2NrYWNrLmMAcnhfZnVuY3MuYwByeG9uX2V4 +dHJhLmMAc3JhbV90eF91dGlscy5jAAABAgECAwQAAAUGBwgJCgAAAAUGAAIEAAAABQcBAwQAAEAj +QCUhISEhQEBAQEAFBAQBAUBAQEAFBUBADAxADQwMAQEBBUBABQUABAAEQEAABEBAQAVAQEBAQAVA +QEAFBQUBAQEBQAUFBQEFAQFABQUFQAVABUAFBQViZWFjb25fcGFyc2luZy5jAAAAAHRpbWVfbWFj +aGluZS5jAAAAAAAAAAAAAGQAAAAAkAEACgAAAGR0aW0uYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAFEFgAAAAAAAFBNX2ZzbS5jAAAAAAEAAAAFAAAAcmZfa2lsbC5jAAAAAAAAAAAAAAAAAAAA/wAA +AAAAAAAAAAAAAAAAAP8AAAD/AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAB1YXBzZC5jAFBNX2FwaV9j +bWQuYwBQTV9mdW5jLmMAcmFkYXJfZGV0ZWN0LmMAVEdoX21lYXN1cmVtZW50cy5jAAAAAGDsAABw +7AAAgOwAAJDsAACk7AAAuOwAAHF1aWV0LmMAY2hhbm5lbF9zd2l0Y2guYwBhbG1hZ29yX3IuYwBw +aHlfaW5pdC5jAHRlbXBlcmF0dXJlX2NhbGliLmMAdHVuZS5jAACUCwEAmAsBADgLAQDICwEAc2xv +d19kaXZlcnNpdHkuYwAAAADsCAEA+AgBAPwIAQAACQEAcgoBAIgKAQCWCgEAoAoBAHNjYW5fc3Rh +dGVfbWFjaGluZS5jAAAAAKAeAQBYDgEAHBABAFwRAQCYFAEAjBYBADAaAQBMHAEAgB0BAHNjYW5u +aW5nLmMAc2Nhbl91dGlscy5jAAwmAQAgJgEAtCYBAGlic3Nfc3RhdGVfbWFjaGluZS5jAGlic3Nf +cG93ZXJfbWFuYWdtZW50LmMAaWJzc19pbml0LmMAaWJzc190aW1pbmdfdXRpbHMuYwBpYnNzX2Jl +YWNvbl91dGlscy5jAHNlbmRfYXRpbS5jAAAAAAD7f/t/+3/7f/t9+277aftiu327c7tsu2Pzd/Nv +82nzYfNc02rTZLN4s3Gza5N9k3eTcJNqk2WTYZNbc2vreetz623Lf8t5y3PLbMtmy2DLXKtuq2ir +Yot0433jd+Nx42vjZeNgw3HDasNmw1+jcaNqo2ajX4Nxg2qDZoNfY3FjamNmY19DcUNqQ2ZDXyNx +I2ojZiNfA3EDagNmA1/7f/t4+3Lbd9tlu3G7Zptym2d7dXtre2N7XFtsO307djttO2Y7YDtaG2gb +Yhtcc3Zzb3NoU35TeVNxU2lTYzN2M28zaDNiE3QTbRNmE2ITXatxq2urY4t4i3GLa4tja3hrcWtr +a2NLeEtxS2tLYyt4K3EraytjC3gLcQtrC2ODa4NjY3hjcWNrY2NDeENxQ2tDYyN4I3EjayNjA3gE +AAkAGQAyAAUACwAgAEAABgAOACgAUAAIABEAMgBlAAoAFgBAAIAADAAcAFAAoQAQACMAZQDKABQA +LQCAAAABAQAFABQAMgACAAYAGQBAAAMACAAgAFAABAAKACgAZQAFAAwAMgCAAAYAEABAAKEABwAU +AFAAygAJABkAZQAAAXJlZ3VsYXRvcnkuYwAAAADANgEAzDYBAMY2AQDMNgEAtDYBAMw2AQC0NgEA +zDYBALQ2AQCuNgEAujYBAMw2AQC0NgEAzDYBALQ2AQDMNgEAzDYBAMw2AQDMNgEArjYBAAEAAAAF +BQUFBQUFBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH// +Bw8fPwEDAQMPB3TRRRfooosuDQ8FBwkLAQMKFDduAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwA +AAAEAAAADAAAVVVVAUtoLwFVVVUF4ziOA6qqqgJxHMcBqqqqCsdxHAcPDw8HAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAABgcCAwQFAAEICQsKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// +/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +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 +NAUAAKwFAACkBQAAnAUAAJQFAACMBQAAhAUAAHwFAAB0BQAAbAUAAGQFAABcBQAAVAUAAEwFAABE +BQAAPAUAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICCADwAAQABpIAAAaSBAAGkg +AABpIEAAICCADwAA6ABpIAAAaSBAAGkgAABpIEAAICCADwAAeAFpIAAAaSBAAGkgAABKIAAASiEA +AEoiAABKIwAASiQAAEolAABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQ +SiAAIEohACBKIgAgSiMAIEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+AAACAQSycMEAsnDBC +JBw0CiKAP4AAvAQKIwA3sggAAEomAHBpIEAASiYAcEomAHBKJgBwSiYAcI4IAAAgIECHAAAAAAAA +AAAAAAAAAAAAAM9ynwDY/xKiM6IA2Ji4EaLgfuB48cC+CSAA+HAoddhyuHPPcAAAiA7Pcf//pQXP +dgAAAAFgfohzb9gFuGB+qHG72AS4YH5occ9wAAC0C2B+6HHPcAAAuAtgfshxz3CfANj/q6DPcAAA +6A0B2WB+jrnNAQAA4H7geOB+4HjxwFIJAADPdaAAwC8UhQDfi7gUpRSFrLgUpRfYCiQAcOB4qCBA +AeB44HgUhQQgvo8AAGAA+/WKIAgAEaXPc6AAvDc3EwCGOBMChjUTCIY2Ew6Gz3WgAMgfDh3Ykw8d +2JMQHdiTER3YkwDZl7kA2y4P7/8vJEAAb9jPcUCAAgDPdwAAAAFgfwW4ExUAlv24/vMA2J24Ex0Y +kAPZDrnRcUAABgAAIEAQAiaCHwAAAMAKJIAPAAEAAOYO7/8A22/Yz3FAgAIAYH8FuBMVAJb9uP7z +ANiduBMdGJAD3g6+CXAA2clyCiSADwABAACyDu//KHMA2J24Dx0YkM9wgAAIAAAQGgDp2AS4YH// +2WkggABv2M9xQIACAGB/BbhvIT8AnQAAAOB4/ByItvwcSLb8HAi2/BzItfwciLX8HEi1/BwItfwc +yLT8HIi0/BxItPwcCLT8HMiz/ByIs/wcSLPgfuB4BNw43TXw4HgE3DTdM/DgeATcMN0x8OB4BNws +3S/w4HgE3CjdLfDgeATcJN0r8OB4BNwg3Snw4HgE3BzdJ/DgeATcGN0l8OB4BNwU3SPw4HgE3BDd +IfDgeATcDN0f8OB4BNwI3Rzw4HgE3ATdGfA0FBowMBQZMCwUGDAoFBcwJBQWMCAUFTAcFBQwGBQT +MBQUEjAQFBEwDBQQMALHAcawJE0zsCQfM+B+ +==== diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c new file mode 100644 index 0000000..5848b88 --- /dev/null +++ b/sys/dev/wpi/if_wpi.c @@ -0,0 +1,3903 @@ +/*- + * Copyright (c) 2006,2007 + * Damien Bergamini <damien.bergamini@free.fr> + * Benjamin Close <Benjamin.Close@clearchain.com> + * + * Permission to use, copy, modify, and 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. + */ + +#define VERSION "20071102" + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +/* + * Driver for Intel PRO/Wireless 3945ABG 802.11 network adapters. + * + * The 3945ABG network adapter doesn't use traditional hardware as + * many other adaptors do. Instead at run time the eeprom is set into a known + * state and told to load boot firmware. The boot firmware loads an init and a + * main binary firmware image into SRAM on the card via DMA. + * Once the firmware is loaded, the driver/hw then + * communicate by way of circular dma rings via the the SRAM to the firmware. + * + * There is 6 memory rings. 1 command ring, 1 rx data ring & 4 tx data rings. + * The 4 tx data rings allow for prioritization QoS. + * + * The rx data ring consists of 32 dma buffers. Two registers are used to + * indicate where in the ring the driver and the firmware are up to. The + * driver sets the initial read index (reg1) and the initial write index (reg2), + * the firmware updates the read index (reg1) on rx of a packet and fires an + * interrupt. The driver then processes the buffers starting at reg1 indicating + * to the firmware which buffers have been accessed by updating reg2. At the + * same time allocating new memory for the processed buffer. + * + * A similar thing happens with the tx rings. The difference is the firmware + * stop processing buffers once the queue is full and until confirmation + * of a successful transmition (tx_intr) has occurred. + * + * The command ring operates in the same manner as the tx queues. + * + * All communication direct to the card (ie eeprom) is classed as Stage1 + * communication + * + * All communication via the firmware to the card is classed as State2. + * The firmware consists of 2 parts. A bootstrap firmware and a runtime + * firmware. The bootstrap firmware and runtime firmware are loaded + * from host memory via dma to the card then told to execute. From this point + * on the majority of communications between the driver and the card goes + * via the firmware. + */ + +#include <sys/param.h> +#include <sys/sysctl.h> +#include <sys/sockio.h> +#include <sys/mbuf.h> +#include <sys/kernel.h> +#include <sys/socket.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/queue.h> +#include <sys/taskqueue.h> +#include <sys/module.h> +#include <sys/bus.h> +#include <sys/endian.h> +#include <sys/linker.h> +#include <sys/firmware.h> + +#if (__FreeBSD_version > 700000) +#define WPI_CURRENT +#endif + +#include <machine/bus.h> +#include <machine/resource.h> +#ifndef WPI_CURRENT +#include <machine/clock.h> +#endif +#include <sys/rman.h> + +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> + +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_arp.h> +#include <net/ethernet.h> +#include <net/if_dl.h> +#include <net/if_media.h> +#include <net/if_types.h> + +#include <net80211/ieee80211_var.h> +#include <net80211/ieee80211_radiotap.h> +#include <net80211/ieee80211_regdomain.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/in_var.h> +#include <netinet/ip.h> +#include <netinet/if_ether.h> + +#include <dev/wpi/if_wpireg.h> +#include <dev/wpi/if_wpivar.h> + +#define WPI_DEBUG + +#ifdef WPI_DEBUG +#define DPRINTF(x) do { if (wpi_debug != 0) printf x; } while (0) +#define DPRINTFN(n, x) do { if (wpi_debug & n) printf x; } while (0) + +enum { + WPI_DEBUG_UNUSED = 0x00000001, /* Unused */ + WPI_DEBUG_HW = 0x00000002, /* Stage 1 (eeprom) debugging */ + WPI_DEBUG_TX = 0x00000004, /* Stage 2 TX intrp debugging*/ + WPI_DEBUG_RX = 0x00000008, /* Stage 2 RX intrp debugging */ + WPI_DEBUG_CMD = 0x00000010, /* Stage 2 CMD intrp debugging*/ + WPI_DEBUG_FIRMWARE = 0x00000020, /* firmware(9) loading debug */ + WPI_DEBUG_DMA = 0x00000040, /* DMA (de)allocations/syncs */ + WPI_DEBUG_SCANNING = 0x00000080, /* Stage 2 Scanning debugging */ + WPI_DEBUG_NOTIFY = 0x00000100, /* State 2 Noftif intr debug */ + WPI_DEBUG_TEMP = 0x00000200, /* TXPower/Temp Calibration */ + WPI_DEBUG_OPS = 0x00000400, /* wpi_ops taskq debug */ + WPI_DEBUG_WATCHDOG = 0x00000800, /* Watch dog debug */ + WPI_DEBUG_ANY = 0xffffffff +}; + +int wpi_debug = WPI_DEBUG_SCANNING | WPI_DEBUG_CMD | WPI_DEBUG_NOTIFY; +SYSCTL_INT(_debug, OID_AUTO, wpi, CTLFLAG_RW, &wpi_debug, 0, "wpi debug level"); + +#else +#define DPRINTF(x) +#define DPRINTFN(n, x) +#endif + +struct wpi_ident { + uint16_t vendor; + uint16_t device; + uint16_t subdevice; + const char *name; +}; + +static const struct wpi_ident wpi_ident_table[] = { + /* The below entries support ABG regardless of the subid */ + { 0x8086, 0x4222, 0x0, "Intel(R) PRO/Wireless 3945ABG" }, + { 0x8086, 0x4227, 0x0, "Intel(R) PRO/Wireless 3945ABG" }, + /* The below entries only support BG */ + { 0x8086, 0x4222, 0x1005, "Intel(R) PRO/Wireless 3945AB" }, + { 0x8086, 0x4222, 0x1034, "Intel(R) PRO/Wireless 3945AB" }, + { 0x8086, 0x4222, 0x1014, "Intel(R) PRO/Wireless 3945AB" }, + { 0x8086, 0x4222, 0x1044, "Intel(R) PRO/Wireless 3945AB" }, + { 0, 0, 0, NULL } +}; + +static int wpi_dma_contig_alloc(struct wpi_softc *, struct wpi_dma_info *, + void **, bus_size_t, bus_size_t, int); +static void wpi_dma_contig_free(struct wpi_dma_info *); +static void wpi_dma_map_addr(void *, bus_dma_segment_t *, int, int); +static int wpi_alloc_shared(struct wpi_softc *); +static void wpi_free_shared(struct wpi_softc *); +static struct wpi_rbuf *wpi_alloc_rbuf(struct wpi_softc *); +static void wpi_free_rbuf(void *, void *); +static int wpi_alloc_rpool(struct wpi_softc *); +static void wpi_free_rpool(struct wpi_softc *); +static int wpi_alloc_rx_ring(struct wpi_softc *, struct wpi_rx_ring *); +static void wpi_reset_rx_ring(struct wpi_softc *, struct wpi_rx_ring *); +static void wpi_free_rx_ring(struct wpi_softc *, struct wpi_rx_ring *); +static int wpi_alloc_tx_ring(struct wpi_softc *, struct wpi_tx_ring *, + int, int); +static void wpi_reset_tx_ring(struct wpi_softc *, struct wpi_tx_ring *); +static void wpi_free_tx_ring(struct wpi_softc *, struct wpi_tx_ring *); +static struct ieee80211_node *wpi_node_alloc(struct ieee80211_node_table *); +static int wpi_media_change(struct ifnet *); +static int wpi_newstate(struct ieee80211com *, enum ieee80211_state, int); +static void wpi_mem_lock(struct wpi_softc *); +static void wpi_mem_unlock(struct wpi_softc *); +static uint32_t wpi_mem_read(struct wpi_softc *, uint16_t); +static void wpi_mem_write(struct wpi_softc *, uint16_t, uint32_t); +static void wpi_mem_write_region_4(struct wpi_softc *, uint16_t, + const uint32_t *, int); +static uint16_t wpi_read_prom_data(struct wpi_softc *, uint32_t, void *, int); +static int wpi_alloc_fwmem(struct wpi_softc *); +static void wpi_free_fwmem(struct wpi_softc *); +static int wpi_load_firmware(struct wpi_softc *); +static void wpi_unload_firmware(struct wpi_softc *); +static int wpi_load_microcode(struct wpi_softc *, const uint8_t *, int); +static void wpi_rx_intr(struct wpi_softc *, struct wpi_rx_desc *, + struct wpi_rx_data *); +static void wpi_tx_intr(struct wpi_softc *, struct wpi_rx_desc *); +static void wpi_cmd_intr(struct wpi_softc *, struct wpi_rx_desc *); +static void wpi_notif_intr(struct wpi_softc *); +static void wpi_intr(void *); +static void wpi_ops(void *, int); +static uint8_t wpi_plcp_signal(int); +static int wpi_queue_cmd(struct wpi_softc *, int); +static void wpi_tick(void *); +#if 0 +static void wpi_radio_on(void *, int); +static void wpi_radio_off(void *, int); +#endif +static int wpi_tx_data(struct wpi_softc *, struct mbuf *, + struct ieee80211_node *, int); +static void wpi_start(struct ifnet *); +static void wpi_scan_start(struct ieee80211com *); +static void wpi_scan_end(struct ieee80211com *); +static void wpi_set_channel(struct ieee80211com *); +static void wpi_scan_curchan(struct ieee80211com *, unsigned long); +static void wpi_scan_mindwell(struct ieee80211com *); +static void wpi_watchdog(struct ifnet *); +static int wpi_ioctl(struct ifnet *, u_long, caddr_t); +static void wpi_restart(void *, int); +static void wpi_read_eeprom(struct wpi_softc *); +static void wpi_read_eeprom_channels(struct wpi_softc *, int); +static void wpi_read_eeprom_group(struct wpi_softc *, int); +static int wpi_cmd(struct wpi_softc *, int, const void *, int, int); +static int wpi_wme_update(struct ieee80211com *); +static int wpi_mrr_setup(struct wpi_softc *); +static void wpi_set_led(struct wpi_softc *, uint8_t, uint8_t, uint8_t); +static void wpi_enable_tsf(struct wpi_softc *, struct ieee80211_node *); +#if 0 +static int wpi_setup_beacon(struct wpi_softc *, struct ieee80211_node *); +#endif +static int wpi_auth(struct wpi_softc *); +static int wpi_scan(struct wpi_softc *); +static int wpi_config(struct wpi_softc *); +static void wpi_stop_master(struct wpi_softc *); +static int wpi_power_up(struct wpi_softc *); +static int wpi_reset(struct wpi_softc *); +static void wpi_hw_config(struct wpi_softc *); +static void wpi_init(void *); +static void wpi_stop(struct wpi_softc *); +static void wpi_stop_locked(struct wpi_softc *); +static void wpi_iter_func(void *, struct ieee80211_node *); + +static void wpi_newassoc(struct ieee80211_node *, int); +static int wpi_set_txpower(struct wpi_softc *, struct ieee80211_channel *, + int); +static void wpi_calib_timeout(void *); +static void wpi_power_calibration(struct wpi_softc *, int); +static int wpi_get_power_index(struct wpi_softc *, + struct wpi_power_group *, struct ieee80211_channel *, int); +static const char *wpi_cmd_str(int); +static int wpi_probe(device_t); +static int wpi_attach(device_t); +static int wpi_detach(device_t); +static int wpi_shutdown(device_t); +static int wpi_suspend(device_t); +static int wpi_resume(device_t); + + +static device_method_t wpi_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, wpi_probe), + DEVMETHOD(device_attach, wpi_attach), + DEVMETHOD(device_detach, wpi_detach), + DEVMETHOD(device_shutdown, wpi_shutdown), + DEVMETHOD(device_suspend, wpi_suspend), + DEVMETHOD(device_resume, wpi_resume), + + { 0, 0 } +}; + +static driver_t wpi_driver = { + "wpi", + wpi_methods, + sizeof (struct wpi_softc) +}; + +static devclass_t wpi_devclass; + +DRIVER_MODULE(wpi, pci, wpi_driver, wpi_devclass, 0, 0); + +static const uint8_t wpi_ridx_to_plcp[] = { + /* OFDM: IEEE Std 802.11a-1999, pp. 14 Table 80 */ + /* R1-R4 (ral/ural is R4-R1) */ + 0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, + /* CCK: device-dependent */ + 10, 20, 55, 110 +}; +static const uint8_t wpi_ridx_to_rate[] = { + 12, 18, 24, 36, 48, 72, 96, 108, /* OFDM */ + 2, 4, 11, 22 /*CCK */ +}; + + +static int +wpi_probe(device_t dev) +{ + const struct wpi_ident *ident; + + for (ident = wpi_ident_table; ident->name != NULL; ident++) { + if (pci_get_vendor(dev) == ident->vendor && + pci_get_device(dev) == ident->device) { + device_set_desc(dev, ident->name); + return 0; + } + } + return ENXIO; +} + +/** + * Load the firmare image from disk to the allocated dma buffer. + * we also maintain the reference to the firmware pointer as there + * is times where we may need to reload the firmware but we are not + * in a context that can access the filesystem (ie taskq cause by restart) + * + * @return 0 on success, an errno on failure + */ +static int +wpi_load_firmware(struct wpi_softc *sc) +{ +#ifdef WPI_CURRENT + const struct firmware *fp ; +#else + struct firmware *fp; +#endif + struct wpi_dma_info *dma = &sc->fw_dma; + const struct wpi_firmware_hdr *hdr; + const uint8_t *itext, *idata, *rtext, *rdata, *btext; + uint32_t itextsz, idatasz, rtextsz, rdatasz, btextsz; + int error; + WPI_LOCK_DECL; + + DPRINTFN(WPI_DEBUG_FIRMWARE, + ("Attempting Loading Firmware from wpi_fw module\n")); + + WPI_UNLOCK(sc); + + if (sc->fw_fp == NULL && (sc->fw_fp = firmware_get("wpifw")) == NULL) { + device_printf(sc->sc_dev, + "could not load firmware image 'wpifw'\n"); + error = ENOENT; + WPI_LOCK(sc); + goto fail; + } + + fp = sc->fw_fp; + + WPI_LOCK(sc); + + /* Validate the firmware is minimum a particular version */ + if (fp->version < WPI_FW_MINVERSION) { + device_printf(sc->sc_dev, + "firmware version is too old. Need %d, got %d\n", + WPI_FW_MINVERSION, + fp->version); + error = ENXIO; + goto fail; + } + + if (fp->datasize < sizeof (struct wpi_firmware_hdr)) { + device_printf(sc->sc_dev, + "firmware file too short: %zu bytes\n", fp->datasize); + error = ENXIO; + goto fail; + } + + hdr = (const struct wpi_firmware_hdr *)fp->data; + + /* | RUNTIME FIRMWARE | INIT FIRMWARE | BOOT FW | + |HDR|<--TEXT-->|<--DATA-->|<--TEXT-->|<--DATA-->|<--TEXT-->| */ + + rtextsz = le32toh(hdr->rtextsz); + rdatasz = le32toh(hdr->rdatasz); + itextsz = le32toh(hdr->itextsz); + idatasz = le32toh(hdr->idatasz); + btextsz = le32toh(hdr->btextsz); + + /* check that all firmware segments are present */ + if (fp->datasize < sizeof (struct wpi_firmware_hdr) + + rtextsz + rdatasz + itextsz + idatasz + btextsz) { + device_printf(sc->sc_dev, + "firmware file too short: %zu bytes\n", fp->datasize); + error = ENXIO; /* XXX appropriate error code? */ + goto fail; + } + + /* get pointers to firmware segments */ + rtext = (const uint8_t *)(hdr + 1); + rdata = rtext + rtextsz; + itext = rdata + rdatasz; + idata = itext + itextsz; + btext = idata + idatasz; + + DPRINTFN(WPI_DEBUG_FIRMWARE, + ("Firmware Version: Major %d, Minor %d, Driver %d, \n" + "runtime (text: %u, data: %u) init (text: %u, data %u) boot (text %u)\n", + (le32toh(hdr->version) & 0xff000000) >> 24, + (le32toh(hdr->version) & 0x00ff0000) >> 16, + (le32toh(hdr->version) & 0x0000ffff), + rtextsz, rdatasz, + itextsz, idatasz, btextsz)); + + DPRINTFN(WPI_DEBUG_FIRMWARE,("rtext 0x%x\n", *(const uint32_t *)rtext)); + DPRINTFN(WPI_DEBUG_FIRMWARE,("rdata 0x%x\n", *(const uint32_t *)rdata)); + DPRINTFN(WPI_DEBUG_FIRMWARE,("itext 0x%x\n", *(const uint32_t *)itext)); + DPRINTFN(WPI_DEBUG_FIRMWARE,("idata 0x%x\n", *(const uint32_t *)idata)); + DPRINTFN(WPI_DEBUG_FIRMWARE,("btext 0x%x\n", *(const uint32_t *)btext)); + + /* sanity checks */ + if (rtextsz > WPI_FW_MAIN_TEXT_MAXSZ || + rdatasz > WPI_FW_MAIN_DATA_MAXSZ || + itextsz > WPI_FW_INIT_TEXT_MAXSZ || + idatasz > WPI_FW_INIT_DATA_MAXSZ || + btextsz > WPI_FW_BOOT_TEXT_MAXSZ || + (btextsz & 3) != 0) { + device_printf(sc->sc_dev, "firmware invalid\n"); + error = EINVAL; + goto fail; + } + + /* copy initialization images into pre-allocated DMA-safe memory */ + memcpy(dma->vaddr, idata, idatasz); + memcpy(dma->vaddr + WPI_FW_INIT_DATA_MAXSZ, itext, itextsz); + + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); + + /* tell adapter where to find initialization images */ + wpi_mem_lock(sc); + wpi_mem_write(sc, WPI_MEM_DATA_BASE, dma->paddr); + wpi_mem_write(sc, WPI_MEM_DATA_SIZE, idatasz); + wpi_mem_write(sc, WPI_MEM_TEXT_BASE, + dma->paddr + WPI_FW_INIT_DATA_MAXSZ); + wpi_mem_write(sc, WPI_MEM_TEXT_SIZE, itextsz); + wpi_mem_unlock(sc); + + /* load firmware boot code */ + if ((error = wpi_load_microcode(sc, btext, btextsz)) != 0) { + device_printf(sc->sc_dev, "Failed to load microcode\n"); + goto fail; + } + + /* now press "execute" */ + WPI_WRITE(sc, WPI_RESET, 0); + + /* wait at most one second for the first alive notification */ + if ((error = msleep(sc, &sc->sc_mtx, PCATCH, "wpiinit", hz)) != 0) { + device_printf(sc->sc_dev, + "timeout waiting for adapter to initialize\n"); + goto fail; + } + + /* copy runtime images into pre-allocated DMA-sage memory */ + memcpy(dma->vaddr, rdata, rdatasz); + memcpy(dma->vaddr + WPI_FW_MAIN_DATA_MAXSZ, rtext, rtextsz); + bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE); + + /* tell adapter where to find runtime images */ + wpi_mem_lock(sc); + wpi_mem_write(sc, WPI_MEM_DATA_BASE, dma->paddr); + wpi_mem_write(sc, WPI_MEM_DATA_SIZE, rdatasz); + wpi_mem_write(sc, WPI_MEM_TEXT_BASE, + dma->paddr + WPI_FW_MAIN_DATA_MAXSZ); + wpi_mem_write(sc, WPI_MEM_TEXT_SIZE, WPI_FW_UPDATED | rtextsz); + wpi_mem_unlock(sc); + + /* wait at most one second for the first alive notification */ + if ((error = msleep(sc, &sc->sc_mtx, PCATCH, "wpiinit", hz)) != 0) { + device_printf(sc->sc_dev, + "timeout waiting for adapter to initialize2\n"); + goto fail; + } + + DPRINTFN(WPI_DEBUG_FIRMWARE, + ("Firmware loaded to driver successfully\n")); + return error; +fail: + wpi_unload_firmware(sc); + return error; +} + +/** + * Free the referenced firmware image + */ +static void +wpi_unload_firmware(struct wpi_softc *sc) +{ + WPI_LOCK_DECL; + + if (sc->fw_fp) { + WPI_UNLOCK(sc); + firmware_put(sc->fw_fp, FIRMWARE_UNLOAD); + WPI_LOCK(sc); + sc->fw_fp = NULL; + } +} + +static int +wpi_attach(device_t dev) +{ + struct wpi_softc *sc = device_get_softc(dev); + struct ifnet *ifp; + struct ieee80211com *ic = &sc->sc_ic; + int ac, error, supportsa = 1; + uint32_t tmp; + const struct wpi_ident *ident; + + sc->sc_dev = dev; + + if (bootverbose || wpi_debug) + device_printf(sc->sc_dev,"Driver Revision %s\n", VERSION); + + /* + * Some card's only support 802.11b/g not a, check to see if + * this is one such card. A 0x0 in the subdevice table indicates + * the entire subdevice range is to be ignored. + */ + for (ident = wpi_ident_table; ident->name != NULL; ident++) { + if (ident->subdevice && + pci_get_subdevice(dev) == ident->subdevice) { + supportsa = 0; + break; + } + } + +#if __FreeBSD_version >= 700000 + /* + * Create the taskqueues used by the driver. Primarily + * sc_tq handles most the task + */ + sc->sc_tq = taskqueue_create("wpi_taskq", M_NOWAIT | M_ZERO, + taskqueue_thread_enqueue, &sc->sc_tq); + taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, "%s taskq", + device_get_nameunit(dev)); + + sc->sc_tq2 = taskqueue_create("wpi_taskq2", M_NOWAIT | M_ZERO, + taskqueue_thread_enqueue, &sc->sc_tq2); + taskqueue_start_threads(&sc->sc_tq2, 1, PI_NET, "%s taskq2", + device_get_nameunit(dev)); +#else +#error "Sorry, this driver is not yet ready for FreeBSD < 7.0" +#endif + + /* Create the tasks that can be queued */ +#if 0 + TASK_INIT(&sc->sc_radioontask, 0, wpi_radio_on, sc); + TASK_INIT(&sc->sc_radioofftask, 0, wpi_radio_off, sc); +#endif + TASK_INIT(&sc->sc_opstask, 0, wpi_ops, sc); + TASK_INIT(&sc->sc_restarttask, 0, wpi_restart, sc); + + WPI_LOCK_INIT(sc); + WPI_CMD_LOCK_INIT(sc); + + callout_init_mtx(&sc->calib_to, &sc->sc_mtx, 0); + callout_init_mtx(&sc->watchdog_to, &sc->sc_mtx, 0); + + if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) { + device_printf(dev, "chip is in D%d power mode " + "-- setting to D0\n", pci_get_powerstate(dev)); + pci_set_powerstate(dev, PCI_POWERSTATE_D0); + } + + /* disable the retry timeout register */ + pci_write_config(dev, 0x41, 0, 1); + + /* enable bus-mastering */ + pci_enable_busmaster(dev); + + sc->mem_rid = PCIR_BAR(0); + sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, + RF_ACTIVE); + if (sc->mem == NULL) { + device_printf(dev, "could not allocate memory resource\n"); + error = ENOMEM; + goto fail; + } + + sc->sc_st = rman_get_bustag(sc->mem); + sc->sc_sh = rman_get_bushandle(sc->mem); + + sc->irq_rid = 0; + sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, + RF_ACTIVE | RF_SHAREABLE); + if (sc->irq == NULL) { + device_printf(dev, "could not allocate interrupt resource\n"); + error = ENOMEM; + goto fail; + } + + /* + * Allocate DMA memory for firmware transfers. + */ + if ((error = wpi_alloc_fwmem(sc)) != 0) { + printf(": could not allocate firmware memory\n"); + error = ENOMEM; + goto fail; + } + + /* + * Put adapter into a known state. + */ + if ((error = wpi_reset(sc)) != 0) { + device_printf(dev, "could not reset adapter\n"); + goto fail; + } + + wpi_mem_lock(sc); + tmp = wpi_mem_read(sc, WPI_MEM_PCIDEV); + if (bootverbose || wpi_debug) + device_printf(sc->sc_dev, "Hardware Revision (0x%X)\n", tmp); + + wpi_mem_unlock(sc); + + /* Allocate shared page */ + if ((error = wpi_alloc_shared(sc)) != 0) { + device_printf(dev, "could not allocate shared page\n"); + goto fail; + } + + /* + * Allocate the receive buffer pool. The recieve buffers are + * WPI_RBUF_SIZE in length (3k) this is bigger than MCLBYTES + * hence we can't simply use a cluster and used mapped dma memory + * instead. + */ + if ((error = wpi_alloc_rpool(sc)) != 0) { + device_printf(dev, "could not allocate Rx buffers\n"); + goto fail; + } + + /* tx data queues - 4 for QoS purposes */ + for (ac = 0; ac < WME_NUM_AC; ac++) { + error = wpi_alloc_tx_ring(sc, &sc->txq[ac], WPI_TX_RING_COUNT, ac); + if (error != 0) { + device_printf(dev, "could not allocate Tx ring %d\n",ac); + goto fail; + } + } + + /* command queue to talk to the card's firmware */ + error = wpi_alloc_tx_ring(sc, &sc->cmdq, WPI_CMD_RING_COUNT, 4); + if (error != 0) { + device_printf(dev, "could not allocate command ring\n"); + goto fail; + } + + /* receive data queue */ + error = wpi_alloc_rx_ring(sc, &sc->rxq); + if (error != 0) { + device_printf(dev, "could not allocate Rx ring\n"); + goto fail; + } + + ifp = sc->sc_ifp = if_alloc(IFT_ETHER); + if (ifp == NULL) { + device_printf(dev, "can not if_alloc()\n"); + error = ENOMEM; + goto fail; + } + + ic->ic_ifp = ifp; + ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ + ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ + ic->ic_state = IEEE80211_S_INIT; + + /* set device capabilities */ + ic->ic_caps = + IEEE80211_C_WEP /* s/w WEP */ + | IEEE80211_C_MONITOR /* monitor mode supported */ + | IEEE80211_C_TXPMGT /* tx power management */ + | IEEE80211_C_SHSLOT /* short slot time supported */ + | IEEE80211_C_SHPREAMBLE /* short preamble supported */ + | IEEE80211_C_WPA /* 802.11i */ +/* XXX looks like WME is partly supported? */ +#if 0 + | IEEE80211_C_IBSS /* IBSS mode support */ + | IEEE80211_C_BGSCAN /* capable of bg scanning */ + | IEEE80211_C_WME /* 802.11e */ + | IEEE80211_C_HOSTAP /* Host access point mode */ +#endif + ; + + /* + * Read in the eeprom and also setup the channels for + * net80211. We don't set the rates as net80211 does this for us + */ + wpi_read_eeprom(sc); + + if (bootverbose || wpi_debug) { + device_printf(sc->sc_dev, "Regulatory Domain: %.4s\n", sc->domain); + device_printf(sc->sc_dev, "Hardware Type: %c\n", + sc->type > 1 ? 'B': '?'); + device_printf(sc->sc_dev, "Hardware Revision: %c\n", + ((le16toh(sc->rev) & 0xf0) == 0xd0) ? 'D': '?'); + device_printf(sc->sc_dev, "SKU %s support 802.11a\n", + supportsa ? "does" : "does not"); + + /* XXX hw_config uses the PCIDEV for the Hardware rev. Must check + what sc->rev really represents - benjsc 20070615 */ + } + + if_initname(ifp, device_get_name(dev), device_get_unit(dev)); + ifp->if_softc = sc; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_init = wpi_init; + ifp->if_ioctl = wpi_ioctl; + ifp->if_start = wpi_start; + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_READY(&ifp->if_snd); + ieee80211_ifattach(ic); + + /* override default methods */ + ic->ic_node_alloc = wpi_node_alloc; + ic->ic_newassoc = wpi_newassoc; + ic->ic_wme.wme_update = wpi_wme_update; + ic->ic_scan_start = wpi_scan_start; + ic->ic_scan_end = wpi_scan_end; + ic->ic_set_channel = wpi_set_channel; + ic->ic_scan_curchan = wpi_scan_curchan; + ic->ic_scan_mindwell = wpi_scan_mindwell; + + /* override state transition machine */ + sc->sc_newstate = ic->ic_newstate; + ic->ic_newstate = wpi_newstate; + ieee80211_media_init(ic, wpi_media_change, ieee80211_media_status); + + ieee80211_amrr_init(&sc->amrr, ic, + IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD, + IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD); + + /* whilst ieee80211_ifattach will listen for ieee80211 frames, + * we also want to listen for the lower level radio frames + */ + bpfattach2(ifp, DLT_IEEE802_11_RADIO, + sizeof (struct ieee80211_frame) + sizeof (sc->sc_txtap), + &sc->sc_drvbpf); + + sc->sc_rxtap_len = sizeof sc->sc_rxtap; + sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len); + sc->sc_rxtap.wr_ihdr.it_present = htole32(WPI_RX_RADIOTAP_PRESENT); + + sc->sc_txtap_len = sizeof sc->sc_txtap; + sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len); + sc->sc_txtap.wt_ihdr.it_present = htole32(WPI_TX_RADIOTAP_PRESENT); + + /* + * Hook our interrupt after all initialization is complete. + */ + error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET |INTR_MPSAFE , +#ifdef WPI_CURRENT + NULL, +#endif + wpi_intr, sc, &sc->sc_ih); + if (error != 0) { + device_printf(dev, "could not set up interrupt\n"); + goto fail; + } + + ieee80211_announce(ic); +#ifdef XXX_DEBUG + ieee80211_announce_channels(ic); +#endif + + return 0; + +fail: wpi_detach(dev); + return ENXIO; +} + +static int +wpi_detach(device_t dev) +{ + struct wpi_softc *sc = device_get_softc(dev); + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = ic->ic_ifp; + int ac; + WPI_LOCK_DECL; + + if (ifp != NULL) { + wpi_stop(sc); + callout_drain(&sc->watchdog_to); + callout_drain(&sc->calib_to); + bpfdetach(ifp); + ieee80211_ifdetach(ic); + } + + WPI_LOCK(sc); + if (sc->txq[0].data_dmat) { + for (ac = 0; ac < WME_NUM_AC; ac++) + wpi_free_tx_ring(sc, &sc->txq[ac]); + + wpi_free_tx_ring(sc, &sc->cmdq); + wpi_free_rx_ring(sc, &sc->rxq); + wpi_free_rpool(sc); + wpi_free_shared(sc); + } + + if (sc->fw_fp != NULL) { + wpi_unload_firmware(sc); + } + + if (sc->fw_dma.tag) + wpi_free_fwmem(sc); + WPI_UNLOCK(sc); + + if (sc->irq != NULL) { + bus_teardown_intr(dev, sc->irq, sc->sc_ih); + bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); + } + + if (sc->mem != NULL) + bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem); + + if (ifp != NULL) + if_free(ifp); + + taskqueue_free(sc->sc_tq); + taskqueue_free(sc->sc_tq2); + + WPI_LOCK_DESTROY(sc); + WPI_CMD_LOCK_DESTROY(sc); + + return 0; +} + +static void +wpi_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + if (error != 0) + return; + + KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs)); + + *(bus_addr_t *)arg = segs[0].ds_addr; +} + +static int +wpi_dma_contig_alloc(struct wpi_softc *sc, struct wpi_dma_info *dma, + void **kvap, bus_size_t size, bus_size_t alignment, int flags) +{ + int error; + int count = 0; + + DPRINTFN(WPI_DEBUG_DMA, + ("Size: %zd - alignement %zd\n", size, alignment)); + + dma->size = size; + dma->tag = NULL; + +again: + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), alignment, + 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, + NULL, NULL, size, + 1, size, flags, + NULL, NULL, &dma->tag); + if (error != 0) { + device_printf(sc->sc_dev, + "could not create shared page DMA tag\n"); + goto fail; + } + error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr, + flags | BUS_DMA_ZERO, &dma->map); + if (error != 0) { + device_printf(sc->sc_dev, + "could not allocate shared page DMA memory\n"); + goto fail; + } + + /** + * Sadly FreeBSD can't always align on a 16k boundary, hence we give it + * 10 attempts increasing the size of the allocation by 4k each time. + * This should eventually align us on a 16k boundary at the cost + * of chewing up dma memory + */ + if ((((uintptr_t)dma->vaddr) & (alignment-1)) && count < 10) { + DPRINTFN(WPI_DEBUG_DMA, + ("Memory Unaligned, trying again: %d\n", count++)); + wpi_dma_contig_free(dma); + size += 4096; + goto again; + } + + DPRINTFN(WPI_DEBUG_DMA,("Memory, allocated & %s Aligned!\n", + count == 10 ? "FAILED" : "")); + if (count == 10) { + device_printf(sc->sc_dev, "Unable to align memory\n"); + error = ENOMEM; + goto fail; + } + + error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, + size, wpi_dma_map_addr, &dma->paddr, flags); + + if (error != 0) { + device_printf(sc->sc_dev, + "could not load shared page DMA map\n"); + goto fail; + } + + if (kvap != NULL) + *kvap = dma->vaddr; + + return 0; + +fail: + wpi_dma_contig_free(dma); + return error; +} + +static void +wpi_dma_contig_free(struct wpi_dma_info *dma) +{ + if (dma->tag) { + if (dma->map != NULL) { + if (dma->paddr == 0) { + bus_dmamap_sync(dma->tag, dma->map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(dma->tag, dma->map); + } + bus_dmamem_free(dma->tag, &dma->vaddr, dma->map); + } + bus_dma_tag_destroy(dma->tag); + } +} + +/* + * Allocate a shared page between host and NIC. + */ +static int +wpi_alloc_shared(struct wpi_softc *sc) +{ + int error; + + error = wpi_dma_contig_alloc(sc, &sc->shared_dma, + (void **)&sc->shared, sizeof (struct wpi_shared), + PAGE_SIZE, + BUS_DMA_NOWAIT); + + if (error != 0) { + device_printf(sc->sc_dev, + "could not allocate shared area DMA memory\n"); + } + + return error; +} + +static void +wpi_free_shared(struct wpi_softc *sc) +{ + wpi_dma_contig_free(&sc->shared_dma); +} + +struct wpi_rbuf * +wpi_alloc_rbuf(struct wpi_softc *sc) +{ + struct wpi_rbuf *rbuf; + + rbuf = SLIST_FIRST(&sc->rxq.freelist); + if (rbuf == NULL) + return NULL; + SLIST_REMOVE_HEAD(&sc->rxq.freelist, next); + return rbuf; +} + +/* + * This is called automatically by the network stack when the mbuf to which our + * Rx buffer is attached is freed. + */ +static void +wpi_free_rbuf(void *buf, void *arg) +{ + struct wpi_rbuf *rbuf = arg; + struct wpi_softc *sc = rbuf->sc; + WPI_LOCK_DECL; + + WPI_LOCK(sc); + + /* put the buffer back in the free list */ + SLIST_INSERT_HEAD(&sc->rxq.freelist, rbuf, next); + + WPI_UNLOCK(sc); +} + +static int +wpi_alloc_rpool(struct wpi_softc *sc) +{ + struct wpi_rx_ring *ring = &sc->rxq; + struct wpi_rbuf *rbuf; + int i, error; + + /* allocate a big chunk of DMA'able memory.. */ + error = wpi_dma_contig_alloc(sc, &ring->buf_dma, NULL, + WPI_RBUF_COUNT * WPI_RBUF_SIZE, PAGE_SIZE, BUS_DMA_NOWAIT); + if (error != 0) { + device_printf(sc->sc_dev, + "could not allocate Rx buffers DMA memory\n"); + return error; + } + + /* ..and split it into 3KB chunks */ + SLIST_INIT(&ring->freelist); + for (i = 0; i < WPI_RBUF_COUNT; i++) { + rbuf = &ring->rbuf[i]; + + rbuf->sc = sc; /* backpointer for callbacks */ + rbuf->vaddr = ring->buf_dma.vaddr + i * WPI_RBUF_SIZE; + rbuf->paddr = ring->buf_dma.paddr + i * WPI_RBUF_SIZE; + + SLIST_INSERT_HEAD(&ring->freelist, rbuf, next); + } + return 0; +} + +static void +wpi_free_rpool(struct wpi_softc *sc) +{ + wpi_dma_contig_free(&sc->rxq.buf_dma); +} + +static int +wpi_alloc_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring) +{ + + struct wpi_rx_data *data; + struct wpi_rbuf *rbuf; + int i, error; + + ring->cur = 0; + + error = wpi_dma_contig_alloc(sc, &ring->desc_dma, + (void **)&ring->desc, WPI_RX_RING_COUNT * sizeof (uint32_t), + WPI_RING_DMA_ALIGN, BUS_DMA_NOWAIT); + + if (error != 0) { + device_printf(sc->sc_dev, + "could not allocate rx ring DMA memory\n"); + goto fail; + } + + /* + * Allocate Rx buffers. + */ + for (i = 0; i < WPI_RX_RING_COUNT; i++) { + data = &ring->data[i]; + + data->m = m_get(M_DONTWAIT, MT_HEADER); + if (data->m == NULL) { + device_printf(sc->sc_dev, + "could not allocate rx mbuf\n"); + error = ENOBUFS; + goto fail; + } + + if ((rbuf = wpi_alloc_rbuf(sc)) == NULL) { + m_freem(data->m); + data->m = NULL; + device_printf(sc->sc_dev, + "could not allocate rx buffer\n"); + error = ENOBUFS; + goto fail; + } + + /* attach RxBuffer to mbuf */ + MEXTADD(data->m, rbuf->vaddr, WPI_RBUF_SIZE,wpi_free_rbuf, + rbuf,0,EXT_NET_DRV); + + if ((data->m->m_flags & M_EXT) == 0) { + m_freem(data->m); + data->m = NULL; + error = ENOBUFS; + goto fail; + } + ring->desc[i] = htole32(rbuf->paddr); + } + + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); + + return 0; + +fail: + wpi_free_rx_ring(sc, ring); + return error; +} + +static void +wpi_reset_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring) +{ + int ntries; + + wpi_mem_lock(sc); + + WPI_WRITE(sc, WPI_RX_CONFIG, 0); + + for (ntries = 0; ntries < 100; ntries++) { + if (WPI_READ(sc, WPI_RX_STATUS) & WPI_RX_IDLE) + break; + DELAY(10); + } + + wpi_mem_unlock(sc); + +#ifdef WPI_DEBUG + if (ntries == 100 && wpi_debug > 0) + device_printf(sc->sc_dev, "timeout resetting Rx ring\n"); +#endif + + ring->cur = 0; +} + +static void +wpi_free_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring) +{ + int i; + + wpi_dma_contig_free(&ring->desc_dma); + + for (i = 0; i < WPI_RX_RING_COUNT; i++) { + if (ring->data[i].m != NULL) { + m_freem(ring->data[i].m); + ring->data[i].m = NULL; + } + } +} + +static int +wpi_alloc_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring, int count, + int qid) +{ + struct wpi_tx_data *data; + int i, error; + + ring->qid = qid; + ring->count = count; + ring->queued = 0; + ring->cur = 0; + ring->data = NULL; + + error = wpi_dma_contig_alloc(sc, &ring->desc_dma, + (void **)&ring->desc, count * sizeof (struct wpi_tx_desc), + WPI_RING_DMA_ALIGN, BUS_DMA_NOWAIT); + + if (error != 0) { + device_printf(sc->sc_dev, "could not allocate tx dma memory\n"); + goto fail; + } + + /* update shared page with ring's base address */ + sc->shared->txbase[qid] = htole32(ring->desc_dma.paddr); + + error = wpi_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd, + count * sizeof (struct wpi_tx_cmd), WPI_RING_DMA_ALIGN, + BUS_DMA_NOWAIT); + + if (error != 0) { + device_printf(sc->sc_dev, + "could not allocate tx command DMA memory\n"); + goto fail; + } + + ring->data = malloc(count * sizeof (struct wpi_tx_data), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (ring->data == NULL) { + device_printf(sc->sc_dev, + "could not allocate tx data slots\n"); + goto fail; + } + + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, + WPI_MAX_SCATTER - 1, MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL, + &ring->data_dmat); + if (error != 0) { + device_printf(sc->sc_dev, "could not create data DMA tag\n"); + goto fail; + } + + for (i = 0; i < count; i++) { + data = &ring->data[i]; + + error = bus_dmamap_create(ring->data_dmat, 0, &data->map); + if (error != 0) { + device_printf(sc->sc_dev, + "could not create tx buf DMA map\n"); + goto fail; + } + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_PREWRITE); + } + + return 0; + +fail: wpi_free_tx_ring(sc, ring); + return error; +} + +static void +wpi_reset_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring) +{ + struct wpi_tx_data *data; + int i, ntries; + + wpi_mem_lock(sc); + + WPI_WRITE(sc, WPI_TX_CONFIG(ring->qid), 0); + for (ntries = 0; ntries < 100; ntries++) { + if (WPI_READ(sc, WPI_TX_STATUS) & WPI_TX_IDLE(ring->qid)) + break; + DELAY(10); + } +#ifdef WPI_DEBUG + if (ntries == 100 && wpi_debug > 0) { + device_printf(sc->sc_dev, "timeout resetting Tx ring %d\n", + ring->qid); + } +#endif + wpi_mem_unlock(sc); + + for (i = 0; i < ring->count; i++) { + data = &ring->data[i]; + + if (data->m != NULL) { + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); + data->m = NULL; + } + } + + ring->queued = 0; + ring->cur = 0; +} + +static void +wpi_free_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring) +{ + struct wpi_tx_data *data; + int i; + + wpi_dma_contig_free(&ring->desc_dma); + wpi_dma_contig_free(&ring->cmd_dma); + + if (ring->data != NULL) { + for (i = 0; i < ring->count; i++) { + data = &ring->data[i]; + + if (data->m != NULL) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); + data->m = NULL; + } + } + free(ring->data, M_DEVBUF); + } + + if (ring->data_dmat != NULL) + bus_dma_tag_destroy(ring->data_dmat); +} + +static int +wpi_shutdown(device_t dev) +{ + struct wpi_softc *sc = device_get_softc(dev); + WPI_LOCK_DECL; + + WPI_LOCK(sc); + wpi_stop_locked(sc); + wpi_unload_firmware(sc); + WPI_UNLOCK(sc); + + return 0; +} + +static int +wpi_suspend(device_t dev) +{ + struct wpi_softc *sc = device_get_softc(dev); + + wpi_stop(sc); + return 0; +} + +static int +wpi_resume(device_t dev) +{ + struct wpi_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->sc_ic.ic_ifp; + + pci_write_config(dev, 0x41, 0, 1); + + if (ifp->if_flags & IFF_UP) { + wpi_init(ifp->if_softc); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + wpi_start(ifp); + } + return 0; +} + +/* ARGSUSED */ +static struct ieee80211_node * +wpi_node_alloc(struct ieee80211_node_table *ic) +{ + struct wpi_node *wn; + + wn = malloc(sizeof (struct wpi_node), M_80211_NODE, M_NOWAIT |M_ZERO); + + return &wn->ni; +} + +static int +wpi_media_change(struct ifnet *ifp) +{ + int error; + + error = ieee80211_media_change(ifp); + if (error != ENETRESET) + return error; + + if ((ifp->if_flags & IFF_UP) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) + wpi_init(ifp->if_softc); + + return 0; +} + +/** + * Called by net80211 when ever there is a change to 80211 state machine + */ +static int +wpi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) +{ + struct ifnet *ifp = ic->ic_ifp; + struct wpi_softc *sc = ifp->if_softc; + struct ieee80211_node *ni; + int error; + + callout_stop(&sc->calib_to); + + switch (nstate) { + case IEEE80211_S_SCAN: + DPRINTF(("NEWSTATE:SCAN\n")); + /* Scanning is handled in net80211 via the scan_start, + * scan_end, scan_curchan functions. Hence all we do when + * changing to the SCAN state is update the leds + */ + + /* make the link LED blink while we're scanning */ + wpi_set_led(sc, WPI_LED_LINK, 20, 2); + break; + + case IEEE80211_S_ASSOC: + DPRINTF(("NEWSTATE:ASSOC\n")); + if (ic->ic_state != IEEE80211_S_RUN) + break; + /* FALLTHROUGH */ + + case IEEE80211_S_AUTH: + DPRINTF(("NEWSTATE:AUTH\n")); + sc->flags |= WPI_FLAG_AUTH; + sc->config.associd = 0; + sc->config.filter &= ~htole32(WPI_FILTER_BSS); + wpi_queue_cmd(sc,WPI_AUTH); + DPRINTF(("END AUTH\n")); + break; + + case IEEE80211_S_RUN: + DPRINTF(("NEWSTATE:RUN\n")); + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + /* link LED blinks while monitoring */ + wpi_set_led(sc, WPI_LED_LINK, 5, 5); + break; + } + +#if 0 + if (ic->ic_opmode != IEEE80211_M_STA) { + (void) wpi_auth(sc); /* XXX */ + wpi_setup_beacon(sc, ic->ic_bss); + } +#endif + + ni = ic->ic_bss; + wpi_enable_tsf(sc, ni); + + /* update adapter's configuration */ + sc->config.associd = htole16(ni->ni_associd & ~0xc000); + /* short preamble/slot time are negotiated when associating */ + sc->config.flags &= ~htole32(WPI_CONFIG_SHPREAMBLE | + WPI_CONFIG_SHSLOT); + if (ic->ic_flags & IEEE80211_F_SHSLOT) + sc->config.flags |= htole32(WPI_CONFIG_SHSLOT); + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) + sc->config.flags |= htole32(WPI_CONFIG_SHPREAMBLE); + sc->config.filter |= htole32(WPI_FILTER_BSS); +#if 0 + if (ic->ic_opmode != IEEE80211_M_STA) + sc->config.filter |= htole32(WPI_FILTER_BEACON); +#endif + +/* XXX put somewhere HC_QOS_SUPPORT_ASSOC + HC_IBSS_START */ + + DPRINTF(("config chan %d flags %x\n", sc->config.chan, + sc->config.flags)); + error = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->config, + sizeof (struct wpi_config), 1); + if (error != 0) { + device_printf(sc->sc_dev, + "could not update configuration\n"); + return error; + } + + if ((error = wpi_set_txpower(sc, ic->ic_bss->ni_chan, 1)) != 0) { + device_printf(sc->sc_dev, + "could set txpower\n"); + return error; + } + + if (ic->ic_opmode == IEEE80211_M_STA) { + /* fake a join to init the tx rate */ + wpi_newassoc(ic->ic_bss, 1); + } + + /* start automatic rate control timer */ + callout_reset(&sc->calib_to, hz/2, wpi_calib_timeout, sc); + + /* link LED always on while associated */ + wpi_set_led(sc, WPI_LED_LINK, 0, 1); + break; + + case IEEE80211_S_INIT: + DPRINTF(("NEWSTATE:INIT\n")); + break; + + default: + break; + } + + return (*sc->sc_newstate)(ic, nstate, arg); +} + +/* + * Grab exclusive access to NIC memory. + */ +static void +wpi_mem_lock(struct wpi_softc *sc) +{ + int ntries; + uint32_t tmp; + + tmp = WPI_READ(sc, WPI_GPIO_CTL); + WPI_WRITE(sc, WPI_GPIO_CTL, tmp | WPI_GPIO_MAC); + + /* spin until we actually get the lock */ + for (ntries = 0; ntries < 100; ntries++) { + if ((WPI_READ(sc, WPI_GPIO_CTL) & + (WPI_GPIO_CLOCK | WPI_GPIO_SLEEP)) == WPI_GPIO_CLOCK) + break; + DELAY(10); + } + if (ntries == 100) + device_printf(sc->sc_dev, "could not lock memory\n"); +} + +/* + * Release lock on NIC memory. + */ +static void +wpi_mem_unlock(struct wpi_softc *sc) +{ + uint32_t tmp = WPI_READ(sc, WPI_GPIO_CTL); + WPI_WRITE(sc, WPI_GPIO_CTL, tmp & ~WPI_GPIO_MAC); +} + +static uint32_t +wpi_mem_read(struct wpi_softc *sc, uint16_t addr) +{ + WPI_WRITE(sc, WPI_READ_MEM_ADDR, WPI_MEM_4 | addr); + return WPI_READ(sc, WPI_READ_MEM_DATA); +} + +static void +wpi_mem_write(struct wpi_softc *sc, uint16_t addr, uint32_t data) +{ + WPI_WRITE(sc, WPI_WRITE_MEM_ADDR, WPI_MEM_4 | addr); + WPI_WRITE(sc, WPI_WRITE_MEM_DATA, data); +} + +static void +wpi_mem_write_region_4(struct wpi_softc *sc, uint16_t addr, + const uint32_t *data, int wlen) +{ + for (; wlen > 0; wlen--, data++, addr+=4) + wpi_mem_write(sc, addr, *data); +} + +/* + * Read data from the EEPROM. We access EEPROM through the MAC instead of + * using the traditional bit-bang method. Data is read up until len bytes have + * been obtained. + */ +static uint16_t +wpi_read_prom_data(struct wpi_softc *sc, uint32_t addr, void *data, int len) +{ + int ntries; + uint32_t val; + uint8_t *out = data; + + wpi_mem_lock(sc); + + for (; len > 0; len -= 2, addr++) { + WPI_WRITE(sc, WPI_EEPROM_CTL, addr << 2); + + for (ntries = 0; ntries < 10; ntries++) { + if ((val = WPI_READ(sc, WPI_EEPROM_CTL)) & WPI_EEPROM_READY) + break; + DELAY(5); + } + + if (ntries == 10) { + device_printf(sc->sc_dev, "could not read EEPROM\n"); + return ETIMEDOUT; + } + + *out++= val >> 16; + if (len > 1) + *out ++= val >> 24; + } + + wpi_mem_unlock(sc); + + return 0; +} + +/* + * The firmware text and data segments are transferred to the NIC using DMA. + * The driver just copies the firmware into DMA-safe memory and tells the NIC + * where to find it. Once the NIC has copied the firmware into its internal + * memory, we can free our local copy in the driver. + */ +static int +wpi_load_microcode(struct wpi_softc *sc, const uint8_t *fw, int size) +{ + int error, ntries; + + DPRINTFN(WPI_DEBUG_HW,("Loading microcode size 0x%x\n", size)); + + size /= sizeof(uint32_t); + + wpi_mem_lock(sc); + + wpi_mem_write_region_4(sc, WPI_MEM_UCODE_BASE, + (const uint32_t *)fw, size); + + wpi_mem_write(sc, WPI_MEM_UCODE_SRC, 0); + wpi_mem_write(sc, WPI_MEM_UCODE_DST, WPI_FW_TEXT); + wpi_mem_write(sc, WPI_MEM_UCODE_SIZE, size); + + /* run microcode */ + wpi_mem_write(sc, WPI_MEM_UCODE_CTL, WPI_UC_RUN); + + /* wait while the adapter is busy copying the firmware */ + for (error = 0, ntries = 0; ntries < 1000; ntries++) { + uint32_t status = WPI_READ(sc, WPI_TX_STATUS); + DPRINTFN(WPI_DEBUG_HW, + ("firmware status=0x%x, val=0x%x, result=0x%x\n", status, + WPI_TX_IDLE(6), status & WPI_TX_IDLE(6))); + if (status & WPI_TX_IDLE(6)) { + DPRINTFN(WPI_DEBUG_HW, + ("Status Match! - ntries = %d\n", ntries)); + break; + } + DELAY(10); + } + if (ntries == 1000) { + device_printf(sc->sc_dev, "timeout transferring firmware\n"); + error = ETIMEDOUT; + } + + /* start the microcode executing */ + wpi_mem_write(sc, WPI_MEM_UCODE_CTL, WPI_UC_ENABLE); + + wpi_mem_unlock(sc); + + return (error); +} + +static void +wpi_rx_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc, + struct wpi_rx_data *data) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = ic->ic_ifp; + struct wpi_rx_ring *ring = &sc->rxq; + struct wpi_rx_stat *stat; + struct wpi_rx_head *head; + struct wpi_rx_tail *tail; + struct wpi_rbuf *rbuf; + struct ieee80211_frame *wh; + struct ieee80211_node *ni; + struct mbuf *m, *mnew; + WPI_LOCK_DECL; + + stat = (struct wpi_rx_stat *)(desc + 1); + + if (stat->len > WPI_STAT_MAXLEN) { + device_printf(sc->sc_dev, "invalid rx statistic header\n"); + ifp->if_ierrors++; + return; + } + + head = (struct wpi_rx_head *)((caddr_t)(stat + 1) + stat->len); + tail = (struct wpi_rx_tail *)((caddr_t)(head + 1) + le16toh(head->len)); + + DPRINTFN(WPI_DEBUG_RX, ("rx intr: idx=%d len=%d stat len=%d rssi=%d " + "rate=%x chan=%d tstamp=%ju\n", ring->cur, le32toh(desc->len), + le16toh(head->len), (int8_t)stat->rssi, head->rate, head->chan, + (uintmax_t)le64toh(tail->tstamp))); + + m = data->m; + + /* finalize mbuf */ + m->m_pkthdr.rcvif = ifp; + m->m_data = (caddr_t)(head + 1); + m->m_pkthdr.len = m->m_len = le16toh(head->len); + + if ((rbuf = SLIST_FIRST(&sc->rxq.freelist)) != NULL) { + mnew = m_gethdr(M_DONTWAIT,MT_DATA); + if (mnew == NULL) { + ifp->if_ierrors++; + return; + } + + /* attach Rx buffer to mbuf */ + MEXTADD(mnew,rbuf->vaddr,WPI_RBUF_SIZE, wpi_free_rbuf, rbuf, 0, + EXT_NET_DRV); + SLIST_REMOVE_HEAD(&sc->rxq.freelist, next); + data->m = mnew; + + /* update Rx descriptor */ + ring->desc[ring->cur] = htole32(rbuf->paddr); + } else { + /* no free rbufs, copy frame */ + m = m_dup(m, M_DONTWAIT); + if (m == NULL) { + /* no free mbufs either, drop frame */ + ifp->if_ierrors++; + return; + } + } + +#ifndef WPI_CURRENT + if (sc->sc_drvbpf != NULL) { +#else + if (bpf_peers_present(sc->sc_drvbpf)) { +#endif + struct wpi_rx_radiotap_header *tap = &sc->sc_rxtap; + + tap->wr_flags = 0; + tap->wr_chan_freq = + htole16(ic->ic_channels[head->chan].ic_freq); + tap->wr_chan_flags = + htole16(ic->ic_channels[head->chan].ic_flags); + tap->wr_dbm_antsignal = (int8_t)(stat->rssi - WPI_RSSI_OFFSET); + tap->wr_dbm_antnoise = (int8_t)le16toh(stat->noise); + tap->wr_tsft = tail->tstamp; + tap->wr_antenna = (le16toh(head->flags) >> 4) & 0xf; + switch (head->rate) { + /* CCK rates */ + case 10: tap->wr_rate = 2; break; + case 20: tap->wr_rate = 4; break; + case 55: tap->wr_rate = 11; break; + case 110: tap->wr_rate = 22; break; + /* OFDM rates */ + case 0xd: tap->wr_rate = 12; break; + case 0xf: tap->wr_rate = 18; break; + case 0x5: tap->wr_rate = 24; break; + case 0x7: tap->wr_rate = 36; break; + case 0x9: tap->wr_rate = 48; break; + case 0xb: tap->wr_rate = 72; break; + case 0x1: tap->wr_rate = 96; break; + case 0x3: tap->wr_rate = 108; break; + /* unknown rate: should not happen */ + default: tap->wr_rate = 0; + } + if (le16toh(head->flags) & 0x4) + tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + + bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m); + } + + wh = mtod(m, struct ieee80211_frame *); + WPI_UNLOCK(sc); + + /* XXX frame length > sizeof(struct ieee80211_frame_min)? */ + /* grab a reference to the source node */ + ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); + + /* send the frame to the 802.11 layer */ + ieee80211_input(ic, m, ni, stat->rssi, 0, 0); + + /* release node reference */ + ieee80211_free_node(ni); + WPI_LOCK(sc); +} + +static void +wpi_tx_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc) +{ + struct ifnet *ifp = sc->sc_ic.ic_ifp; + struct wpi_tx_ring *ring = &sc->txq[desc->qid & 0x3]; + struct wpi_tx_data *txdata = &ring->data[desc->idx]; + struct wpi_tx_stat *stat = (struct wpi_tx_stat *)(desc + 1); + struct wpi_node *wn = (struct wpi_node *)txdata->ni; + + DPRINTFN(WPI_DEBUG_TX, ("tx done: qid=%d idx=%d retries=%d nkill=%d " + "rate=%x duration=%d status=%x\n", desc->qid, desc->idx, + stat->ntries, stat->nkill, stat->rate, le32toh(stat->duration), + le32toh(stat->status))); + + /* + * Update rate control statistics for the node. + * XXX we should not count mgmt frames since they're always sent at + * the lowest available bit-rate. + * XXX frames w/o ACK shouldn't be used either + */ + wn->amn.amn_txcnt++; + if (stat->ntries > 0) { + DPRINTFN(3, ("%d retries\n", stat->ntries)); + wn->amn.amn_retrycnt++; + } + + /* XXX oerrors should only count errors !maxtries */ + if ((le32toh(stat->status) & 0xff) != 1) + ifp->if_oerrors++; + else + ifp->if_opackets++; + + bus_dmamap_sync(ring->data_dmat, txdata->map, BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->data_dmat, txdata->map); + /* XXX handle M_TXCB? */ + m_freem(txdata->m); + txdata->m = NULL; + ieee80211_free_node(txdata->ni); + txdata->ni = NULL; + + ring->queued--; + + sc->sc_tx_timer = 0; + sc->watchdog_cnt = 0; + callout_stop(&sc->watchdog_to); + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + wpi_start(ifp); +} + +static void +wpi_cmd_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc) +{ + struct wpi_tx_ring *ring = &sc->cmdq; + struct wpi_tx_data *data; + + DPRINTFN(WPI_DEBUG_CMD, ("cmd notification qid=%x idx=%d flags=%x " + "type=%s len=%d\n", desc->qid, desc->idx, + desc->flags, wpi_cmd_str(desc->type), + le32toh(desc->len))); + + if ((desc->qid & 7) != 4) + return; /* not a command ack */ + + data = &ring->data[desc->idx]; + + /* if the command was mapped in a mbuf, free it */ + if (data->m != NULL) { + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); + data->m = NULL; + } + + sc->flags &= ~WPI_FLAG_BUSY; + wakeup(&ring->cmd[desc->idx]); +} + +static void +wpi_notif_intr(struct wpi_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct wpi_rx_desc *desc; + struct wpi_rx_data *data; + uint32_t hw; + + hw = le32toh(sc->shared->next); + while (sc->rxq.cur != hw) { + data = &sc->rxq.data[sc->rxq.cur]; + desc = (void *)data->m->m_ext.ext_buf; + + DPRINTFN(WPI_DEBUG_NOTIFY, + ("notify qid=%x idx=%d flags=%x type=%d len=%d\n", + desc->qid, + desc->idx, + desc->flags, + desc->type, + le32toh(desc->len))); + + if (!(desc->qid & 0x80)) /* reply to a command */ + wpi_cmd_intr(sc, desc); + + /* XXX beacon miss handling? */ + switch (desc->type) { + case WPI_RX_DONE: + /* a 802.11 frame was received */ + wpi_rx_intr(sc, desc, data); + break; + + case WPI_TX_DONE: + /* a 802.11 frame has been transmitted */ + wpi_tx_intr(sc, desc); + break; + + case WPI_UC_READY: + { + struct wpi_ucode_info *uc = + (struct wpi_ucode_info *)(desc + 1); + + /* the microcontroller is ready */ + DPRINTF(("microcode alive notification version %x " + "alive %x\n", le32toh(uc->version), + le32toh(uc->valid))); + + if (le32toh(uc->valid) != 1) { + device_printf(sc->sc_dev, + "microcontroller initialization failed\n"); + wpi_stop_locked(sc); + } + break; + } + case WPI_STATE_CHANGED: + { + uint32_t *status = (uint32_t *)(desc + 1); + + /* enabled/disabled notification */ + DPRINTF(("state changed to %x\n", le32toh(*status))); + + if (le32toh(*status) & 1) { + device_printf(sc->sc_dev, + "Radio transmitter is switched off\n"); + sc->flags |= WPI_FLAG_HW_RADIO_OFF; + break; + } + sc->flags &= ~WPI_FLAG_HW_RADIO_OFF; + break; + } + case WPI_START_SCAN: + { + struct wpi_start_scan *scan = + (struct wpi_start_scan *)(desc + 1); + + DPRINTFN(WPI_DEBUG_SCANNING, + ("scanning channel %d status %x\n", + scan->chan, le32toh(scan->status))); + + /* fix current channel */ + ic->ic_bss->ni_chan = &ic->ic_channels[scan->chan]; + break; + } + case WPI_STOP_SCAN: + { + struct wpi_stop_scan *scan = + (struct wpi_stop_scan *)(desc + 1); + + DPRINTFN(WPI_DEBUG_SCANNING, + ("scan finished nchan=%d status=%d chan=%d\n", + scan->nchan, scan->status, scan->chan)); + + wpi_queue_cmd(sc, WPI_SCAN_NEXT); + break; + } + } + + sc->rxq.cur = (sc->rxq.cur + 1) % WPI_RX_RING_COUNT; + } + + /* tell the firmware what we have processed */ + hw = (hw == 0) ? WPI_RX_RING_COUNT - 1 : hw - 1; + WPI_WRITE(sc, WPI_RX_WIDX, hw & ~7); + +} + +static void +wpi_intr(void *arg) +{ + struct wpi_softc *sc = arg; + uint32_t r; + WPI_LOCK_DECL; + + WPI_LOCK(sc); + + r = WPI_READ(sc, WPI_INTR); + if (r == 0 || r == 0xffffffff) { + WPI_UNLOCK(sc); + return; + } + + /* disable interrupts */ + WPI_WRITE(sc, WPI_MASK, 0); + /* ack interrupts */ + WPI_WRITE(sc, WPI_INTR, r); + + if (r & (WPI_SW_ERROR | WPI_HW_ERROR)) { + device_printf(sc->sc_dev, "fatal firmware error\n"); + DPRINTFN(6,("(%s)\n", (r & WPI_SW_ERROR) ? "(Software Error)" : + "(Hardware Error)")); + taskqueue_enqueue(sc->sc_tq2, &sc->sc_restarttask); + sc->flags &= ~WPI_FLAG_BUSY; + WPI_UNLOCK(sc); + return; + } + + if (r & WPI_RX_INTR) + wpi_notif_intr(sc); + + if (r & WPI_ALIVE_INTR) /* firmware initialized */ + wakeup(sc); + + /* re-enable interrupts */ + if (sc->sc_ifp->if_flags & IFF_UP) + WPI_WRITE(sc, WPI_MASK, WPI_INTR_MASK); + + WPI_UNLOCK(sc); +} + +static uint8_t +wpi_plcp_signal(int rate) +{ + switch (rate) { + /* CCK rates (returned values are device-dependent) */ + case 2: return 10; + case 4: return 20; + case 11: return 55; + case 22: return 110; + + /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ + /* R1-R4 (ral/ural is R4-R1) */ + case 12: return 0xd; + case 18: return 0xf; + case 24: return 0x5; + case 36: return 0x7; + case 48: return 0x9; + case 72: return 0xb; + case 96: return 0x1; + case 108: return 0x3; + + /* unsupported rates (should not get there) */ + default: return 0; + } +} + +/* quickly determine if a given rate is CCK or OFDM */ +#define WPI_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22) + +/* + * Construct the data packet for a transmit buffer and acutally put + * the buffer onto the transmit ring, kicking the card to process the + * the buffer. + */ +static int +wpi_tx_data(struct wpi_softc *sc, struct mbuf *m0, struct ieee80211_node *ni, + int ac) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct wpi_tx_ring *ring = &sc->txq[ac]; + struct wpi_tx_desc *desc; + struct wpi_tx_data *data; + struct wpi_tx_cmd *cmd; + struct wpi_cmd_data *tx; + struct ieee80211_frame *wh; + struct ieee80211_key *k; + const struct chanAccParams *cap; + struct mbuf *mnew; + int i, error, nsegs, rate, hdrlen, noack = 0; + bus_dma_segment_t segs[WPI_MAX_SCATTER]; + + desc = &ring->desc[ring->cur]; + data = &ring->data[ring->cur]; + + wh = mtod(m0, struct ieee80211_frame *); + + if (IEEE80211_QOS_HAS_SEQ(wh)) { + hdrlen = sizeof (struct ieee80211_qosframe); + cap = &ic->ic_wme.wme_chanParams; + noack = cap->cap_wmeParams[ac].wmep_noackPolicy; + } else + hdrlen = sizeof (struct ieee80211_frame); + + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + if ((k = ieee80211_crypto_encap(ic, ni, m0)) == NULL) { + m_freem(m0); + return ENOBUFS; + } + + /* packet header may have moved, reset our local pointer */ + wh = mtod(m0, struct ieee80211_frame *); + } + + /* pickup a rate */ + if (IEEE80211_IS_MULTICAST(wh->i_addr1)|| + ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == + IEEE80211_FC0_TYPE_MGT)) { + /* + * mgmt/multicast frames are sent at the lowest available + * bit-rate + */ + rate = ni->ni_rates.rs_rates[0]; + } else { + if (ic->ic_fixed_rate != -1) { + rate = ic->ic_sup_rates[ic->ic_curmode]. + rs_rates[ic->ic_fixed_rate]; + } else + rate = ni->ni_rates.rs_rates[ni->ni_txrate]; + } + rate &= IEEE80211_RATE_VAL; + +#ifndef WPI_CURRENT + if (sc->sc_drvbpf != NULL) { +#else + if (bpf_peers_present(sc->sc_drvbpf)) { +#endif + + struct wpi_tx_radiotap_header *tap = &sc->sc_txtap; + + tap->wt_flags = 0; + tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq); + tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags); + tap->wt_rate = rate; + tap->wt_hwqueue = ac; + if (wh->i_fc[1] & IEEE80211_FC1_WEP) + tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; + + bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0); + } + + cmd = &ring->cmd[ring->cur]; + cmd->code = WPI_CMD_TX_DATA; + cmd->flags = 0; + cmd->qid = ring->qid; + cmd->idx = ring->cur; + + tx = (struct wpi_cmd_data *)cmd->data; + tx->flags = 0; + + if (!noack && !IEEE80211_IS_MULTICAST(wh->i_addr1)) { + tx->flags |= htole32(WPI_TX_NEED_ACK); + } else if (m0->m_pkthdr.len + IEEE80211_CRC_LEN > ic->ic_rtsthreshold) { + tx->flags |= htole32(WPI_TX_NEED_RTS | WPI_TX_FULL_TXOP); + } + + tx->flags |= htole32(WPI_TX_AUTO_SEQ); + + tx->id = IEEE80211_IS_MULTICAST(wh->i_addr1) ? WPI_ID_BROADCAST : + WPI_ID_BSS; + + if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == + IEEE80211_FC0_TYPE_MGT) { + uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; + /* tell h/w to set timestamp in probe responses */ + if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) + tx->flags |= htole32(WPI_TX_INSERT_TSTAMP); + + if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ || + subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) + tx->timeout = htole16(3); + else + tx->timeout = htole16(2); + } else + tx->timeout = htole16(0); + + tx->rate = wpi_plcp_signal(rate); + + /* be very persistant at sending frames out */ + tx->rts_ntries = 7; + tx->data_ntries = 15; + + tx->ofdm_mask = 0xff; + tx->cck_mask = 0x0f; + tx->lifetime = htole32(WPI_LIFETIME_INFINITE); + + tx->len = htole16(m0->m_pkthdr.len); + + /* save and trim IEEE802.11 header */ + m_copydata(m0, 0, hdrlen, (caddr_t)&tx->wh); + m_adj(m0, hdrlen); + + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m0, segs, + &nsegs, BUS_DMA_NOWAIT); + if (error != 0 && error != EFBIG) { + device_printf(sc->sc_dev, "could not map mbuf (error %d)\n", + error); + m_freem(m0); + return error; + } + if (error != 0) { + /* XXX use ath_defrag */ + mnew = m_defrag(m0, M_DONTWAIT); + if (mnew == NULL) { + device_printf(sc->sc_dev, + "could not defragment mbuf\n"); + m_freem(m0); + return ENOBUFS; + } + m0 = mnew; + + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, + m0, segs, &nsegs, BUS_DMA_NOWAIT); + if (error != 0) { + device_printf(sc->sc_dev, + "could not map mbuf (error %d)\n", error); + m_freem(m0); + return error; + } + } + + data->m = m0; + data->ni = ni; + + DPRINTFN(WPI_DEBUG_TX, ("sending data: qid=%d idx=%d len=%d nsegs=%d\n", + ring->qid, ring->cur, m0->m_pkthdr.len, nsegs)); + + /* first scatter/gather segment is used by the tx data command */ + desc->flags = htole32(WPI_PAD32(m0->m_pkthdr.len) << 28 | + (1 + nsegs) << 24); + desc->segs[0].addr = htole32(ring->cmd_dma.paddr + + ring->cur * sizeof (struct wpi_tx_cmd)); + desc->segs[0].len = htole32(4 + sizeof (struct wpi_cmd_data)); + for (i = 1; i <= nsegs; i++) { + desc->segs[i].addr = htole32(segs[i - 1].ds_addr); + desc->segs[i].len = htole32(segs[i - 1].ds_len); + } + + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); + + ring->queued++; + + /* kick ring */ + ring->cur = (ring->cur + 1) % WPI_TX_RING_COUNT; + WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur); + + return 0; +} + +/** + * Process data waiting to be sent on the IFNET output queue + */ +static void +wpi_start(struct ifnet *ifp) +{ + struct wpi_softc *sc = ifp->if_softc; + struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211_node *ni; + struct ether_header *eh; + struct mbuf *m0; + int ac; + WPI_LOCK_DECL; + + WPI_LOCK(sc); + + for (;;) { + IF_POLL(&ic->ic_mgtq, m0); + if (m0 != NULL) { + IF_DEQUEUE(&ic->ic_mgtq, m0); + + ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif; + m0->m_pkthdr.rcvif = NULL; + + /* management frames go into ring 0 */ + if (sc->txq[0].queued > sc->txq[0].count - 8) { + ifp->if_oerrors++; + continue; + } + + if (wpi_tx_data(sc, m0, ni, 0) != 0) { + ifp->if_oerrors++; + break; + } + } else { + if (ic->ic_state != IEEE80211_S_RUN) + break; + + IFQ_POLL(&ifp->if_snd, m0); + if (m0 == NULL) + break; + + /* + * Cancel any background scan. + */ + if (ic->ic_flags & IEEE80211_F_SCAN) + ieee80211_cancel_scan(ic); + + if (m0->m_len < sizeof (*eh) && + (m0 = m_pullup(m0, sizeof (*eh))) != NULL) { + ifp->if_oerrors++; + continue; + } + eh = mtod(m0, struct ether_header *); + ni = ieee80211_find_txnode(ic, eh->ether_dhost); + if (ni == NULL) { + m_freem(m0); + ifp->if_oerrors++; + continue; + } + + /* classify mbuf so we can find which tx ring to use */ + if (ieee80211_classify(ic, m0, ni) != 0) { + m_freem(m0); + ieee80211_free_node(ni); + ifp->if_oerrors++; + continue; + } + + /* no QoS encapsulation for EAPOL frames */ + ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ? + M_WME_GETAC(m0) : WME_AC_BE; + + if (sc->txq[ac].queued > sc->txq[ac].count - 8) { + /* there is no place left in this ring */ + IFQ_DRV_PREPEND(&ifp->if_snd, m0); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } + + IFQ_DRV_DEQUEUE(&ifp->if_snd, m0); + BPF_MTAP(ifp, m0); + + m0 = ieee80211_encap(ic, m0, ni); + if (m0 == NULL) { + ieee80211_free_node(ni); + ifp->if_oerrors++; + continue; + } + +#ifndef WPI_CURRENT + if (ic->ic_rawbpf != NULL) +#else + if (bpf_peers_present(ic->ic_rawbpf)) +#endif + bpf_mtap(ic->ic_rawbpf, m0); + + if (wpi_tx_data(sc, m0, ni, ac) != 0) { + ieee80211_free_node(ni); + ifp->if_oerrors++; + break; + } + } + + sc->sc_tx_timer = 5; + sc->watchdog_cnt = 5; + ic->ic_lastdata = ticks; + } + + WPI_UNLOCK(sc); +} + +static void +wpi_watchdog(struct ifnet *ifp) +{ + struct wpi_softc *sc = ifp->if_softc; + WPI_LOCK_DECL; + + WPI_LOCK(sc); + + DPRINTFN(WPI_DEBUG_WATCHDOG, ("watchdog_cnt: %d\n", sc->watchdog_cnt)); + + if (sc->watchdog_cnt == 0 || --sc->watchdog_cnt) + goto done; + + if (--sc->sc_tx_timer != 0) { + device_printf(sc->sc_dev,"device timeout\n"); + ifp->if_oerrors++; + taskqueue_enqueue(sc->sc_tq2, &sc->sc_restarttask); + } +done: + WPI_UNLOCK(sc); +} + +static int +wpi_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct wpi_softc *sc = ifp->if_softc; + struct ieee80211com *ic = &sc->sc_ic; + int error = 0; + WPI_LOCK_DECL; + + WPI_LOCK(sc); + + switch (cmd) { + case SIOCSIFFLAGS: + if ((ifp->if_flags & IFF_UP)) { + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) + wpi_init(sc); + } else if (ifp->if_drv_flags & IFF_DRV_RUNNING) + wpi_stop_locked(sc); + break; + default: + WPI_UNLOCK(sc); + error = ieee80211_ioctl(ic, cmd, data); + WPI_LOCK(sc); + } + + if (error == ENETRESET) { + if ((ifp->if_flags & IFF_UP) && + (ifp->if_drv_flags & IFF_DRV_RUNNING) && + ic->ic_roaming != IEEE80211_ROAMING_MANUAL) + wpi_init(sc); + error = 0; + } + + WPI_UNLOCK(sc); + + return error; +} + +/* + * Extract various information from EEPROM. + */ +static void +wpi_read_eeprom(struct wpi_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + int i; + + /* read the hardware capabilities, revision and SKU type */ + wpi_read_prom_data(sc, WPI_EEPROM_CAPABILITIES, &sc->cap,1); + wpi_read_prom_data(sc, WPI_EEPROM_REVISION, &sc->rev,2); + wpi_read_prom_data(sc, WPI_EEPROM_TYPE, &sc->type, 1); + + /* read the regulatory domain */ + wpi_read_prom_data(sc, WPI_EEPROM_DOMAIN, sc->domain, 4); + + /* read in the hw MAC address */ + wpi_read_prom_data(sc, WPI_EEPROM_MAC, ic->ic_myaddr, 6); + + /* read the list of authorized channels */ + for (i = 0; i < WPI_CHAN_BANDS_COUNT; i++) + wpi_read_eeprom_channels(sc,i); + + /* read the power level calibration info for each group */ + for (i = 0; i < WPI_POWER_GROUPS_COUNT; i++) + wpi_read_eeprom_group(sc,i); +} + +/* + * Send a command to the firmware. + */ +static int +wpi_cmd(struct wpi_softc *sc, int code, const void *buf, int size, int async) +{ + struct wpi_tx_ring *ring = &sc->cmdq; + struct wpi_tx_desc *desc; + struct wpi_tx_cmd *cmd; + +#ifdef WPI_DEBUG + if (!async) { + WPI_LOCK_ASSERT(sc); + } +#endif + + DPRINTFN(WPI_DEBUG_CMD,("wpi_cmd %d size %d async %d\n", code, size, + async)); + + if (sc->flags & WPI_FLAG_BUSY) { + device_printf(sc->sc_dev, "%s: cmd %d not sent, busy\n", + __func__, code); + return EAGAIN; + } + sc->flags|= WPI_FLAG_BUSY; + + KASSERT(size <= sizeof cmd->data, ("command %d too large: %d bytes", + code, size)); + + desc = &ring->desc[ring->cur]; + cmd = &ring->cmd[ring->cur]; + + cmd->code = code; + cmd->flags = 0; + cmd->qid = ring->qid; + cmd->idx = ring->cur; + memcpy(cmd->data, buf, size); + + desc->flags = htole32(WPI_PAD32(size) << 28 | 1 << 24); + desc->segs[0].addr = htole32(ring->cmd_dma.paddr + + ring->cur * sizeof (struct wpi_tx_cmd)); + desc->segs[0].len = htole32(4 + size); + + /* kick cmd ring */ + ring->cur = (ring->cur + 1) % WPI_CMD_RING_COUNT; + WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur); + + if (async) { + sc->flags &= ~ WPI_FLAG_BUSY; + return 0; + } + + return msleep(cmd, &sc->sc_mtx, PCATCH, "wpicmd", hz); +} + +static int +wpi_wme_update(struct ieee80211com *ic) +{ +#define WPI_EXP2(v) htole16((1 << (v)) - 1) +#define WPI_USEC(v) htole16(IEEE80211_TXOP_TO_US(v)) + struct wpi_softc *sc = ic->ic_ifp->if_softc; + const struct wmeParams *wmep; + struct wpi_wme_setup wme; + int ac; + + /* don't override default WME values if WME is not actually enabled */ + if (!(ic->ic_flags & IEEE80211_F_WME)) + return 0; + + wme.flags = 0; + for (ac = 0; ac < WME_NUM_AC; ac++) { + wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac]; + wme.ac[ac].aifsn = wmep->wmep_aifsn; + wme.ac[ac].cwmin = WPI_EXP2(wmep->wmep_logcwmin); + wme.ac[ac].cwmax = WPI_EXP2(wmep->wmep_logcwmax); + wme.ac[ac].txop = WPI_USEC(wmep->wmep_txopLimit); + + DPRINTF(("setting WME for queue %d aifsn=%d cwmin=%d cwmax=%d " + "txop=%d\n", ac, wme.ac[ac].aifsn, wme.ac[ac].cwmin, + wme.ac[ac].cwmax, wme.ac[ac].txop)); + } + + return wpi_cmd(sc, WPI_CMD_SET_WME, &wme, sizeof wme, 1); +#undef WPI_USEC +#undef WPI_EXP2 +} + +/* + * Configure h/w multi-rate retries. + */ +static int +wpi_mrr_setup(struct wpi_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct wpi_mrr_setup mrr; + int i, error; + + memset(&mrr, 0, sizeof (struct wpi_mrr_setup)); + + /* CCK rates (not used with 802.11a) */ + for (i = WPI_CCK1; i <= WPI_CCK11; i++) { + mrr.rates[i].flags = 0; + mrr.rates[i].signal = wpi_ridx_to_plcp[i]; + /* fallback to the immediate lower CCK rate (if any) */ + mrr.rates[i].next = (i == WPI_CCK1) ? WPI_CCK1 : i - 1; + /* try one time at this rate before falling back to "next" */ + mrr.rates[i].ntries = 1; + } + + /* OFDM rates (not used with 802.11b) */ + for (i = WPI_OFDM6; i <= WPI_OFDM54; i++) { + mrr.rates[i].flags = 0; + mrr.rates[i].signal = wpi_ridx_to_plcp[i]; + /* fallback to the immediate lower OFDM rate (if any) */ + /* we allow fallback from OFDM/6 to CCK/2 in 11b/g mode */ + mrr.rates[i].next = (i == WPI_OFDM6) ? + ((ic->ic_curmode == IEEE80211_MODE_11A) ? + WPI_OFDM6 : WPI_CCK2) : + i - 1; + /* try one time at this rate before falling back to "next" */ + mrr.rates[i].ntries = 1; + } + + /* setup MRR for control frames */ + mrr.which = htole32(WPI_MRR_CTL); + error = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof mrr, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "could not setup MRR for control frames\n"); + return error; + } + + /* setup MRR for data frames */ + mrr.which = htole32(WPI_MRR_DATA); + error = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof mrr, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "could not setup MRR for data frames\n"); + return error; + } + + return 0; +} + +static void +wpi_set_led(struct wpi_softc *sc, uint8_t which, uint8_t off, uint8_t on) +{ + struct wpi_cmd_led led; + + led.which = which; + led.unit = htole32(100000); /* on/off in unit of 100ms */ + led.off = off; + led.on = on; + + (void)wpi_cmd(sc, WPI_CMD_SET_LED, &led, sizeof led, 1); +} + +static void +wpi_enable_tsf(struct wpi_softc *sc, struct ieee80211_node *ni) +{ + struct wpi_cmd_tsf tsf; + uint64_t val, mod; + + memset(&tsf, 0, sizeof tsf); + memcpy(&tsf.tstamp, ni->ni_tstamp.data, 8); + tsf.bintval = htole16(ni->ni_intval); + tsf.lintval = htole16(10); + + /* compute remaining time until next beacon */ + val = (uint64_t)ni->ni_intval * 1024; /* msec -> usec */ + mod = le64toh(tsf.tstamp) % val; + tsf.binitval = htole32((uint32_t)(val - mod)); + + if (wpi_cmd(sc, WPI_CMD_TSF, &tsf, sizeof tsf, 1) != 0) + device_printf(sc->sc_dev, "could not enable TSF\n"); +} + +#if 0 +/* + * Build a beacon frame that the firmware will broadcast periodically in + * IBSS or HostAP modes. + */ +static int +wpi_setup_beacon(struct wpi_softc *sc, struct ieee80211_node *ni) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct wpi_tx_ring *ring = &sc->cmdq; + struct wpi_tx_desc *desc; + struct wpi_tx_data *data; + struct wpi_tx_cmd *cmd; + struct wpi_cmd_beacon *bcn; + struct ieee80211_beacon_offsets bo; + struct mbuf *m0; + bus_addr_t physaddr; + int error; + + desc = &ring->desc[ring->cur]; + data = &ring->data[ring->cur]; + + m0 = ieee80211_beacon_alloc(ic, ni, &bo); + if (m0 == NULL) { + device_printf(sc->sc_dev, "could not allocate beacon frame\n"); + return ENOMEM; + } + + cmd = &ring->cmd[ring->cur]; + cmd->code = WPI_CMD_SET_BEACON; + cmd->flags = 0; + cmd->qid = ring->qid; + cmd->idx = ring->cur; + + bcn = (struct wpi_cmd_beacon *)cmd->data; + memset(bcn, 0, sizeof (struct wpi_cmd_beacon)); + bcn->id = WPI_ID_BROADCAST; + bcn->ofdm_mask = 0xff; + bcn->cck_mask = 0x0f; + bcn->lifetime = htole32(WPI_LIFETIME_INFINITE); + bcn->len = htole16(m0->m_pkthdr.len); + bcn->rate = (ic->ic_curmode == IEEE80211_MODE_11A) ? + wpi_plcp_signal(12) : wpi_plcp_signal(2); + bcn->flags = htole32(WPI_TX_AUTO_SEQ | WPI_TX_INSERT_TSTAMP); + + /* save and trim IEEE802.11 header */ + m_copydata(m0, 0, sizeof (struct ieee80211_frame), (caddr_t)&bcn->wh); + m_adj(m0, sizeof (struct ieee80211_frame)); + + /* assume beacon frame is contiguous */ + error = bus_dmamap_load(ring->data_dmat, data->map, mtod(m0, void *), + m0->m_pkthdr.len, wpi_dma_map_addr, &physaddr, 0); + if (error != 0) { + device_printf(sc->sc_dev, "could not map beacon\n"); + m_freem(m0); + return error; + } + + data->m = m0; + + /* first scatter/gather segment is used by the beacon command */ + desc->flags = htole32(WPI_PAD32(m0->m_pkthdr.len) << 28 | 2 << 24); + desc->segs[0].addr = htole32(ring->cmd_dma.paddr + + ring->cur * sizeof (struct wpi_tx_cmd)); + desc->segs[0].len = htole32(4 + sizeof (struct wpi_cmd_beacon)); + desc->segs[1].addr = htole32(physaddr); + desc->segs[1].len = htole32(m0->m_pkthdr.len); + + /* kick cmd ring */ + ring->cur = (ring->cur + 1) % WPI_CMD_RING_COUNT; + WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur); + + return 0; +} +#endif + +static int +wpi_auth(struct wpi_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211_node *ni = ic->ic_bss; + struct wpi_node_info node; + int error; + + /* update adapter's configuration */ + IEEE80211_ADDR_COPY(sc->config.bssid, ni->ni_bssid); + sc->config.chan = ieee80211_chan2ieee(ic, ni->ni_chan); + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) { + sc->config.flags |= htole32(WPI_CONFIG_AUTO | + WPI_CONFIG_24GHZ); + } + switch (ic->ic_curmode) { + case IEEE80211_MODE_11A: + sc->config.cck_mask = 0; + sc->config.ofdm_mask = 0x15; + break; + case IEEE80211_MODE_11B: + sc->config.cck_mask = 0x03; + sc->config.ofdm_mask = 0; + break; + default: /* assume 802.11b/g */ + sc->config.cck_mask = 0x0f; + sc->config.ofdm_mask = 0x15; + } + + DPRINTF(("config chan %d flags %x cck %x ofdm %x\n", sc->config.chan, + sc->config.flags, sc->config.cck_mask, sc->config.ofdm_mask)); + error = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->config, + sizeof (struct wpi_config), 1); + if (error != 0) { + device_printf(sc->sc_dev, "could not configure\n"); + return error; + } + + /* configuration has changed, set Tx power accordingly */ + if ((error = wpi_set_txpower(sc, ni->ni_chan, 1)) != 0) { + device_printf(sc->sc_dev, "could not set Tx power\n"); + return error; + } + + /* add default node */ + memset(&node, 0, sizeof node); + IEEE80211_ADDR_COPY(node.bssid, ni->ni_bssid); + node.id = WPI_ID_BSS; + node.rate = (ic->ic_curmode == IEEE80211_MODE_11A) ? + wpi_plcp_signal(12) : wpi_plcp_signal(2); + node.action = htole32(WPI_ACTION_SET_RATE); + node.antenna = WPI_ANTENNA_BOTH; + error = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, 1); + if (error != 0) { + device_printf(sc->sc_dev, "could not add BSS node\n"); + return error; + } + + sc->flags &= ~WPI_FLAG_AUTH; + + return 0; +} + +/* + * Send a scan request to the firmware. Since this command is huge, we map it + * into a mbufcluster instead of using the pre-allocated set of commands. Note, + * much of this code is similar to that in wpi_cmd but because we must manually + * construct the probe & channels, we duplicate what's needed here. XXX In the + * future, this function should be modified to use wpi_cmd to help cleanup the + * code base. + */ +static int +wpi_scan(struct wpi_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct wpi_tx_ring *ring = &sc->cmdq; + struct wpi_tx_desc *desc; + struct wpi_tx_data *data; + struct wpi_tx_cmd *cmd; + struct wpi_scan_hdr *hdr; + struct wpi_scan_chan *chan; + struct ieee80211_frame *wh; + struct ieee80211_rateset *rs; + struct ieee80211_channel *c; + enum ieee80211_phymode mode; + uint8_t *frm; + int nrates, pktlen, error; + bus_addr_t physaddr; + struct ifnet *ifp = ic->ic_ifp; + + desc = &ring->desc[ring->cur]; + data = &ring->data[ring->cur]; + + data->m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (data->m == NULL) { + device_printf(sc->sc_dev, + "could not allocate mbuf for scan command\n"); + return ENOMEM; + } + + cmd = mtod(data->m, struct wpi_tx_cmd *); + cmd->code = WPI_CMD_SCAN; + cmd->flags = 0; + cmd->qid = ring->qid; + cmd->idx = ring->cur; + + hdr = (struct wpi_scan_hdr *)cmd->data; + memset(hdr, 0, sizeof(struct wpi_scan_hdr)); + + /* + * Move to the next channel if no packets are received within 5 msecs + * after sending the probe request (this helps to reduce the duration + * of active scans). + */ + hdr->quiet = htole16(5); + hdr->threshold = htole16(1); + + if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) { + /* send probe requests at 6Mbps */ + hdr->tx.rate = wpi_ridx_to_plcp[WPI_OFDM6]; + + /* Enable crc checking */ + hdr->promotion = htole16(1); + } else { + hdr->flags = htole32(WPI_CONFIG_24GHZ | WPI_CONFIG_AUTO); + /* send probe requests at 1Mbps */ + hdr->tx.rate = wpi_ridx_to_plcp[WPI_CCK1]; + } + hdr->tx.id = WPI_ID_BROADCAST; + hdr->tx.lifetime = htole32(WPI_LIFETIME_INFINITE); + hdr->tx.flags = htole32(WPI_TX_AUTO_SEQ); + + /*XXX Need to cater for multiple essids */ + memset(&hdr->scan_essids[0], 0, 4 * sizeof(hdr->scan_essids[0])); + hdr->scan_essids[0].id = IEEE80211_ELEMID_SSID; + hdr->scan_essids[0].esslen = ic->ic_des_ssid[0].len; + memcpy(hdr->scan_essids[0].essid, ic->ic_des_ssid[0].ssid, + ic->ic_des_ssid[0].len); + + if (wpi_debug & WPI_DEBUG_SCANNING) { + printf("Scanning Essid: "); + ieee80211_print_essid(ic->ic_des_ssid[0].ssid, + ic->ic_des_ssid[0].len); + printf("\n"); + } + + /* + * Build a probe request frame. Most of the following code is a + * copy & paste of what is done in net80211. + */ + wh = (struct ieee80211_frame *)&hdr->scan_essids[4]; + wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | + IEEE80211_FC0_SUBTYPE_PROBE_REQ; + wh->i_fc[1] = IEEE80211_FC1_DIR_NODS; + IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr); + IEEE80211_ADDR_COPY(wh->i_addr2, ic->ic_myaddr); + IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr); + *(u_int16_t *)&wh->i_dur[0] = 0; /* filled by h/w */ + *(u_int16_t *)&wh->i_seq[0] = 0; /* filled by h/w */ + + frm = (uint8_t *)(wh + 1); + + /* add essid IE, the hardware will fill this in for us */ + *frm++ = IEEE80211_ELEMID_SSID; + *frm++ = 0; + + mode = ieee80211_chan2mode(ic->ic_curchan); + rs = &ic->ic_sup_rates[mode]; + + /* add supported rates IE */ + *frm++ = IEEE80211_ELEMID_RATES; + nrates = rs->rs_nrates; + if (nrates > IEEE80211_RATE_SIZE) + nrates = IEEE80211_RATE_SIZE; + *frm++ = nrates; + memcpy(frm, rs->rs_rates, nrates); + frm += nrates; + + /* add supported xrates IE */ + if (rs->rs_nrates > IEEE80211_RATE_SIZE) { + nrates = rs->rs_nrates - IEEE80211_RATE_SIZE; + *frm++ = IEEE80211_ELEMID_XRATES; + *frm++ = nrates; + memcpy(frm, rs->rs_rates + IEEE80211_RATE_SIZE, nrates); + frm += nrates; + } + + /* setup length of probe request */ + hdr->tx.len = htole16(frm - (uint8_t *)wh); + + /* + * Construct information about the channel that we + * want to scan. The firmware expects this to be directly + * after the scan probe request + */ + c = ic->ic_curchan; + chan = (struct wpi_scan_chan *)frm; + chan->chan = ieee80211_chan2ieee(ic, c); + chan->flags = 0; + if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE)) { + chan->flags |= WPI_CHAN_ACTIVE; + if (ic->ic_des_ssid[0].len != 0) + chan->flags |= WPI_CHAN_DIRECT; + } + chan->gain_dsp = 0x6e; /* Default level */ + if (IEEE80211_IS_CHAN_5GHZ(c)) { + chan->active = htole16(10); + chan->passive = htole16(sc->maxdwell); + chan->gain_radio = 0x3b; + } else { + chan->active = htole16(20); + chan->passive = htole16(sc->maxdwell); + chan->gain_radio = 0x28; + } + + DPRINTFN(WPI_DEBUG_SCANNING, + ("Scanning %u Passive: %d\n", + chan->chan, + c->ic_flags & IEEE80211_CHAN_PASSIVE)); + + hdr->nchan++; + chan++; + + frm += sizeof (struct wpi_scan_chan); +#if 0 + // XXX All Channels.... + for (c = &ic->ic_channels[1]; + c <= &ic->ic_channels[IEEE80211_CHAN_MAX]; c++) { + if ((c->ic_flags & ic->ic_curchan->ic_flags) != ic->ic_curchan->ic_flags) + continue; + + chan->chan = ieee80211_chan2ieee(ic, c); + chan->flags = 0; + if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE)) { + chan->flags |= WPI_CHAN_ACTIVE; + if (ic->ic_des_ssid[0].len != 0) + chan->flags |= WPI_CHAN_DIRECT; + } + chan->gain_dsp = 0x6e; /* Default level */ + if (IEEE80211_IS_CHAN_5GHZ(c)) { + chan->active = htole16(10); + chan->passive = htole16(110); + chan->gain_radio = 0x3b; + } else { + chan->active = htole16(20); + chan->passive = htole16(120); + chan->gain_radio = 0x28; + } + + DPRINTFN(WPI_DEBUG_SCANNING, + ("Scanning %u Passive: %d\n", + chan->chan, + c->ic_flags & IEEE80211_CHAN_PASSIVE)); + + hdr->nchan++; + chan++; + + frm += sizeof (struct wpi_scan_chan); + } +#endif + + hdr->len = htole16(frm - (uint8_t *)hdr); + pktlen = frm - (uint8_t *)cmd; + + error = bus_dmamap_load(ring->data_dmat, data->map, cmd, pktlen, + wpi_dma_map_addr, &physaddr, BUS_DMA_NOWAIT); + if (error != 0) { + device_printf(sc->sc_dev, "could not map scan command\n"); + m_freem(data->m); + data->m = NULL; + return error; + } + + desc->flags = htole32(WPI_PAD32(pktlen) << 28 | 1 << 24); + desc->segs[0].addr = htole32(physaddr); + desc->segs[0].len = htole32(pktlen); + + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); + + /* kick cmd ring */ + ring->cur = (ring->cur + 1) % WPI_CMD_RING_COUNT; + WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur); + + return 0; /* will be notified async. of failure/success */ +} + +/** + * Configure the card to listen to a particular channel, this transisions the + * card in to being able to receive frames from remote devices. + */ +static int +wpi_config(struct wpi_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = ic->ic_ifp; + struct wpi_power power; + struct wpi_bluetooth bluetooth; + struct wpi_node_info node; + int error; + + /* set power mode */ + memset(&power, 0, sizeof power); + power.flags = htole32(WPI_POWER_CAM|0x8); + error = wpi_cmd(sc, WPI_CMD_SET_POWER_MODE, &power, sizeof power, 0); + if (error != 0) { + device_printf(sc->sc_dev, "could not set power mode\n"); + return error; + } + + /* configure bluetooth coexistence */ + memset(&bluetooth, 0, sizeof bluetooth); + bluetooth.flags = 3; + bluetooth.lead = 0xaa; + bluetooth.kill = 1; + error = wpi_cmd(sc, WPI_CMD_BLUETOOTH, &bluetooth, sizeof bluetooth, + 0); + if (error != 0) { + device_printf(sc->sc_dev, + "could not configure bluetooth coexistence\n"); + return error; + } + + /* configure adapter */ + memset(&sc->config, 0, sizeof (struct wpi_config)); + IEEE80211_ADDR_COPY(sc->config.myaddr, ic->ic_myaddr); + /*set default channel*/ + sc->config.chan = htole16(ieee80211_chan2ieee(ic, ic->ic_curchan)); + sc->config.flags = htole32(WPI_CONFIG_TSF); + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + sc->config.flags |= htole32(WPI_CONFIG_AUTO | + WPI_CONFIG_24GHZ); + } + sc->config.filter = 0; + switch (ic->ic_opmode) { + case IEEE80211_M_STA: + case IEEE80211_M_WDS: /* No know setup, use STA for now */ + sc->config.mode = WPI_MODE_STA; + sc->config.filter |= htole32(WPI_FILTER_MULTICAST); + break; + case IEEE80211_M_IBSS: + case IEEE80211_M_AHDEMO: + sc->config.mode = WPI_MODE_IBSS; + sc->config.filter |= htole32(WPI_FILTER_BEACON | + WPI_FILTER_MULTICAST); + break; + case IEEE80211_M_HOSTAP: + sc->config.mode = WPI_MODE_HOSTAP; + break; + case IEEE80211_M_MONITOR: + sc->config.mode = WPI_MODE_MONITOR; + sc->config.filter |= htole32(WPI_FILTER_MULTICAST | + WPI_FILTER_CTL | WPI_FILTER_PROMISC); + break; + } + sc->config.cck_mask = 0x0f; /* not yet negotiated */ + sc->config.ofdm_mask = 0xff; /* not yet negotiated */ + error = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->config, + sizeof (struct wpi_config), 0); + if (error != 0) { + device_printf(sc->sc_dev, "configure command failed\n"); + return error; + } + + /* configuration has changed, set Tx power accordingly */ + if ((error = wpi_set_txpower(sc, ic->ic_curchan,0)) != 0) { + device_printf(sc->sc_dev, "could not set Tx power\n"); + return error; + } + + /* add broadcast node */ + memset(&node, 0, sizeof node); + IEEE80211_ADDR_COPY(node.bssid, ifp->if_broadcastaddr); + node.id = WPI_ID_BROADCAST; + node.rate = wpi_plcp_signal(2); + error = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, 0); + if (error != 0) { + device_printf(sc->sc_dev, "could not add broadcast node\n"); + return error; + } + + /* Setup rate scalling */ + error = wpi_mrr_setup(sc); + if (error != 0) { + device_printf(sc->sc_dev, "could not setup MRR\n"); + return error; + } + + return 0; +} + +static void +wpi_stop_master(struct wpi_softc *sc) +{ + uint32_t tmp; + int ntries; + + DPRINTFN(WPI_DEBUG_HW,("Disabling Firmware execution\n")); + + tmp = WPI_READ(sc, WPI_RESET); + WPI_WRITE(sc, WPI_RESET, tmp | WPI_STOP_MASTER | WPI_NEVO_RESET); + + tmp = WPI_READ(sc, WPI_GPIO_CTL); + if ((tmp & WPI_GPIO_PWR_STATUS) == WPI_GPIO_PWR_SLEEP) + return; /* already asleep */ + + for (ntries = 0; ntries < 100; ntries++) { + if (WPI_READ(sc, WPI_RESET) & WPI_MASTER_DISABLED) + break; + DELAY(10); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "timeout waiting for master\n"); + } +} + +static int +wpi_power_up(struct wpi_softc *sc) +{ + uint32_t tmp; + int ntries; + + wpi_mem_lock(sc); + tmp = wpi_mem_read(sc, WPI_MEM_POWER); + wpi_mem_write(sc, WPI_MEM_POWER, tmp & ~0x03000000); + wpi_mem_unlock(sc); + + for (ntries = 0; ntries < 5000; ntries++) { + if (WPI_READ(sc, WPI_GPIO_STATUS) & WPI_POWERED) + break; + DELAY(10); + } + if (ntries == 5000) { + device_printf(sc->sc_dev, + "timeout waiting for NIC to power up\n"); + return ETIMEDOUT; + } + return 0; +} + +static int +wpi_reset(struct wpi_softc *sc) +{ + uint32_t tmp; + int ntries; + + DPRINTFN(WPI_DEBUG_HW, + ("Resetting the card - clearing any uploaded firmware\n")); + + /* clear any pending interrupts */ + WPI_WRITE(sc, WPI_INTR, 0xffffffff); + + tmp = WPI_READ(sc, WPI_PLL_CTL); + WPI_WRITE(sc, WPI_PLL_CTL, tmp | WPI_PLL_INIT); + + tmp = WPI_READ(sc, WPI_CHICKEN); + WPI_WRITE(sc, WPI_CHICKEN, tmp | WPI_CHICKEN_RXNOLOS); + + tmp = WPI_READ(sc, WPI_GPIO_CTL); + WPI_WRITE(sc, WPI_GPIO_CTL, tmp | WPI_GPIO_INIT); + + /* wait for clock stabilization */ + for (ntries = 0; ntries < 25000; ntries++) { + if (WPI_READ(sc, WPI_GPIO_CTL) & WPI_GPIO_CLOCK) + break; + DELAY(10); + } + if (ntries == 25000) { + device_printf(sc->sc_dev, + "timeout waiting for clock stabilization\n"); + return ETIMEDOUT; + } + + /* initialize EEPROM */ + tmp = WPI_READ(sc, WPI_EEPROM_STATUS); + + if ((tmp & WPI_EEPROM_VERSION) == 0) { + device_printf(sc->sc_dev, "EEPROM not found\n"); + return EIO; + } + WPI_WRITE(sc, WPI_EEPROM_STATUS, tmp & ~WPI_EEPROM_LOCKED); + + return 0; +} + +static void +wpi_hw_config(struct wpi_softc *sc) +{ + uint32_t rev, hw; + + /* voodoo from the Linux "driver".. */ + hw = WPI_READ(sc, WPI_HWCONFIG); + + rev = pci_read_config(sc->sc_dev, PCIR_REVID, 1); + if ((rev & 0xc0) == 0x40) + hw |= WPI_HW_ALM_MB; + else if (!(rev & 0x80)) + hw |= WPI_HW_ALM_MM; + + if (sc->cap == 0x80) + hw |= WPI_HW_SKU_MRC; + + hw &= ~WPI_HW_REV_D; + if ((le16toh(sc->rev) & 0xf0) == 0xd0) + hw |= WPI_HW_REV_D; + + if (sc->type > 1) + hw |= WPI_HW_TYPE_B; + + WPI_WRITE(sc, WPI_HWCONFIG, hw); +} + +static void +wpi_init(void *arg) +{ + struct wpi_softc *sc = arg; + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = ic->ic_ifp; + uint32_t tmp; + int ntries, error, qid; + WPI_LOCK_DECL; + + WPI_LOCK(sc); + + wpi_stop_locked(sc); + (void)wpi_reset(sc); + + wpi_mem_lock(sc); + wpi_mem_write(sc, WPI_MEM_CLOCK1, 0xa00); + DELAY(20); + tmp = wpi_mem_read(sc, WPI_MEM_PCIDEV); + wpi_mem_write(sc, WPI_MEM_PCIDEV, tmp | 0x800); + wpi_mem_unlock(sc); + + (void)wpi_power_up(sc); + wpi_hw_config(sc); + + /* init Rx ring */ + wpi_mem_lock(sc); + WPI_WRITE(sc, WPI_RX_BASE, sc->rxq.desc_dma.paddr); + WPI_WRITE(sc, WPI_RX_RIDX_PTR, sc->shared_dma.paddr + + offsetof(struct wpi_shared, next)); + WPI_WRITE(sc, WPI_RX_WIDX, (WPI_RX_RING_COUNT - 1) & ~7); + WPI_WRITE(sc, WPI_RX_CONFIG, 0xa9601010); + wpi_mem_unlock(sc); + + /* init Tx rings */ + wpi_mem_lock(sc); + wpi_mem_write(sc, WPI_MEM_MODE, 2); /* bypass mode */ + wpi_mem_write(sc, WPI_MEM_RA, 1); /* enable RA0 */ + wpi_mem_write(sc, WPI_MEM_TXCFG, 0x3f); /* enable all 6 Tx rings */ + wpi_mem_write(sc, WPI_MEM_BYPASS1, 0x10000); + wpi_mem_write(sc, WPI_MEM_BYPASS2, 0x30002); + wpi_mem_write(sc, WPI_MEM_MAGIC4, 4); + wpi_mem_write(sc, WPI_MEM_MAGIC5, 5); + + WPI_WRITE(sc, WPI_TX_BASE_PTR, sc->shared_dma.paddr); + WPI_WRITE(sc, WPI_MSG_CONFIG, 0xffff05a5); + + for (qid = 0; qid < 6; qid++) { + WPI_WRITE(sc, WPI_TX_CTL(qid), 0); + WPI_WRITE(sc, WPI_TX_BASE(qid), 0); + WPI_WRITE(sc, WPI_TX_CONFIG(qid), 0x80200008); + } + wpi_mem_unlock(sc); + + /* clear "radio off" and "disable command" bits (reversed logic) */ + WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF); + WPI_WRITE(sc, WPI_UCODE_CLR, WPI_DISABLE_CMD); + sc->flags &= ~WPI_FLAG_HW_RADIO_OFF; + + /* clear any pending interrupts */ + WPI_WRITE(sc, WPI_INTR, 0xffffffff); + + /* enable interrupts */ + WPI_WRITE(sc, WPI_MASK, WPI_INTR_MASK); + + WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF); + WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF); + + if ((error = wpi_load_firmware(sc)) != 0) { + device_printf(sc->sc_dev, + "A problem occurred loading the firmware to the driver\n"); + return; + } + + /* At this point the firmware is up and running. If the hardware + * RF switch is turned off thermal calibration will fail, though + * the card is still happy to continue to accept commands, catch + * this case and record the hw is disabled. + */ + wpi_mem_lock(sc); + tmp = wpi_mem_read(sc, WPI_MEM_HW_RADIO_OFF); + wpi_mem_unlock(sc); + + if (!(tmp & 0x1)) { + sc->flags |= WPI_FLAG_HW_RADIO_OFF; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + ifp->if_drv_flags |= IFF_DRV_RUNNING; + device_printf(sc->sc_dev,"Radio Transmitter is switched off\n"); + return; + } + + /* wait for thermal sensors to calibrate */ + for (ntries = 0; ntries < 1000; ntries++) { + if ((sc->temp = (int)WPI_READ(sc, WPI_TEMPERATURE)) != 0) + break; + DELAY(10); + } + + if (ntries == 1000) { + device_printf(sc->sc_dev, + "timeout waiting for thermal sensors calibration\n"); + error = ETIMEDOUT; + return; + } + DPRINTFN(WPI_DEBUG_TEMP,("temperature %d\n", sc->temp)); + + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + ifp->if_drv_flags |= IFF_DRV_RUNNING; + callout_reset(&sc->watchdog_to, hz, wpi_tick, sc); + WPI_UNLOCK(sc); + + if (ic->ic_opmode == IEEE80211_M_MONITOR) + ieee80211_new_state(ic, IEEE80211_S_RUN, -1); + else if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL) + ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); +} + +static void +wpi_stop(struct wpi_softc *sc) +{ + WPI_LOCK_DECL; + + WPI_LOCK(sc); + wpi_stop_locked(sc); + WPI_UNLOCK(sc); + +} +static void +wpi_stop_locked(struct wpi_softc *sc) + +{ + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = ic->ic_ifp; + uint32_t tmp; + int ac; + + sc->watchdog_cnt = sc->sc_tx_timer = 0; + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + + /* disable interrupts */ + WPI_WRITE(sc, WPI_MASK, 0); + WPI_WRITE(sc, WPI_INTR, WPI_INTR_MASK); + WPI_WRITE(sc, WPI_INTR_STATUS, 0xff); + WPI_WRITE(sc, WPI_INTR_STATUS, 0x00070000); + + /* Clear any commands left in the command buffer */ + memset(sc->sc_cmd, 0, sizeof(sc->sc_cmd)); + + wpi_mem_lock(sc); + wpi_mem_write(sc, WPI_MEM_MODE, 0); + wpi_mem_unlock(sc); + + /* reset all Tx rings */ + for (ac = 0; ac < 4; ac++) + wpi_reset_tx_ring(sc, &sc->txq[ac]); + wpi_reset_tx_ring(sc, &sc->cmdq); + + /* reset Rx ring */ + wpi_reset_rx_ring(sc, &sc->rxq); + + wpi_mem_lock(sc); + wpi_mem_write(sc, WPI_MEM_CLOCK2, 0x200); + wpi_mem_unlock(sc); + + DELAY(5); + + wpi_stop_master(sc); + + tmp = WPI_READ(sc, WPI_RESET); + WPI_WRITE(sc, WPI_RESET, tmp | WPI_SW_RESET); + sc->flags &= ~WPI_FLAG_BUSY; + + ieee80211_new_state(ic, IEEE80211_S_INIT, -1); +} + +static void +wpi_iter_func(void *arg, struct ieee80211_node *ni) +{ + struct wpi_softc *sc = arg; + struct wpi_node *wn = (struct wpi_node *)ni; + + ieee80211_amrr_choose(&sc->amrr, ni, &wn->amn); +} + +static void +wpi_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct wpi_softc *sc = ni->ni_ic->ic_ifp->if_softc; + int i; + + ieee80211_amrr_node_init(&sc->amrr, &((struct wpi_node *)ni)->amn); + + for (i = ni->ni_rates.rs_nrates - 1; + i > 0 && (ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL) > 72; + i--); + ni->ni_txrate = i; +} + +static void +wpi_calib_timeout(void *arg) +{ + struct wpi_softc *sc = arg; + struct ieee80211com *ic = &sc->sc_ic; + int temp; + WPI_LOCK_DECL; + + /* automatic rate control triggered every 500ms */ + if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) { + WPI_LOCK(sc); + if (ic->ic_opmode == IEEE80211_M_STA) + wpi_iter_func(sc, ic->ic_bss); + else + ieee80211_iterate_nodes(&ic->ic_sta, wpi_iter_func, sc); + WPI_UNLOCK(sc); + } + + /* update sensor data */ + temp = (int)WPI_READ(sc, WPI_TEMPERATURE); + DPRINTFN(WPI_DEBUG_TEMP,("Temp in calibration is: %d\n", temp)); +#if 0 + //XXX Used by OpenBSD Sensor Framework + sc->sensor.value = temp + 260; +#endif + + /* automatic power calibration every 60s */ + if (++sc->calib_cnt >= 120) { + wpi_power_calibration(sc, temp); + sc->calib_cnt = 0; + } + + callout_reset(&sc->calib_to, hz/2, wpi_calib_timeout, sc); +} + +/* + * This function is called periodically (every 60 seconds) to adjust output + * power to temperature changes. + */ +static void +wpi_power_calibration(struct wpi_softc *sc, int temp) +{ + /* sanity-check read value */ + if (temp < -260 || temp > 25) { + /* this can't be correct, ignore */ + DPRINTFN(WPI_DEBUG_TEMP, + ("out-of-range temperature reported: %d\n", temp)); + return; + } + + DPRINTFN(WPI_DEBUG_TEMP,("temperature %d->%d\n", sc->temp, temp)); + + /* adjust Tx power if need be */ + if (abs(temp - sc->temp) <= 6) + return; + + sc->temp = temp; + + if (wpi_set_txpower(sc, sc->sc_ic.ic_bss->ni_chan,1) != 0) { + /* just warn, too bad for the automatic calibration... */ + device_printf(sc->sc_dev,"could not adjust Tx power\n"); + } +} + +/** + * Read the eeprom to find out what channels are valid for the given + * band and update net80211 with what we find. + */ +static void +wpi_read_eeprom_channels(struct wpi_softc *sc, int n) +{ + struct ieee80211com *ic = &sc->sc_ic; + const struct wpi_chan_band *band = &wpi_bands[n]; + struct wpi_eeprom_chan channels[WPI_MAX_CHAN_PER_BAND]; + int chan, i, offset, passive; + + wpi_read_prom_data(sc, band->addr, channels, + band->nchan * sizeof (struct wpi_eeprom_chan)); + + for (i = 0; i < band->nchan; i++) { + if (!(channels[i].flags & WPI_EEPROM_CHAN_VALID)) { + DPRINTFN(WPI_DEBUG_HW, + ("Channel Not Valid: %d, band %d\n", + band->chan[i],n)); + continue; + } + + passive = 0; + chan = band->chan[i]; + offset = ic->ic_nchans; + + /* is active scan allowed on this channel? */ + if (!(channels[i].flags & WPI_EEPROM_CHAN_ACTIVE)) { + passive = IEEE80211_CHAN_PASSIVE; + } + + if (n == 0) { /* 2GHz band */ + ic->ic_channels[offset].ic_ieee = chan; + ic->ic_channels[offset].ic_freq = + ieee80211_ieee2mhz(chan, IEEE80211_CHAN_2GHZ); + ic->ic_channels[offset].ic_flags = IEEE80211_CHAN_B | passive; + offset++; + ic->ic_channels[offset].ic_ieee = chan; + ic->ic_channels[offset].ic_freq = + ieee80211_ieee2mhz(chan, IEEE80211_CHAN_2GHZ); + ic->ic_channels[offset].ic_flags = IEEE80211_CHAN_G | passive; + offset++; + + } else { /* 5GHz band */ + /* + * Some 3945ABG adapters support channels 7, 8, 11 + * and 12 in the 2GHz *and* 5GHz bands. + * Because of limitations in our net80211(9) stack, + * we can't support these channels in 5GHz band. + * XXX not true; just need to map to proper frequency + */ + if (chan <= 14) + continue; + + ic->ic_channels[offset].ic_ieee = chan; + ic->ic_channels[offset].ic_freq = + ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ); + ic->ic_channels[offset].ic_flags = IEEE80211_CHAN_A | passive; + offset++; + } + + /* save maximum allowed power for this channel */ + sc->maxpwr[chan] = channels[i].maxpwr; + + ic->ic_nchans = offset; + +#if 0 + // XXX We can probably use this an get rid of maxpwr - ben 20070617 + ic->ic_channels[chan].ic_maxpower = channels[i].maxpwr; + //ic->ic_channels[chan].ic_minpower... + //ic->ic_channels[chan].ic_maxregtxpower... +#endif + + DPRINTF(("adding chan %d flags=0x%x maxpwr=%d, offset %d\n", + chan, channels[i].flags, sc->maxpwr[chan], offset)); + } +} + +static void +wpi_read_eeprom_group(struct wpi_softc *sc, int n) +{ + struct wpi_power_group *group = &sc->groups[n]; + struct wpi_eeprom_group rgroup; + int i; + + wpi_read_prom_data(sc, WPI_EEPROM_POWER_GRP + n * 32, &rgroup, + sizeof rgroup); + + /* save power group information */ + group->chan = rgroup.chan; + group->maxpwr = rgroup.maxpwr; + /* temperature at which the samples were taken */ + group->temp = (int16_t)le16toh(rgroup.temp); + + DPRINTF(("power group %d: chan=%d maxpwr=%d temp=%d\n", n, + group->chan, group->maxpwr, group->temp)); + + for (i = 0; i < WPI_SAMPLES_COUNT; i++) { + group->samples[i].index = rgroup.samples[i].index; + group->samples[i].power = rgroup.samples[i].power; + + DPRINTF(("\tsample %d: index=%d power=%d\n", i, + group->samples[i].index, group->samples[i].power)); + } +} + +/* + * Update Tx power to match what is defined for channel `c'. + */ +static int +wpi_set_txpower(struct wpi_softc *sc, struct ieee80211_channel *c, int async) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct wpi_power_group *group; + struct wpi_cmd_txpower txpower; + u_int chan; + int i; + + /* get channel number */ + chan = ieee80211_chan2ieee(ic, c); + + /* find the power group to which this channel belongs */ + if (IEEE80211_IS_CHAN_5GHZ(c)) { + for (group = &sc->groups[1]; group < &sc->groups[4]; group++) + if (chan <= group->chan) + break; + } else + group = &sc->groups[0]; + + memset(&txpower, 0, sizeof txpower); + txpower.band = IEEE80211_IS_CHAN_5GHZ(c) ? 0 : 1; + txpower.channel = htole16(chan); + + /* set Tx power for all OFDM and CCK rates */ + for (i = 0; i <= 11 ; i++) { + /* retrieve Tx power for this channel/rate combination */ + int idx = wpi_get_power_index(sc, group, c, + wpi_ridx_to_rate[i]); + + txpower.rates[i].rate = wpi_ridx_to_plcp[i]; + + if (IEEE80211_IS_CHAN_5GHZ(c)) { + txpower.rates[i].gain_radio = wpi_rf_gain_5ghz[idx]; + txpower.rates[i].gain_dsp = wpi_dsp_gain_5ghz[idx]; + } else { + txpower.rates[i].gain_radio = wpi_rf_gain_2ghz[idx]; + txpower.rates[i].gain_dsp = wpi_dsp_gain_2ghz[idx]; + } + DPRINTFN(WPI_DEBUG_TEMP,("chan %d/rate %d: power index %d\n", + chan, wpi_ridx_to_rate[i], idx)); + } + + return wpi_cmd(sc, WPI_CMD_TXPOWER, &txpower, sizeof txpower, async); +} + +/* + * Determine Tx power index for a given channel/rate combination. + * This takes into account the regulatory information from EEPROM and the + * current temperature. + */ +static int +wpi_get_power_index(struct wpi_softc *sc, struct wpi_power_group *group, + struct ieee80211_channel *c, int rate) +{ +/* fixed-point arithmetic division using a n-bit fractional part */ +#define fdivround(a, b, n) \ + ((((1 << n) * (a)) / (b) + (1 << n) / 2) / (1 << n)) + +/* linear interpolation */ +#define interpolate(x, x1, y1, x2, y2, n) \ + ((y1) + fdivround(((x) - (x1)) * ((y2) - (y1)), (x2) - (x1), n)) + + struct ieee80211com *ic = &sc->sc_ic; + struct wpi_power_sample *sample; + int pwr, idx; + u_int chan; + + /* get channel number */ + chan = ieee80211_chan2ieee(ic, c); + + /* default power is group's maximum power - 3dB */ + pwr = group->maxpwr / 2; + + /* decrease power for highest OFDM rates to reduce distortion */ + switch (rate) { + case 72: /* 36Mb/s */ + pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 0 : 5; + break; + case 96: /* 48Mb/s */ + pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 7 : 10; + break; + case 108: /* 54Mb/s */ + pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 9 : 12; + break; + } + + /* never exceed channel's maximum allowed Tx power */ + pwr = min(pwr, sc->maxpwr[chan]); + + /* retrieve power index into gain tables from samples */ + for (sample = group->samples; sample < &group->samples[3]; sample++) + if (pwr > sample[1].power) + break; + /* fixed-point linear interpolation using a 19-bit fractional part */ + idx = interpolate(pwr, sample[0].power, sample[0].index, + sample[1].power, sample[1].index, 19); + + /* + * Adjust power index based on current temperature + * - if colder than factory-calibrated: decreate output power + * - if warmer than factory-calibrated: increase output power + */ + idx -= (sc->temp - group->temp) * 11 / 100; + + /* decrease power for CCK rates (-5dB) */ + if (!WPI_RATE_IS_OFDM(rate)) + idx += 10; + + /* keep power index in a valid range */ + if (idx < 0) + return 0; + if (idx > WPI_MAX_PWR_INDEX) + return WPI_MAX_PWR_INDEX; + return idx; + +#undef interpolate +#undef fdivround +} + +#if 0 +static void +wpi_radio_on(void *arg, int pending) +{ + struct wpi_softc *sc = arg; + + device_printf(sc->sc_dev, "radio turned on\n"); +} + +static void +wpi_radio_off(void *arg, int pending) +{ + struct wpi_softc *sc = arg; + + device_printf(sc->sc_dev, "radio turned off\n"); +} +#endif + +/** + * Called by net80211 framework to indicate that a scan + * is starting. This function doesn't actually do the scan, + * wpi_scan_curchan starts things off. This function is more + * of an early warning from the framework we should get ready + * for the scan. + */ +static void +wpi_scan_start(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct wpi_softc *sc = ifp->if_softc; + + wpi_queue_cmd(sc, WPI_SCAN_START); +} + +/** + * Called by the net80211 framework, indicates that the + * scan has ended. If there is a scan in progress on the card + * then it should be aborted. + */ +static void +wpi_scan_end(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct wpi_softc *sc = ifp->if_softc; + + wpi_queue_cmd(sc, WPI_SCAN_STOP); +} + +/** + * Called by the net80211 framework to indicate to the driver + * that the channel should be changed + */ +static void +wpi_set_channel(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct wpi_softc *sc = ifp->if_softc; + + wpi_queue_cmd(sc, WPI_SET_CHAN); +} + +/** + * Called by net80211 to indicate that we need to scan the current + * channel. The channel is previously be set via the wpi_set_channel + * callback. + */ +static void +wpi_scan_curchan(struct ieee80211com *ic, unsigned long maxdwell) +{ + struct ifnet *ifp = ic->ic_ifp; + struct wpi_softc *sc = ifp->if_softc; + + sc->maxdwell = maxdwell; + + wpi_queue_cmd(sc, WPI_SCAN_CURCHAN); +} + +/** + * Called by the net80211 framework to indicate + * the minimum dwell time has been met, terminate the scan. + * We don't actually terminate the scan as the firmware will notify + * us when it's finished and we have no way to interrupt it. + */ +static void +wpi_scan_mindwell(struct ieee80211com *ic) +{ + /* NB: don't try to abort scan; wait for firmware to finish */ +} + +/** + * The ops function is called to perform some actual work. + * because we can't sleep from any of the ic callbacks, we queue an + * op task with wpi_queue_cmd and have the taskqueue process that task. + * The task that gets cued is a op task, which ends up calling this function. + */ +static void +wpi_ops(void *arg, int pending) +{ + struct wpi_softc *sc = arg; + struct ieee80211com *ic = &sc->sc_ic; + WPI_LOCK_DECL; + int cmd; + +again: + WPI_CMD_LOCK(sc); + cmd = sc->sc_cmd[sc->sc_cmd_cur]; + + if (cmd == 0) { + /* No more commands to process */ + WPI_CMD_UNLOCK(sc); + return; + } + sc->sc_cmd[sc->sc_cmd_cur] = 0; /* free the slot */ + sc->sc_cmd_cur = (sc->sc_cmd_cur + 1) % WPI_CMD_MAXOPS; + WPI_CMD_UNLOCK(sc); + WPI_LOCK(sc); + + if (!(sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING)) { + WPI_UNLOCK(sc); + return; + } + + { + const char *name[]={"SCAN_START", "SCAN_CURCHAN",0,"STOP",0,0,0,"CHAN", + 0,0,0,0,0,0,"AUTH",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"NEXT"}; + DPRINTFN(WPI_DEBUG_OPS,("wpi_ops: command: %d %s\n", cmd, name[cmd-1])); + } + + switch (cmd) { + case WPI_SCAN_START: + if (sc->flags & WPI_FLAG_HW_RADIO_OFF) { + DPRINTF(("HERER\n")); + ieee80211_cancel_scan(ic); + } else + sc->flags |= WPI_FLAG_SCANNING; + break; + + case WPI_SCAN_STOP: + sc->flags &= ~WPI_FLAG_SCANNING; + break; + + case WPI_SCAN_NEXT: + DPRINTF(("NEXT\n")); + WPI_UNLOCK(sc); + ieee80211_scan_next(ic); + WPI_LOCK(sc); + break; + + case WPI_SCAN_CURCHAN: + if (wpi_scan(sc)) + ieee80211_cancel_scan(ic); + break; + + case WPI_SET_CHAN: + if (sc->flags&WPI_FLAG_AUTH) { + DPRINTF(("Authenticating, not changing channel\n")); + break; + } + if (wpi_config(sc)) { + DPRINTF(("Scan cancelled\n")); + WPI_UNLOCK(sc); + ieee80211_cancel_scan(ic); + WPI_LOCK(sc); + sc->flags &= ~WPI_FLAG_SCANNING; + wpi_restart(sc,0); + WPI_UNLOCK(sc); + return; + } + break; + + case WPI_AUTH: + if (wpi_auth(sc) != 0) { + device_printf(sc->sc_dev, + "could not send authentication request\n"); + wpi_stop_locked(sc); + WPI_UNLOCK(sc); + return; + } + WPI_UNLOCK(sc); + ieee80211_node_authorize(ic->ic_bss); + ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1); + WPI_LOCK(sc); + break; + } + WPI_UNLOCK(sc); + + /* Take another pass */ + goto again; +} + +/** + * queue a command for later execution in a different thread. + * This is needed as the net80211 callbacks do not allow + * sleeping, since we need to sleep to confirm commands have + * been processed by the firmware, we must defer execution to + * a sleep enabled thread. + */ +static int +wpi_queue_cmd(struct wpi_softc *sc, int cmd) +{ + WPI_CMD_LOCK(sc); + + if (sc->sc_cmd[sc->sc_cmd_next] != 0) { + WPI_CMD_UNLOCK(sc); + DPRINTF(("%s: command %d dropped\n", __func__, cmd)); + return (EBUSY); + } + + sc->sc_cmd[sc->sc_cmd_next] = cmd; + sc->sc_cmd_next = (sc->sc_cmd_next + 1) % WPI_CMD_MAXOPS; + + taskqueue_enqueue(sc->sc_tq, &sc->sc_opstask); + + WPI_CMD_UNLOCK(sc); + + return 0; +} + +static void +wpi_restart(void * arg, int pending) +{ +#if 0 + struct wpi_softc *sc = arg; + struct ieee80211com *ic = &sc->sc_ic; + WPI_LOCK_DECL; + + DPRINTF(("Device failed, restarting device\n")); + WPI_LOCK(sc); + wpi_stop(sc); + wpi_init(sc); + WPI_UNLOCK(sc); + ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); +#endif +} + +/* + * Allocate DMA-safe memory for firmware transfer. + */ +static int +wpi_alloc_fwmem(struct wpi_softc *sc) +{ + /* allocate enough contiguous space to store text and data */ + return wpi_dma_contig_alloc(sc, &sc->fw_dma, NULL, + WPI_FW_MAIN_TEXT_MAXSZ + WPI_FW_MAIN_DATA_MAXSZ, 1, + BUS_DMA_NOWAIT); +} + +static void +wpi_free_fwmem(struct wpi_softc *sc) +{ + wpi_dma_contig_free(&sc->fw_dma); +} + +/** + * Called every second, wpi_tick used by the watch dog timer + * to check that the card is still alive + */ +static void +wpi_tick(void *arg) +{ + struct wpi_softc *sc = arg; + + DPRINTFN(WPI_DEBUG_WATCHDOG,("Watchdog: tick\n")); + + wpi_watchdog(sc->sc_ifp); + callout_reset(&sc->watchdog_to, hz, wpi_tick, sc); +} + +#ifdef WPI_DEBUG +static const char *wpi_cmd_str(int cmd) +{ + switch(cmd) { + case WPI_DISABLE_CMD: return "WPI_DISABLE_CMD"; + case WPI_CMD_CONFIGURE: return "WPI_CMD_CONFIGURE"; + case WPI_CMD_ASSOCIATE: return "WPI_CMD_ASSOCIATE"; + case WPI_CMD_SET_WME: return "WPI_CMD_SET_WME"; + case WPI_CMD_TSF: return "WPI_CMD_TSF"; + case WPI_CMD_ADD_NODE: return "WPI_CMD_ADD_NODE"; + case WPI_CMD_TX_DATA: return "WPI_CMD_TX_DATA"; + case WPI_CMD_MRR_SETUP: return "WPI_CMD_MRR_SETUP"; + case WPI_CMD_SET_LED: return "WPI_CMD_SET_LED"; + case WPI_CMD_SET_POWER_MODE: return "WPI_CMD_SET_POWER_MODE"; + case WPI_CMD_SCAN: return "WPI_CMD_SCAN"; + case WPI_CMD_SET_BEACON:return "WPI_CMD_SET_BEACON"; + case WPI_CMD_TXPOWER: return "WPI_CMD_TXPOWER"; + case WPI_CMD_BLUETOOTH: return "WPI_CMD_BLUETOOTH"; + + default: + KASSERT(1, ("Unknown Command: %d\n", cmd)); + return "UNKNOWN CMD"; // Make the compiler happy + } +} +#endif + +MODULE_DEPEND(wpi, pci, 1, 1, 1); +MODULE_DEPEND(wpi, wlan, 1, 1, 1); +MODULE_DEPEND(wpi, firmware, 1, 1, 1); +MODULE_DEPEND(wpi, wlan_amrr, 1, 1, 1); diff --git a/sys/dev/wpi/if_wpireg.h b/sys/dev/wpi/if_wpireg.h new file mode 100644 index 0000000..a821bf0 --- /dev/null +++ b/sys/dev/wpi/if_wpireg.h @@ -0,0 +1,727 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (c) 2006,2007 + * Damien Bergamini <damien.bergamini@free.fr> + * + * Permission to use, copy, modify, and 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. + */ + +#define WPI_TX_RING_COUNT 256 +#define WPI_CMD_RING_COUNT 256 +#define WPI_RX_RING_COUNT 64 + +/* + * Rings must be aligned on a 16K boundary. + */ +#define WPI_RING_DMA_ALIGN 0x4000 + +/* maximum scatter/gather */ +#define WPI_MAX_SCATTER 4 + +/* maximum Rx buffer size */ +#define WPI_RBUF_SIZE ( 3 * 1024 ) /* XXX 3000 but must be aligned */ + +/* + * Control and status registers. + */ +#define WPI_HWCONFIG 0x000 +#define WPI_INTR 0x008 +#define WPI_MASK 0x00c +#define WPI_INTR_STATUS 0x010 +#define WPI_GPIO_STATUS 0x018 +#define WPI_RESET 0x020 +#define WPI_GPIO_CTL 0x024 +#define WPI_EEPROM_CTL 0x02c +#define WPI_EEPROM_STATUS 0x030 +#define WPI_UCODE_CLR 0x05c +#define WPI_TEMPERATURE 0x060 +#define WPI_CHICKEN 0x100 +#define WPI_PLL_CTL 0x20c +#define WPI_WRITE_MEM_ADDR 0x444 +#define WPI_READ_MEM_ADDR 0x448 +#define WPI_WRITE_MEM_DATA 0x44c +#define WPI_READ_MEM_DATA 0x450 +#define WPI_TX_WIDX 0x460 +#define WPI_TX_CTL(qid) (0x940 + (qid) * 8) +#define WPI_TX_BASE(qid) (0x944 + (qid) * 8) +#define WPI_TX_DESC(qid) (0x980 + (qid) * 80) +#define WPI_RX_CONFIG 0xc00 +#define WPI_RX_BASE 0xc04 +#define WPI_RX_WIDX 0xc20 +#define WPI_RX_RIDX_PTR 0xc24 +#define WPI_RX_CTL 0xcc0 +#define WPI_RX_STATUS 0xcc4 +#define WPI_TX_CONFIG(qid) (0xd00 + (qid) * 32) +#define WPI_TX_CREDIT(qid) (0xd04 + (qid) * 32) +#define WPI_TX_STATE(qid) (0xd08 + (qid) * 32) +#define WPI_TX_BASE_PTR 0xe80 +#define WPI_MSG_CONFIG 0xe88 +#define WPI_TX_STATUS 0xe90 + + +/* + * NIC internal memory offsets. + */ +#define WPI_MEM_MODE 0x2e00 +#define WPI_MEM_RA 0x2e04 +#define WPI_MEM_TXCFG 0x2e10 +#define WPI_MEM_MAGIC4 0x2e14 +#define WPI_MEM_MAGIC5 0x2e20 +#define WPI_MEM_BYPASS1 0x2e2c +#define WPI_MEM_BYPASS2 0x2e30 +#define WPI_MEM_CLOCK1 0x3004 +#define WPI_MEM_CLOCK2 0x3008 +#define WPI_MEM_POWER 0x300c +#define WPI_MEM_PCIDEV 0x3010 +#define WPI_MEM_HW_RADIO_OFF 0x3014 +#define WPI_MEM_UCODE_CTL 0x3400 +#define WPI_MEM_UCODE_SRC 0x3404 +#define WPI_MEM_UCODE_DST 0x3408 +#define WPI_MEM_UCODE_SIZE 0x340c +#define WPI_MEM_UCODE_BASE 0x3800 + +#define WPI_MEM_TEXT_BASE 0x3490 +#define WPI_MEM_TEXT_SIZE 0x3494 +#define WPI_MEM_DATA_BASE 0x3498 +#define WPI_MEM_DATA_SIZE 0x349c + + +/* possible flags for register WPI_HWCONFIG */ +#define WPI_HW_ALM_MB (1 << 8) +#define WPI_HW_ALM_MM (1 << 9) +#define WPI_HW_SKU_MRC (1 << 10) +#define WPI_HW_REV_D (1 << 11) +#define WPI_HW_TYPE_B (1 << 12) + +/* possible flags for registers WPI_READ_MEM_ADDR/WPI_WRITE_MEM_ADDR */ +#define WPI_MEM_4 ((sizeof (uint32_t) - 1) << 24) + +/* possible values for WPI_MEM_UCODE_DST */ +#define WPI_FW_TEXT 0x00000000 + +/* possible flags for WPI_GPIO_STATUS */ +#define WPI_POWERED (1 << 9) + +/* possible flags for register WPI_RESET */ +#define WPI_NEVO_RESET (1 << 0) +#define WPI_SW_RESET (1 << 7) +#define WPI_MASTER_DISABLED (1 << 8) +#define WPI_STOP_MASTER (1 << 9) + +/* possible flags for register WPI_GPIO_CTL */ +#define WPI_GPIO_CLOCK (1 << 0) +#define WPI_GPIO_INIT (1 << 2) +#define WPI_GPIO_MAC (1 << 3) +#define WPI_GPIO_SLEEP (1 << 4) +#define WPI_GPIO_PWR_STATUS 0x07000000 +#define WPI_GPIO_PWR_SLEEP (4 << 24) + +/* possible flags for register WPI_CHICKEN */ +#define WPI_CHICKEN_RXNOLOS (1 << 23) + +/* possible flags for register WPI_PLL_CTL */ +#define WPI_PLL_INIT (1 << 24) + +/* possible flags for register WPI_UCODE_CLR */ +#define WPI_RADIO_OFF (1 << 1) +#define WPI_DISABLE_CMD (1 << 2) + +/* possible flags for WPI_RX_STATUS */ +#define WPI_RX_IDLE (1 << 24) + +/* possible flags for register WPI_UC_CTL */ +#define WPI_UC_ENABLE (1 << 30) +#define WPI_UC_RUN (1 << 31) + +/* possible flags for register WPI_INTR_CSR */ +#define WPI_ALIVE_INTR (1 << 0) +#define WPI_WAKEUP_INTR (1 << 1) +#define WPI_SW_ERROR (1 << 25) +#define WPI_TX_INTR (1 << 27) +#define WPI_HW_ERROR (1 << 29) +#define WPI_RX_INTR (1 << 31) + +#define WPI_INTR_MASK \ + (WPI_SW_ERROR | WPI_HW_ERROR | WPI_TX_INTR | WPI_RX_INTR | \ + WPI_ALIVE_INTR | WPI_WAKEUP_INTR) + +/* possible flags for register WPI_TX_STATUS */ +#define WPI_TX_IDLE(qid) (1 << ((qid) + 24) | 1 << ((qid) + 16)) + +/* possible flags for register WPI_EEPROM_CTL */ +#define WPI_EEPROM_READY (1 << 0) + +/* possible flags for register WPI_EEPROM_STATUS */ +#define WPI_EEPROM_VERSION 0x00000007 +#define WPI_EEPROM_LOCKED 0x00000180 + + +struct wpi_shared { + uint32_t txbase[8]; + uint32_t next; + uint32_t reserved[2]; +} __packed; + +#define WPI_MAX_SEG_LEN 65520 +struct wpi_tx_desc { + uint32_t flags; +#define WPI_PAD32(x) (roundup2(x, 4) - (x)) + + struct { + uint32_t addr; + uint32_t len; + } __attribute__((__packed__)) segs[WPI_MAX_SCATTER]; + uint8_t reserved[28]; +} __packed; + +struct wpi_tx_stat { + uint8_t nrts; + uint8_t ntries; + uint8_t nkill; + uint8_t rate; + uint32_t duration; + uint32_t status; +} __packed; + +struct wpi_rx_desc { + uint32_t len; + uint8_t type; +#define WPI_UC_READY 1 +#define WPI_RX_DONE 27 +#define WPI_TX_DONE 28 +#define WPI_START_SCAN 130 +#define WPI_STOP_SCAN 132 +#define WPI_STATE_CHANGED 161 + + uint8_t flags; + uint8_t idx; + uint8_t qid; +} __packed; + +struct wpi_rx_stat { + uint8_t len; +#define WPI_STAT_MAXLEN 20 + + uint8_t id; + uint8_t rssi; /* received signal strength */ +#define WPI_RSSI_OFFSET 95 + + uint8_t agc; /* access gain control */ + uint16_t signal; + uint16_t noise; +} __packed; + +struct wpi_rx_head { + uint16_t chan; + uint16_t flags; + uint8_t reserved; + uint8_t rate; + uint16_t len; +} __packed; + +struct wpi_rx_tail { + uint32_t flags; +#if 0 +#define WPI_RX_NO_CRC_ERR (1 << 0) +#define WPI_RX_NO_OVFL_ERR (1 << 1) +/* shortcut for the above */ +#define WPI_RX_NOERROR (WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR) +#endif + uint64_t tstamp; + uint32_t tbeacon; +} __packed; + +struct wpi_tx_cmd { + uint8_t code; +#define WPI_CMD_CONFIGURE 16 +#define WPI_CMD_ASSOCIATE 17 +#define WPI_CMD_SET_WME 19 +#define WPI_CMD_TSF 20 +#define WPI_CMD_ADD_NODE 24 +#define WPI_CMD_TX_DATA 28 +#define WPI_CMD_MRR_SETUP 71 +#define WPI_CMD_SET_LED 72 +#define WPI_CMD_SET_POWER_MODE 119 +#define WPI_CMD_SCAN 128 +#define WPI_CMD_SET_BEACON 145 +#define WPI_CMD_TXPOWER 151 +#define WPI_CMD_BLUETOOTH 155 + + uint8_t flags; + uint8_t idx; + uint8_t qid; + uint8_t data[360]; +} __packed; + +/* structure for WPI_CMD_CONFIGURE */ +struct wpi_config { + uint8_t myaddr[IEEE80211_ADDR_LEN]; + uint16_t reserved1; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint16_t reserved2; + uint8_t wlap_bssid_addr[6]; + uint16_t reserved3; + uint8_t mode; +#define WPI_MODE_HOSTAP 1 +#define WPI_MODE_STA 3 +#define WPI_MODE_IBSS 4 +#define WPI_MODE_MONITOR 6 + + uint8_t air_propogation; + uint16_t reserved4; + uint8_t ofdm_mask; + uint8_t cck_mask; + uint16_t associd; + uint32_t flags; +#define WPI_CONFIG_24GHZ (1 << 0) +#define WPI_CONFIG_CCK (1 << 1) +#define WPI_CONFIG_AUTO (1 << 2) +#define WPI_CONFIG_SHSLOT (1 << 4) +#define WPI_CONFIG_SHPREAMBLE (1 << 5) +#define WPI_CONFIG_NODIVERSITY (1 << 7) +#define WPI_CONFIG_ANTENNA_A (1 << 8) +#define WPI_CONFIG_ANTENNA_B (1 << 9) +#define WPI_CONFIG_TSF (1 << 15) + + uint32_t filter; +#define WPI_FILTER_PROMISC (1 << 0) +#define WPI_FILTER_CTL (1 << 1) +#define WPI_FILTER_MULTICAST (1 << 2) +#define WPI_FILTER_NODECRYPT (1 << 3) +#define WPI_FILTER_BSS (1 << 5) +#define WPI_FILTER_BEACON (1 << 6) + + uint8_t chan; + uint16_t reserved6; +} __packed; + +/* structure for command WPI_CMD_ASSOCIATE */ +struct wpi_assoc { + uint32_t flags; + uint32_t filter; + uint8_t ofdm_mask; + uint8_t cck_mask; + uint16_t reserved; +} __packed; + +/* structure for command WPI_CMD_SET_WME */ +struct wpi_wme_setup { + uint32_t flags; + struct { + uint16_t cwmin; + uint16_t cwmax; + uint8_t aifsn; + uint8_t reserved; + uint16_t txop; + } __packed ac[WME_NUM_AC]; +} __packed; + +/* structure for command WPI_CMD_TSF */ +struct wpi_cmd_tsf { + uint64_t tstamp; + uint16_t bintval; + uint16_t atim; + uint32_t binitval; + uint16_t lintval; + uint16_t reserved; +} __packed; + +/* structure for WPI_CMD_ADD_NODE */ +struct wpi_node_info { + uint8_t control; +#define WPI_NODE_UPDATE (1 << 0) + + uint8_t reserved1[3]; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint16_t reserved2; + uint8_t id; +#define WPI_ID_BSS 0 +#define WPI_ID_BROADCAST 24 + + uint8_t flags; + uint16_t reserved3; + uint16_t key_flags; + uint8_t tkip; + uint8_t reserved4; + uint16_t ttak[5]; + uint16_t reserved5; + uint8_t key[IEEE80211_KEYBUF_SIZE]; + uint32_t action; +#define WPI_ACTION_SET_RATE 4 + uint32_t mask; + uint16_t tid; + uint8_t rate; + uint8_t antenna; +#define WPI_ANTENNA_A (1<<6) +#define WPI_ANTENNA_B (1<<7) +#define WPI_ANTENNA_BOTH (WPI_ANTENNA_A|WPI_ANTENNA_B) + uint8_t add_imm; + uint8_t del_imm; + uint16_t add_imm_start; +} __packed; + +/* structure for command WPI_CMD_TX_DATA */ +struct wpi_cmd_data { + uint16_t len; + uint16_t lnext; + uint32_t flags; +#define WPI_TX_NEED_RTS (1 << 1) +#define WPI_TX_NEED_CTS (1 << 2) +#define WPI_TX_NEED_ACK (1 << 3) +#define WPI_TX_FULL_TXOP (1 << 7) +#define WPI_TX_BT_DISABLE (1 << 12) /* bluetooth coexistence */ +#define WPI_TX_AUTO_SEQ (1 << 13) +#define WPI_TX_INSERT_TSTAMP (1 << 16) + + uint8_t rate; + uint8_t id; + uint8_t tid; + uint8_t security; + uint8_t key[IEEE80211_KEYBUF_SIZE]; + uint8_t tkip[IEEE80211_WEP_MICLEN]; + uint32_t fnext; + uint32_t lifetime; +#define WPI_LIFETIME_INFINITE 0xffffffff + uint8_t ofdm_mask; + uint8_t cck_mask; + uint8_t rts_ntries; + uint8_t data_ntries; + uint16_t timeout; + uint16_t txop; + struct ieee80211_frame wh; +} __packed; + +/* structure for command WPI_CMD_SET_BEACON */ +struct wpi_cmd_beacon { + uint16_t len; + uint16_t reserved1; + uint32_t flags; /* same as wpi_cmd_data */ + uint8_t rate; + uint8_t id; + uint8_t reserved2[30]; + uint32_t lifetime; + uint8_t ofdm_mask; + uint8_t cck_mask; + uint16_t reserved3[3]; + uint16_t tim; + uint8_t timsz; + uint8_t reserved4; + struct ieee80211_frame wh; +} __packed; + +/* structure for WPI_CMD_MRR_SETUP */ +struct wpi_mrr_setup { + uint8_t which; +#define WPI_MRR_CTL 0 +#define WPI_MRR_DATA 1 + + uint8_t reserved[3]; + + struct { + uint8_t signal; + uint8_t flags; + uint8_t ntries; + uint8_t next; +#define WPI_OFDM6 0 +#define WPI_OFDM54 7 +#define WPI_CCK1 8 +#define WPI_CCK2 9 +#define WPI_CCK11 11 + + } __attribute__((__packed__)) rates[WPI_CCK11 + 1]; +} __packed; + +/* structure for WPI_CMD_SET_LED */ +struct wpi_cmd_led { + uint32_t unit; /* multiplier (in usecs) */ + uint8_t which; +#define WPI_LED_ACTIVITY 1 +#define WPI_LED_LINK 2 + + uint8_t off; + uint8_t on; + uint8_t reserved; +} __packed; + +/* structure for WPI_CMD_SET_POWER_MODE */ +struct wpi_power { + uint32_t flags; +#define WPI_POWER_CAM 0 /* constantly awake mode */ + uint32_t rx_timeout; + uint32_t tx_timeout; + uint32_t sleep[5]; +} __packed; + +/* structure for command WPI_CMD_SCAN */ +struct wpi_scan_hdr { + uint16_t len; + uint8_t reserved1; + uint8_t nchan; + uint16_t quiet; + uint16_t threshold; + uint16_t promotion; + uint16_t reserved2; + uint32_t maxtimeout; + uint32_t suspend; + uint32_t flags; + uint32_t filter; + +struct { + uint16_t len; + uint16_t lnext; + uint32_t flags; + uint8_t rate; + uint8_t id; + uint8_t tid; + uint8_t security; + uint8_t key[IEEE80211_KEYBUF_SIZE]; + uint8_t tkip[IEEE80211_WEP_MICLEN]; + uint32_t fnext; + uint32_t lifetime; + uint8_t ofdm_mask; + uint8_t cck_mask; + uint8_t rts_ntries; + uint8_t data_ntries; + uint16_t timeout; + uint16_t txop; +} tx __attribute__((__packed__)); + +#define WPI_SCAN_MAX_ESSIDS 4 + struct { + uint8_t id; + uint8_t esslen; + uint8_t essid[32]; + }scan_essids[WPI_SCAN_MAX_ESSIDS]; + /* followed by probe request body */ + /* followed by nchan x wpi_scan_chan */ +} __packed; + +struct wpi_scan_chan { + uint8_t flags; + uint8_t chan; +#define WPI_CHAN_ACTIVE (1 << 0) +#define WPI_CHAN_DIRECT (1 << 1) + uint8_t gain_radio; + uint8_t gain_dsp; + uint16_t active; /* msecs */ + uint16_t passive; /* msecs */ +} __packed; + +/* structure for WPI_CMD_BLUETOOTH */ +struct wpi_bluetooth { + uint8_t flags; + uint8_t lead; + uint8_t kill; + uint8_t reserved; + uint32_t ack; + uint32_t cts; +} __packed; + +/* structure for command WPI_CMD_TXPOWER */ +struct wpi_cmd_txpower { + + uint8_t band; +#define WPI_RATE_5GHZ 0 +#define WPI_RATE_2GHZ 1 + uint8_t reserved; + uint16_t channel; + +#define WPI_RATE_MAPPING_COUNT 12 + struct { + uint8_t rate; + uint8_t gain_radio; + uint8_t gain_dsp; + uint8_t reserved; + } __packed rates [WPI_RATE_MAPPING_COUNT]; + +} __packed; + + + +#define WPI_FW_MAIN_TEXT_MAXSZ (80 * 1024 ) +#define WPI_FW_MAIN_DATA_MAXSZ (32 * 1024 ) +#define WPI_FW_INIT_TEXT_MAXSZ (80 * 1024 ) +#define WPI_FW_INIT_DATA_MAXSZ (32 * 1024 ) +#define WPI_FW_BOOT_TEXT_MAXSZ 1024 + +#define WPI_FW_UPDATED (1 << 31 ) + +/* firmware image header */ +struct wpi_firmware_hdr { + +#define WPI_FW_MINVERSION 2144 + + uint32_t version; + uint32_t rtextsz; + uint32_t rdatasz; + uint32_t itextsz; + uint32_t idatasz; + uint32_t btextsz; +} __packed; + +/* structure for WPI_UC_READY notification */ +struct wpi_ucode_info { + uint32_t version; + uint8_t revision[8]; + uint8_t type; + uint8_t subtype; + uint16_t reserved; + uint32_t logptr; + uint32_t errorptr; + uint32_t timestamp; + uint32_t valid; +} __packed; + +/* structure for WPI_START_SCAN notification */ +struct wpi_start_scan { + uint64_t tstamp; + uint32_t tbeacon; + uint8_t chan; + uint8_t band; + uint16_t reserved; + uint32_t status; +} __packed; + +/* structure for WPI_STOP_SCAN notification */ +struct wpi_stop_scan { + uint8_t nchan; + uint8_t status; + uint8_t reserved; + uint8_t chan; + uint64_t tsf; +} __packed; + +#define WPI_EEPROM_MAC 0x015 +#define WPI_EEPROM_REVISION 0x035 +#define WPI_EEPROM_CAPABILITIES 0x045 +#define WPI_EEPROM_TYPE 0x04a +#define WPI_EEPROM_DOMAIN 0x060 +#define WPI_EEPROM_BAND1 0x063 +#define WPI_EEPROM_BAND2 0x072 +#define WPI_EEPROM_BAND3 0x080 +#define WPI_EEPROM_BAND4 0x08d +#define WPI_EEPROM_BAND5 0x099 +#define WPI_EEPROM_POWER_GRP 0x100 + +struct wpi_eeprom_chan { + uint8_t flags; +#define WPI_EEPROM_CHAN_VALID (1<<0) +#define WPI_EEPROM_CHAN_IBSS (1<<1) +#define WPI_EEPROM_CHAN_ACTIVE (1<<3) +#define WPI_EEPROM_CHAN_RADAR (1<<4) + + int8_t maxpwr; +} __packed; + +struct wpi_eeprom_sample { + uint8_t index; + int8_t power; + uint16_t volt; +}; + +#define WPI_POWER_GROUPS_COUNT 5 + +struct wpi_eeprom_group { + struct wpi_eeprom_sample samples[5]; + int32_t coef[5]; + int32_t corr[5]; + int8_t maxpwr; + uint8_t chan; + int16_t temp; +} __packed; + +#define WPI_CHAN_BANDS_COUNT 5 +#define WPI_MAX_CHAN_PER_BAND 14 + +static const struct wpi_chan_band { + uint32_t addr; /* offset in EEPROM */ + uint8_t nchan; + uint8_t chan[WPI_MAX_CHAN_PER_BAND]; +} wpi_bands[5] = { + { WPI_EEPROM_BAND1, 14, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }}, + { WPI_EEPROM_BAND2, 13, + { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 }}, + { WPI_EEPROM_BAND3, 12, + { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 }}, + { WPI_EEPROM_BAND4, 11, + { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 }}, + { WPI_EEPROM_BAND5, 6, + { 145, 149, 153, 157, 161, 165 }} +}; + +#define WPI_MAX_PWR_INDEX 77 + +/* + * RF Tx gain values from highest to lowest power (values obtained from + * the reference driver.) + */ +static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { + 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3, + 0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63, + 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03, + 0x03 +}; + +static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { + 0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b, + 0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b, + 0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33, + 0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b, + 0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63, + 0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, + 0x03 +}; + +/* + * DSP pre-DAC gain values from highest to lowest power (values obtained + * from the reference driver.) + */ +static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { + 0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c, + 0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b, + 0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d, + 0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74, + 0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71, + 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, + 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, + 0x5f +}; + +static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { + 0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b, + 0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62, + 0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f, + 0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78, + 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, + 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78, + 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, + 0x78 +}; + + +#define WPI_READ(sc, reg) \ + bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) + +#define WPI_WRITE(sc, reg, val) \ + bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) + +#define WPI_WRITE_REGION_4(sc, offset, datap, count) \ + bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \ + (datap), (count)) diff --git a/sys/dev/wpi/if_wpivar.h b/sys/dev/wpi/if_wpivar.h new file mode 100644 index 0000000..a8fe4cc --- /dev/null +++ b/sys/dev/wpi/if_wpivar.h @@ -0,0 +1,269 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (c) 2006,2007 + * Damien Bergamini <damien.bergamini@free.fr> + * + * Permission to use, copy, modify, and 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. + */ +#if ( __FreeBSD_version > 700000 ) +#include <net80211/ieee80211_amrr.h> +#else +#include <dev/wpi/ieee80211_amrr.h> +#endif + +/* DMA mapping */ +struct wpi_mapping { + int nsegs; + bus_dma_segment_t segs[WPI_MAX_SCATTER]; +}; + +struct wpi_rx_radiotap_header { + struct ieee80211_radiotap_header wr_ihdr; + uint64_t wr_tsft; + uint8_t wr_flags; + uint8_t wr_rate; + uint16_t wr_chan_freq; + uint16_t wr_chan_flags; + int8_t wr_dbm_antsignal; + int8_t wr_dbm_antnoise; + uint8_t wr_antenna; +}; + +#define WPI_RX_RADIOTAP_PRESENT \ + ((1 << IEEE80211_RADIOTAP_TSFT) | \ + (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_CHANNEL) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ + (1 << IEEE80211_RADIOTAP_ANTENNA)) + +struct wpi_tx_radiotap_header { + struct ieee80211_radiotap_header wt_ihdr; + uint8_t wt_flags; + uint8_t wt_rate; + uint16_t wt_chan_freq; + uint16_t wt_chan_flags; + uint8_t wt_hwqueue; +}; + +#define WPI_TX_RADIOTAP_PRESENT \ + ((1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_CHANNEL)) + +struct wpi_dma_info { + bus_dma_tag_t tag; + bus_dmamap_t map; + bus_addr_t paddr; + caddr_t vaddr; + bus_size_t size; +}; + +struct wpi_tx_data { + bus_dmamap_t map; + struct mbuf *m; + struct ieee80211_node *ni; +}; + +struct wpi_tx_ring { + struct wpi_dma_info desc_dma; + struct wpi_dma_info cmd_dma; + struct wpi_tx_desc *desc; + struct wpi_tx_cmd *cmd; + struct wpi_tx_data *data; + bus_dma_tag_t data_dmat; + int qid; + int count; + int queued; + int cur; +}; + +#define WPI_RBUF_COUNT ( WPI_RX_RING_COUNT + 16 ) + +struct wpi_softc; + +struct wpi_rbuf { + struct wpi_softc *sc; + bus_addr_t paddr; + caddr_t vaddr; + SLIST_ENTRY(wpi_rbuf) next; +}; + +struct wpi_rx_data { + struct mbuf *m; +}; + +struct wpi_rx_ring { + struct wpi_dma_info desc_dma; + struct wpi_dma_info buf_dma; + uint32_t *desc; + struct wpi_rx_data data[WPI_RX_RING_COUNT]; + struct wpi_rbuf rbuf[WPI_RBUF_COUNT]; + SLIST_HEAD(, wpi_rbuf) freelist; + int cur; +}; + +struct wpi_amrr { + struct ieee80211_node ni; /* must be the first */ + int txcnt; + int retrycnt; + int success; + int success_threshold; + int recovery; +}; + +struct wpi_node { + struct ieee80211_node ni; /* must be the first */ + struct ieee80211_amrr_node amn; +}; + +struct wpi_power_sample { + uint8_t index; + int8_t power; +}; + +struct wpi_power_group { +#define WPI_SAMPLES_COUNT 5 + struct wpi_power_sample samples[WPI_SAMPLES_COUNT]; + uint8_t chan; + int8_t maxpwr; + int16_t temp; +}; + +struct wpi_softc { + device_t sc_dev; + struct ifnet *sc_ifp; + + /* net80211 driver specifics */ + struct ieee80211com sc_ic; + int (*sc_newstate)(struct ieee80211com *, + enum ieee80211_state, int); + unsigned long maxdwell; /* Max dwell time whilst scanning */ + + struct mtx sc_mtx; + + struct ieee80211_amrr amrr; + + /* Flags indicating the current state the driver + * expects the hardware to be in + */ + uint32_t flags; +#define WPI_FLAG_HW_RADIO_OFF (1 << 0) +#define WPI_FLAG_SCANNING (1 << 1) +#define WPI_FLAG_BUSY (1 << 2) +#define WPI_FLAG_AUTH (1 << 3) + + /* Flags indicating the state of the firmware */ + uint32_t fw_state; +#define WPI_FW_IDLE (1 << 0 ) + + /* shared area */ + struct wpi_dma_info shared_dma; + struct wpi_shared *shared; + + struct wpi_tx_ring txq[WME_NUM_AC]; + struct wpi_tx_ring cmdq; + struct wpi_rx_ring rxq; + + /* TX Thermal Callibration */ + struct callout calib_to; + int calib_cnt; + + /* Watch dog timer */ + struct callout watchdog_to; + int watchdog_cnt; + + struct resource *irq; + struct resource *mem; + bus_space_tag_t sc_st; + bus_space_handle_t sc_sh; + void *sc_ih; + int mem_rid; + int irq_rid; + + struct wpi_config config; + int temp; + + + int sc_tx_timer; + + struct bpf_if *sc_drvbpf; + + struct wpi_rx_radiotap_header sc_rxtap; + int sc_rxtap_len; + struct wpi_tx_radiotap_header sc_txtap; + int sc_txtap_len; + + /* firmware image */ + const struct firmware *fw_fp; + + /* firmware DMA transfer */ + struct wpi_dma_info fw_dma; + + /* command queue related variables */ + #define WPI_CMD_MAXOPS 10 + #define WPI_SCAN_START (1<<0) + #define WPI_SCAN_CURCHAN (1<<1) + #define WPI_SCAN_STOP (1<<2) + #define WPI_SET_CHAN (1<<3) + #define WPI_AUTH (1<<4) + #define WPI_SCAN_NEXT (1<<5) + int sc_cmd[WPI_CMD_MAXOPS]; + int sc_cmd_cur; /* current queued scan task */ + int sc_cmd_next; /* last queued scan task */ + struct mtx sc_cmdlock; + + /* Task queues used to control the driver */ + struct taskqueue *sc_tq; /* Main command task queue */ + struct taskqueue *sc_tq2;/* firmware reset task queue */ + + /* Tasks used by the driver */ + struct task sc_radioontask; /* enable rf transmitter task*/ + struct task sc_radioofftask;/* disable rf transmitter task*/ + struct task sc_opstask; /* operation handling task */ + struct task sc_restarttask; /* reset firmware task */ + + /* Eeprom info */ + uint8_t cap; + uint16_t rev; + uint8_t type; + struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT]; + int8_t maxpwr[IEEE80211_CHAN_MAX]; + char domain[4]; //reglatory domain //XXX +}; +#define WPI_LOCK_INIT(_sc) \ + mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ + MTX_NETWORK_LOCK, MTX_DEF) +#define WPI_LOCK_DECL int __waslocked = 0 +#define WPI_LOCK(_sc) do {\ + if (!(__waslocked = mtx_owned(&(_sc)->sc_mtx))) \ + mtx_lock(&(_sc)->sc_mtx); \ +} while(0) +#define WPI_UNLOCK(_sc) do { \ + if (!__waslocked) \ + mtx_unlock(&(_sc)->sc_mtx); \ +} while (0) + +#define WPI_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx) +#define WPI_CMD_LOCK_INIT(_sc) \ + mtx_init(&(_sc)->sc_cmdlock, device_get_nameunit((_sc)->sc_dev), NULL, MTX_DEF); +#define WPI_CMD_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_cmdlock) +#define WPI_CMD_LOCK(_sc) mtx_lock(&(_sc)->sc_cmdlock) +#define WPI_CMD_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_cmdlock) +#if defined(INVARIANTS) || defined(INVARIANT_SUPPORT) +#define WPI_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) +#else +#define WPI_LOCK_ASSERT(sc) +#endif diff --git a/sys/modules/wpi/Makefile b/sys/modules/wpi/Makefile new file mode 100644 index 0000000..b7ddd09 --- /dev/null +++ b/sys/modules/wpi/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../dev/wpi + +KMOD = if_wpi +SRCS = if_wpi.c opt_bdg.h device_if.h bus_if.h pci_if.h +CFLAGS += -I${.CURDIR}/../../ +.include <bsd.kmod.mk> diff --git a/sys/modules/wpifw/Makefile b/sys/modules/wpifw/Makefile new file mode 100644 index 0000000..77fc98d --- /dev/null +++ b/sys/modules/wpifw/Makefile @@ -0,0 +1,14 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../contrib/dev/wpi + +KMOD= wpifw +FIRMWS= iwlwifi-3945-2.14.4.fw:wpifw:2144 +FIRMWARE_LICENSE= intel_wpi + +CLEANFILES= iwlwifi-3945-2.14.4.fw + +iwlwifi-3945-2.14.4.fw: ${.CURDIR}/../../contrib/dev/wpi/iwlwifi-3945-2.14.4.fw.uu + uudecode -p ${.CURDIR}/../../contrib/dev/wpi/iwlwifi-3945-2.14.4.fw.uu > ${.TARGET} + +.include <bsd.kmod.mk> |