1 1.1 alc /* 2 1.1 alc * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting 3 1.1 alc * Copyright (c) 2005-2006 Atheros Communications, Inc. 4 1.1 alc * All rights reserved. 5 1.1 alc * 6 1.1 alc * Permission to use, copy, modify, and/or distribute this software for any 7 1.1 alc * purpose with or without fee is hereby granted, provided that the above 8 1.1 alc * copyright notice and this permission notice appear in all copies. 9 1.1 alc * 10 1.1 alc * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 1.1 alc * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 1.1 alc * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 1.1 alc * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 1.1 alc * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 1.1 alc * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 1.1 alc * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 1.1 alc * 18 1.2 alc * $Id: ah_regdomain.c,v 1.2 2008/12/11 05:30:29 alc Exp $ 19 1.1 alc */ 20 1.1 alc #include "opt_ah.h" 21 1.1 alc 22 1.1 alc #include "ah.h" 23 1.1 alc #include "ah_internal.h" 24 1.1 alc #include "ah_eeprom.h" 25 1.1 alc #include "ah_devid.h" 26 1.1 alc 27 1.1 alc /* 28 1.1 alc * XXX this code needs a audit+review 29 1.1 alc */ 30 1.1 alc 31 1.1 alc /* used throughout this file... */ 32 1.1 alc #define N(a) (sizeof (a) / sizeof (a[0])) 33 1.1 alc 34 1.1 alc #define HAL_MODE_11A_TURBO HAL_MODE_108A 35 1.1 alc #define HAL_MODE_11G_TURBO HAL_MODE_108G 36 1.1 alc 37 1.1 alc /* 10MHz is half the 11A bandwidth used to determine upper edge freq 38 1.1 alc of the outdoor channel */ 39 1.1 alc #define HALF_MAXCHANBW 10 40 1.1 alc 41 1.1 alc /* 42 1.1 alc * BMLEN defines the size of the bitmask used to hold frequency 43 1.1 alc * band specifications. Note this must agree with the BM macro 44 1.1 alc * definition that's used to setup initializers. See also further 45 1.1 alc * comments below. 46 1.1 alc */ 47 1.1 alc #define BMLEN 2 /* 2 x 64 bits in each channel bitmask */ 48 1.1 alc typedef uint64_t chanbmask_t[BMLEN]; 49 1.1 alc 50 1.1 alc #define W0(_a) \ 51 1.1 alc (((_a) >= 0 && (_a) < 64 ? (((uint64_t) 1)<<(_a)) : (uint64_t) 0)) 52 1.1 alc #define W1(_a) \ 53 1.1 alc (((_a) > 63 && (_a) < 128 ? (((uint64_t) 1)<<((_a)-64)) : (uint64_t) 0)) 54 1.1 alc #define BM1(_fa) { W0(_fa), W1(_fa) } 55 1.1 alc #define BM2(_fa, _fb) { W0(_fa) | W0(_fb), W1(_fa) | W1(_fb) } 56 1.1 alc #define BM3(_fa, _fb, _fc) \ 57 1.1 alc { W0(_fa) | W0(_fb) | W0(_fc), W1(_fa) | W1(_fb) | W1(_fc) } 58 1.1 alc #define BM4(_fa, _fb, _fc, _fd) \ 59 1.1 alc { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd), \ 60 1.1 alc W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) } 61 1.1 alc #define BM5(_fa, _fb, _fc, _fd, _fe) \ 62 1.1 alc { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe), \ 63 1.1 alc W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) } 64 1.1 alc #define BM6(_fa, _fb, _fc, _fd, _fe, _ff) \ 65 1.1 alc { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff), \ 66 1.1 alc W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) } 67 1.1 alc #define BM7(_fa, _fb, _fc, _fd, _fe, _ff, _fg) \ 68 1.1 alc { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff) | \ 69 1.1 alc W0(_fg),\ 70 1.1 alc W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) | \ 71 1.1 alc W1(_fg) } 72 1.1 alc #define BM8(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh) \ 73 1.1 alc { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff) | \ 74 1.1 alc W0(_fg) | W0(_fh) , \ 75 1.1 alc W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) | \ 76 1.1 alc W1(_fg) | W1(_fh) } 77 1.1 alc 78 1.1 alc /* 79 1.1 alc * Country/Region Codes 80 1.1 alc * Numbering from ISO 3166 81 1.1 alc */ 82 1.1 alc enum { 83 1.1 alc CTRY_ALBANIA = 8, /* Albania */ 84 1.1 alc CTRY_ALGERIA = 12, /* Algeria */ 85 1.1 alc CTRY_ARGENTINA = 32, /* Argentina */ 86 1.1 alc CTRY_ARMENIA = 51, /* Armenia */ 87 1.1 alc CTRY_AUSTRALIA = 36, /* Australia */ 88 1.1 alc CTRY_AUSTRIA = 40, /* Austria */ 89 1.1 alc CTRY_AZERBAIJAN = 31, /* Azerbaijan */ 90 1.1 alc CTRY_BAHRAIN = 48, /* Bahrain */ 91 1.1 alc CTRY_BELARUS = 112, /* Belarus */ 92 1.1 alc CTRY_BELGIUM = 56, /* Belgium */ 93 1.1 alc CTRY_BELIZE = 84, /* Belize */ 94 1.1 alc CTRY_BOLIVIA = 68, /* Bolivia */ 95 1.1 alc CTRY_BRAZIL = 76, /* Brazil */ 96 1.1 alc CTRY_BRUNEI_DARUSSALAM = 96, /* Brunei Darussalam */ 97 1.1 alc CTRY_BULGARIA = 100, /* Bulgaria */ 98 1.1 alc CTRY_CANADA = 124, /* Canada */ 99 1.1 alc CTRY_CHILE = 152, /* Chile */ 100 1.1 alc CTRY_CHINA = 156, /* People's Republic of China */ 101 1.1 alc CTRY_COLOMBIA = 170, /* Colombia */ 102 1.1 alc CTRY_COSTA_RICA = 188, /* Costa Rica */ 103 1.1 alc CTRY_CROATIA = 191, /* Croatia */ 104 1.1 alc CTRY_CYPRUS = 196, 105 1.1 alc CTRY_CZECH = 203, /* Czech Republic */ 106 1.1 alc CTRY_DENMARK = 208, /* Denmark */ 107 1.1 alc CTRY_DOMINICAN_REPUBLIC = 214, /* Dominican Republic */ 108 1.1 alc CTRY_ECUADOR = 218, /* Ecuador */ 109 1.1 alc CTRY_EGYPT = 818, /* Egypt */ 110 1.1 alc CTRY_EL_SALVADOR = 222, /* El Salvador */ 111 1.1 alc CTRY_ESTONIA = 233, /* Estonia */ 112 1.1 alc CTRY_FAEROE_ISLANDS = 234, /* Faeroe Islands */ 113 1.1 alc CTRY_FINLAND = 246, /* Finland */ 114 1.1 alc CTRY_FRANCE = 250, /* France */ 115 1.1 alc CTRY_FRANCE2 = 255, /* France2 */ 116 1.1 alc CTRY_GEORGIA = 268, /* Georgia */ 117 1.1 alc CTRY_GERMANY = 276, /* Germany */ 118 1.1 alc CTRY_GREECE = 300, /* Greece */ 119 1.1 alc CTRY_GUATEMALA = 320, /* Guatemala */ 120 1.1 alc CTRY_HONDURAS = 340, /* Honduras */ 121 1.1 alc CTRY_HONG_KONG = 344, /* Hong Kong S.A.R., P.R.C. */ 122 1.1 alc CTRY_HUNGARY = 348, /* Hungary */ 123 1.1 alc CTRY_ICELAND = 352, /* Iceland */ 124 1.1 alc CTRY_INDIA = 356, /* India */ 125 1.1 alc CTRY_INDONESIA = 360, /* Indonesia */ 126 1.1 alc CTRY_IRAN = 364, /* Iran */ 127 1.1 alc CTRY_IRAQ = 368, /* Iraq */ 128 1.1 alc CTRY_IRELAND = 372, /* Ireland */ 129 1.1 alc CTRY_ISRAEL = 376, /* Israel */ 130 1.1 alc CTRY_ITALY = 380, /* Italy */ 131 1.1 alc CTRY_JAMAICA = 388, /* Jamaica */ 132 1.1 alc CTRY_JAPAN = 392, /* Japan */ 133 1.1 alc CTRY_JAPAN1 = 393, /* Japan (JP1) */ 134 1.1 alc CTRY_JAPAN2 = 394, /* Japan (JP0) */ 135 1.1 alc CTRY_JAPAN3 = 395, /* Japan (JP1-1) */ 136 1.1 alc CTRY_JAPAN4 = 396, /* Japan (JE1) */ 137 1.1 alc CTRY_JAPAN5 = 397, /* Japan (JE2) */ 138 1.1 alc CTRY_JAPAN6 = 399, /* Japan (JP6) */ 139 1.1 alc 140 1.1 alc CTRY_JAPAN7 = 4007, /* Japan (J7) */ 141 1.1 alc CTRY_JAPAN8 = 4008, /* Japan (J8) */ 142 1.1 alc CTRY_JAPAN9 = 4009, /* Japan (J9) */ 143 1.1 alc 144 1.1 alc CTRY_JAPAN10 = 4010, /* Japan (J10) */ 145 1.1 alc CTRY_JAPAN11 = 4011, /* Japan (J11) */ 146 1.1 alc CTRY_JAPAN12 = 4012, /* Japan (J12) */ 147 1.1 alc 148 1.1 alc CTRY_JAPAN13 = 4013, /* Japan (J13) */ 149 1.1 alc CTRY_JAPAN14 = 4014, /* Japan (J14) */ 150 1.1 alc CTRY_JAPAN15 = 4015, /* Japan (J15) */ 151 1.1 alc 152 1.1 alc CTRY_JAPAN16 = 4016, /* Japan (J16) */ 153 1.1 alc CTRY_JAPAN17 = 4017, /* Japan (J17) */ 154 1.1 alc CTRY_JAPAN18 = 4018, /* Japan (J18) */ 155 1.1 alc 156 1.1 alc CTRY_JAPAN19 = 4019, /* Japan (J19) */ 157 1.1 alc CTRY_JAPAN20 = 4020, /* Japan (J20) */ 158 1.1 alc CTRY_JAPAN21 = 4021, /* Japan (J21) */ 159 1.1 alc 160 1.1 alc CTRY_JAPAN22 = 4022, /* Japan (J22) */ 161 1.1 alc CTRY_JAPAN23 = 4023, /* Japan (J23) */ 162 1.1 alc CTRY_JAPAN24 = 4024, /* Japan (J24) */ 163 1.1 alc 164 1.1 alc CTRY_JORDAN = 400, /* Jordan */ 165 1.1 alc CTRY_KAZAKHSTAN = 398, /* Kazakhstan */ 166 1.1 alc CTRY_KENYA = 404, /* Kenya */ 167 1.1 alc CTRY_KOREA_NORTH = 408, /* North Korea */ 168 1.1 alc CTRY_KOREA_ROC = 410, /* South Korea */ 169 1.1 alc CTRY_KOREA_ROC2 = 411, /* South Korea */ 170 1.1 alc CTRY_KOREA_ROC3 = 412, /* South Korea */ 171 1.1 alc CTRY_KUWAIT = 414, /* Kuwait */ 172 1.1 alc CTRY_LATVIA = 428, /* Latvia */ 173 1.1 alc CTRY_LEBANON = 422, /* Lebanon */ 174 1.1 alc CTRY_LIBYA = 434, /* Libya */ 175 1.1 alc CTRY_LIECHTENSTEIN = 438, /* Liechtenstein */ 176 1.1 alc CTRY_LITHUANIA = 440, /* Lithuania */ 177 1.1 alc CTRY_LUXEMBOURG = 442, /* Luxembourg */ 178 1.1 alc CTRY_MACAU = 446, /* Macau */ 179 1.1 alc CTRY_MACEDONIA = 807, /* the Former Yugoslav Republic of Macedonia */ 180 1.1 alc CTRY_MALAYSIA = 458, /* Malaysia */ 181 1.1 alc CTRY_MALTA = 470, /* Malta */ 182 1.1 alc CTRY_MEXICO = 484, /* Mexico */ 183 1.1 alc CTRY_MONACO = 492, /* Principality of Monaco */ 184 1.1 alc CTRY_MOROCCO = 504, /* Morocco */ 185 1.1 alc CTRY_NETHERLANDS = 528, /* Netherlands */ 186 1.1 alc CTRY_NEW_ZEALAND = 554, /* New Zealand */ 187 1.1 alc CTRY_NICARAGUA = 558, /* Nicaragua */ 188 1.1 alc CTRY_NORWAY = 578, /* Norway */ 189 1.1 alc CTRY_OMAN = 512, /* Oman */ 190 1.1 alc CTRY_PAKISTAN = 586, /* Islamic Republic of Pakistan */ 191 1.1 alc CTRY_PANAMA = 591, /* Panama */ 192 1.1 alc CTRY_PARAGUAY = 600, /* Paraguay */ 193 1.1 alc CTRY_PERU = 604, /* Peru */ 194 1.1 alc CTRY_PHILIPPINES = 608, /* Republic of the Philippines */ 195 1.1 alc CTRY_POLAND = 616, /* Poland */ 196 1.1 alc CTRY_PORTUGAL = 620, /* Portugal */ 197 1.1 alc CTRY_PUERTO_RICO = 630, /* Puerto Rico */ 198 1.1 alc CTRY_QATAR = 634, /* Qatar */ 199 1.1 alc CTRY_ROMANIA = 642, /* Romania */ 200 1.1 alc CTRY_RUSSIA = 643, /* Russia */ 201 1.1 alc CTRY_SAUDI_ARABIA = 682, /* Saudi Arabia */ 202 1.1 alc CTRY_SINGAPORE = 702, /* Singapore */ 203 1.1 alc CTRY_SLOVAKIA = 703, /* Slovak Republic */ 204 1.1 alc CTRY_SLOVENIA = 705, /* Slovenia */ 205 1.1 alc CTRY_SOUTH_AFRICA = 710, /* South Africa */ 206 1.1 alc CTRY_SPAIN = 724, /* Spain */ 207 1.1 alc CTRY_SR9 = 5000, /* Ubiquiti SR9 (900MHz/GSM) */ 208 1.1 alc CTRY_SWEDEN = 752, /* Sweden */ 209 1.1 alc CTRY_SWITZERLAND = 756, /* Switzerland */ 210 1.1 alc CTRY_SYRIA = 760, /* Syria */ 211 1.1 alc CTRY_TAIWAN = 158, /* Taiwan */ 212 1.1 alc CTRY_THAILAND = 764, /* Thailand */ 213 1.1 alc CTRY_TRINIDAD_Y_TOBAGO = 780, /* Trinidad y Tobago */ 214 1.1 alc CTRY_TUNISIA = 788, /* Tunisia */ 215 1.1 alc CTRY_TURKEY = 792, /* Turkey */ 216 1.1 alc CTRY_UAE = 784, /* U.A.E. */ 217 1.1 alc CTRY_UKRAINE = 804, /* Ukraine */ 218 1.1 alc CTRY_UNITED_KINGDOM = 826, /* United Kingdom */ 219 1.1 alc CTRY_UNITED_STATES = 840, /* United States */ 220 1.1 alc CTRY_UNITED_STATES_FCC49 = 842, /* United States (Public Safety)*/ 221 1.1 alc CTRY_URUGUAY = 858, /* Uruguay */ 222 1.1 alc CTRY_UZBEKISTAN = 860, /* Uzbekistan */ 223 1.1 alc CTRY_VENEZUELA = 862, /* Venezuela */ 224 1.1 alc CTRY_VIET_NAM = 704, /* Viet Nam */ 225 1.1 alc CTRY_XR9 = 5001, /* Ubiquiti XR9 (900MHz/GSM) */ 226 1.1 alc CTRY_GZ901 = 5002, /* Zcomax GZ-901 (900MHz/GSM) */ 227 1.1 alc CTRY_YEMEN = 887, /* Yemen */ 228 1.1 alc CTRY_ZIMBABWE = 716 /* Zimbabwe */ 229 1.1 alc }; 230 1.1 alc 231 1.1 alc 232 1.1 alc /* 233 1.1 alc * Mask to check whether a domain is a multidomain or a single domain 234 1.1 alc */ 235 1.1 alc #define MULTI_DOMAIN_MASK 0xFF00 236 1.1 alc 237 1.1 alc /* 238 1.1 alc * Enumerated Regulatory Domain Information 8 bit values indicate that 239 1.1 alc * the regdomain is really a pair of unitary regdomains. 12 bit values 240 1.1 alc * are the real unitary regdomains and are the only ones which have the 241 1.1 alc * frequency bitmasks and flags set. 242 1.1 alc */ 243 1.1 alc enum { 244 1.1 alc /* 245 1.1 alc * The following regulatory domain definitions are 246 1.1 alc * found in the EEPROM. Each regulatory domain 247 1.1 alc * can operate in either a 5GHz or 2.4GHz wireless mode or 248 1.1 alc * both 5GHz and 2.4GHz wireless modes. 249 1.1 alc * In general, the value holds no special 250 1.1 alc * meaning and is used to decode into either specific 251 1.1 alc * 2.4GHz or 5GHz wireless mode for that particular 252 1.1 alc * regulatory domain. 253 1.1 alc */ 254 1.1 alc NO_ENUMRD = 0x00, 255 1.1 alc NULL1_WORLD = 0x03, /* For 11b-only countries (no 11a allowed) */ 256 1.1 alc NULL1_ETSIB = 0x07, /* Israel */ 257 1.1 alc NULL1_ETSIC = 0x08, 258 1.1 alc FCC1_FCCA = 0x10, /* USA */ 259 1.1 alc FCC1_WORLD = 0x11, /* Hong Kong */ 260 1.1 alc FCC4_FCCA = 0x12, /* USA - Public Safety */ 261 1.1 alc FCC5_FCCB = 0x13, /* USA w/ 1/2 and 1/4 width channels */ 262 1.1 alc 263 1.1 alc FCC2_FCCA = 0x20, /* Canada */ 264 1.1 alc FCC2_WORLD = 0x21, /* Australia & HK */ 265 1.1 alc FCC2_ETSIC = 0x22, 266 1.1 alc FRANCE_RES = 0x31, /* Legacy France for OEM */ 267 1.1 alc FCC3_FCCA = 0x3A, /* USA & Canada w/5470 band, 11h, DFS enabled */ 268 1.1 alc FCC3_WORLD = 0x3B, /* USA & Canada w/5470 band, 11h, DFS enabled */ 269 1.1 alc 270 1.1 alc ETSI1_WORLD = 0x37, 271 1.1 alc ETSI3_ETSIA = 0x32, /* France (optional) */ 272 1.1 alc ETSI2_WORLD = 0x35, /* Hungary & others */ 273 1.1 alc ETSI3_WORLD = 0x36, /* France & others */ 274 1.1 alc ETSI4_WORLD = 0x30, 275 1.1 alc ETSI4_ETSIC = 0x38, 276 1.1 alc ETSI5_WORLD = 0x39, 277 1.1 alc ETSI6_WORLD = 0x34, /* Bulgaria */ 278 1.1 alc ETSI_RESERVED = 0x33, /* Reserved (Do not used) */ 279 1.1 alc 280 1.1 alc MKK1_MKKA = 0x40, /* Japan (JP1) */ 281 1.1 alc MKK1_MKKB = 0x41, /* Japan (JP0) */ 282 1.1 alc APL4_WORLD = 0x42, /* Singapore */ 283 1.1 alc MKK2_MKKA = 0x43, /* Japan with 4.9G channels */ 284 1.1 alc APL_RESERVED = 0x44, /* Reserved (Do not used) */ 285 1.1 alc APL2_WORLD = 0x45, /* Korea */ 286 1.1 alc APL2_APLC = 0x46, 287 1.1 alc APL3_WORLD = 0x47, 288 1.1 alc MKK1_FCCA = 0x48, /* Japan (JP1-1) */ 289 1.1 alc APL2_APLD = 0x49, /* Korea with 2.3G channels */ 290 1.1 alc MKK1_MKKA1 = 0x4A, /* Japan (JE1) */ 291 1.1 alc MKK1_MKKA2 = 0x4B, /* Japan (JE2) */ 292 1.1 alc MKK1_MKKC = 0x4C, /* Japan (MKK1_MKKA,except Ch14) */ 293 1.1 alc 294 1.1 alc APL3_FCCA = 0x50, 295 1.1 alc APL1_WORLD = 0x52, /* Latin America */ 296 1.1 alc APL1_FCCA = 0x53, 297 1.1 alc APL1_APLA = 0x54, 298 1.1 alc APL1_ETSIC = 0x55, 299 1.1 alc APL2_ETSIC = 0x56, /* Venezuela */ 300 1.1 alc APL5_WORLD = 0x58, /* Chile */ 301 1.1 alc APL6_WORLD = 0x5B, /* Singapore */ 302 1.1 alc APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */ 303 1.1 alc APL8_WORLD = 0x5D, /* Malaysia 5GHz */ 304 1.1 alc APL9_WORLD = 0x5E, /* Korea 5GHz */ 305 1.1 alc 306 1.1 alc /* 307 1.1 alc * World mode SKUs 308 1.1 alc */ 309 1.1 alc WOR0_WORLD = 0x60, /* World0 (WO0 SKU) */ 310 1.1 alc WOR1_WORLD = 0x61, /* World1 (WO1 SKU) */ 311 1.1 alc WOR2_WORLD = 0x62, /* World2 (WO2 SKU) */ 312 1.1 alc WOR3_WORLD = 0x63, /* World3 (WO3 SKU) */ 313 1.1 alc WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */ 314 1.1 alc WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */ 315 1.1 alc 316 1.1 alc WOR01_WORLD = 0x66, /* World0-1 (WW0-1 SKU) */ 317 1.1 alc WOR02_WORLD = 0x67, /* World0-2 (WW0-2 SKU) */ 318 1.1 alc EU1_WORLD = 0x68, /* Same as World0-2 (WW0-2 SKU), except active scan ch1-13. No ch14 */ 319 1.1 alc 320 1.1 alc WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */ 321 1.1 alc WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */ 322 1.1 alc 323 1.1 alc MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */ 324 1.1 alc MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */ 325 1.1 alc MKK3_MKKC = 0x82, /* Japan UNI-1 even + MKKC */ 326 1.1 alc 327 1.1 alc MKK4_MKKB = 0x83, /* Japan UNI-1 even + UNI-2 + MKKB */ 328 1.1 alc MKK4_MKKA2 = 0x84, /* Japan UNI-1 even + UNI-2 + MKKA2 */ 329 1.1 alc MKK4_MKKC = 0x85, /* Japan UNI-1 even + UNI-2 + MKKC */ 330 1.1 alc 331 1.1 alc MKK5_MKKB = 0x86, /* Japan UNI-1 even + UNI-2 + mid-band + MKKB */ 332 1.1 alc MKK5_MKKA2 = 0x87, /* Japan UNI-1 even + UNI-2 + mid-band + MKKA2 */ 333 1.1 alc MKK5_MKKC = 0x88, /* Japan UNI-1 even + UNI-2 + mid-band + MKKC */ 334 1.1 alc 335 1.1 alc MKK6_MKKB = 0x89, /* Japan UNI-1 even + UNI-1 odd MKKB */ 336 1.1 alc MKK6_MKKA2 = 0x8A, /* Japan UNI-1 even + UNI-1 odd + MKKA2 */ 337 1.1 alc MKK6_MKKC = 0x8B, /* Japan UNI-1 even + UNI-1 odd + MKKC */ 338 1.1 alc 339 1.1 alc MKK7_MKKB = 0x8C, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKB */ 340 1.1 alc MKK7_MKKA2 = 0x8D, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA2 */ 341 1.1 alc MKK7_MKKC = 0x8E, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKC */ 342 1.1 alc 343 1.1 alc MKK8_MKKB = 0x8F, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKB */ 344 1.1 alc MKK8_MKKA2 = 0x90, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKA2 */ 345 1.1 alc MKK8_MKKC = 0x91, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKC */ 346 1.1 alc 347 1.1 alc /* Following definitions are used only by s/w to map old 348 1.1 alc * Japan SKUs. 349 1.1 alc */ 350 1.1 alc MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */ 351 1.1 alc MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */ 352 1.1 alc MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */ 353 1.1 alc MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */ 354 1.1 alc MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */ 355 1.1 alc MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */ 356 1.1 alc MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz */ 357 1.1 alc MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz */ 358 1.1 alc 359 1.1 alc /* 360 1.1 alc * Regulator domains ending in a number (e.g. APL1, 361 1.1 alc * MK1, ETSI4, etc) apply to 5GHz channel and power 362 1.1 alc * information. Regulator domains ending in a letter 363 1.1 alc * (e.g. APLA, FCCA, etc) apply to 2.4GHz channel and 364 1.1 alc * power information. 365 1.1 alc */ 366 1.1 alc APL1 = 0x0150, /* LAT & Asia */ 367 1.1 alc APL2 = 0x0250, /* LAT & Asia */ 368 1.1 alc APL3 = 0x0350, /* Taiwan */ 369 1.1 alc APL4 = 0x0450, /* Jordan */ 370 1.1 alc APL5 = 0x0550, /* Chile */ 371 1.1 alc APL6 = 0x0650, /* Singapore */ 372 1.1 alc APL8 = 0x0850, /* Malaysia */ 373 1.1 alc APL9 = 0x0950, /* Korea (South) ROC 3 */ 374 1.1 alc 375 1.1 alc ETSI1 = 0x0130, /* Europe & others */ 376 1.1 alc ETSI2 = 0x0230, /* Europe & others */ 377 1.1 alc ETSI3 = 0x0330, /* Europe & others */ 378 1.1 alc ETSI4 = 0x0430, /* Europe & others */ 379 1.1 alc ETSI5 = 0x0530, /* Europe & others */ 380 1.1 alc ETSI6 = 0x0630, /* Europe & others */ 381 1.1 alc ETSIA = 0x0A30, /* France */ 382 1.1 alc ETSIB = 0x0B30, /* Israel */ 383 1.1 alc ETSIC = 0x0C30, /* Latin America */ 384 1.1 alc 385 1.1 alc FCC1 = 0x0110, /* US & others */ 386 1.1 alc FCC2 = 0x0120, /* Canada, Australia & New Zealand */ 387 1.1 alc FCC3 = 0x0160, /* US w/new middle band & DFS */ 388 1.1 alc FCC4 = 0x0165, /* US Public Safety */ 389 1.1 alc FCC5 = 0x0166, /* US w/ 1/2 and 1/4 width channels */ 390 1.1 alc FCCA = 0x0A10, 391 1.1 alc FCCB = 0x0A11, /* US w/ 1/2 and 1/4 width channels */ 392 1.1 alc 393 1.1 alc APLD = 0x0D50, /* South Korea */ 394 1.1 alc 395 1.1 alc MKK1 = 0x0140, /* Japan (UNI-1 odd)*/ 396 1.1 alc MKK2 = 0x0240, /* Japan (4.9 GHz + UNI-1 odd) */ 397 1.1 alc MKK3 = 0x0340, /* Japan (UNI-1 even) */ 398 1.1 alc MKK4 = 0x0440, /* Japan (UNI-1 even + UNI-2) */ 399 1.1 alc MKK5 = 0x0540, /* Japan (UNI-1 even + UNI-2 + mid-band) */ 400 1.1 alc MKK6 = 0x0640, /* Japan (UNI-1 odd + UNI-1 even) */ 401 1.1 alc MKK7 = 0x0740, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 */ 402 1.1 alc MKK8 = 0x0840, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 + mid-band) */ 403 1.1 alc MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */ 404 1.1 alc MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ 405 1.1 alc MKKA = 0x0A40, /* Japan */ 406 1.1 alc MKKC = 0x0A50, 407 1.1 alc 408 1.1 alc NULL1 = 0x0198, 409 1.1 alc WORLD = 0x0199, 410 1.1 alc SR9_WORLD = 0x0298, 411 1.1 alc XR9_WORLD = 0x0299, 412 1.1 alc GZ901_WORLD = 0x029a, 413 1.1 alc DEBUG_REG_DMN = 0x01ff, 414 1.1 alc }; 415 1.1 alc 416 1.1 alc #define WORLD_SKU_MASK 0x00F0 417 1.1 alc #define WORLD_SKU_PREFIX 0x0060 418 1.1 alc 419 1.1 alc enum { /* conformance test limits */ 420 1.1 alc FCC = 0x10, 421 1.1 alc MKK = 0x40, 422 1.1 alc ETSI = 0x30, 423 1.1 alc }; 424 1.1 alc 425 1.1 alc /* 426 1.1 alc * The following are flags for different requirements per reg domain. 427 1.1 alc * These requirements are either inhereted from the reg domain pair or 428 1.1 alc * from the unitary reg domain if the reg domain pair flags value is 0 429 1.1 alc */ 430 1.1 alc enum { 431 1.1 alc NO_REQ = 0x00000000, /* NB: must be zero */ 432 1.1 alc DISALLOW_ADHOC_11A = 0x00000001, 433 1.1 alc DISALLOW_ADHOC_11A_TURB = 0x00000002, 434 1.1 alc NEED_NFC = 0x00000004, 435 1.1 alc ADHOC_PER_11D = 0x00000008, /* Start Ad-Hoc mode */ 436 1.1 alc ADHOC_NO_11A = 0x00000010, 437 1.1 alc LIMIT_FRAME_4MS = 0x00000020, /* 4msec limit on frame length*/ 438 1.1 alc NO_HOSTAP = 0x00000040, /* No HOSTAP mode opereation */ 439 1.1 alc }; 440 1.1 alc 441 1.1 alc /* 442 1.1 alc * The following describe the bit masks for different passive scan 443 1.1 alc * capability/requirements per regdomain. 444 1.1 alc */ 445 1.1 alc #define NO_PSCAN 0x0ULL /* NB: must be zero */ 446 1.1 alc #define PSCAN_FCC 0x0000000000000001ULL 447 1.1 alc #define PSCAN_FCC_T 0x0000000000000002ULL 448 1.1 alc #define PSCAN_ETSI 0x0000000000000004ULL 449 1.1 alc #define PSCAN_MKK1 0x0000000000000008ULL 450 1.1 alc #define PSCAN_MKK2 0x0000000000000010ULL 451 1.1 alc #define PSCAN_MKKA 0x0000000000000020ULL 452 1.1 alc #define PSCAN_MKKA_G 0x0000000000000040ULL 453 1.1 alc #define PSCAN_ETSIA 0x0000000000000080ULL 454 1.1 alc #define PSCAN_ETSIB 0x0000000000000100ULL 455 1.1 alc #define PSCAN_ETSIC 0x0000000000000200ULL 456 1.1 alc #define PSCAN_WWR 0x0000000000000400ULL 457 1.1 alc #define PSCAN_MKKA1 0x0000000000000800ULL 458 1.1 alc #define PSCAN_MKKA1_G 0x0000000000001000ULL 459 1.1 alc #define PSCAN_MKKA2 0x0000000000002000ULL 460 1.1 alc #define PSCAN_MKKA2_G 0x0000000000004000ULL 461 1.1 alc #define PSCAN_MKK3 0x0000000000008000ULL 462 1.1 alc #define PSCAN_DEFER 0x7FFFFFFFFFFFFFFFULL 463 1.1 alc #define IS_ECM_CHAN 0x8000000000000000ULL 464 1.1 alc 465 1.1 alc /* 466 1.1 alc * THE following table is the mapping of regdomain pairs specified by 467 1.1 alc * an 8 bit regdomain value to the individual unitary reg domains 468 1.1 alc */ 469 1.1 alc typedef struct { 470 1.1 alc HAL_REG_DOMAIN regDmnEnum; /* 16 bit reg domain pair */ 471 1.1 alc HAL_REG_DOMAIN regDmn5GHz; /* 5GHz reg domain */ 472 1.1 alc HAL_REG_DOMAIN regDmn2GHz; /* 2GHz reg domain */ 473 1.1 alc uint32_t flags5GHz; /* Requirements flags (AdHoc 474 1.1 alc disallow, noise floor cal needed, 475 1.1 alc etc) */ 476 1.1 alc uint32_t flags2GHz; /* Requirements flags (AdHoc 477 1.1 alc disallow, noise floor cal needed, 478 1.1 alc etc) */ 479 1.1 alc uint64_t pscanMask; /* Passive Scan flags which 480 1.1 alc can override unitary domain 481 1.1 alc passive scan flags. This 482 1.1 alc value is used as a mask on 483 1.1 alc the unitary flags*/ 484 1.1 alc uint16_t singleCC; /* Country code of single country if 485 1.1 alc a one-on-one mapping exists */ 486 1.1 alc } REG_DMN_PAIR_MAPPING; 487 1.1 alc 488 1.1 alc static REG_DMN_PAIR_MAPPING regDomainPairs[] = { 489 1.1 alc {NO_ENUMRD, DEBUG_REG_DMN, DEBUG_REG_DMN, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 490 1.1 alc {NULL1_WORLD, NULL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 491 1.1 alc {NULL1_ETSIB, NULL1, ETSIB, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 492 1.1 alc {NULL1_ETSIC, NULL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 493 1.1 alc 494 1.1 alc {FCC2_FCCA, FCC2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 495 1.1 alc {FCC2_WORLD, FCC2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 496 1.1 alc {FCC2_ETSIC, FCC2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 497 1.1 alc {FCC3_FCCA, FCC3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 498 1.1 alc {FCC3_WORLD, FCC3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 499 1.1 alc {FCC4_FCCA, FCC4, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 500 1.1 alc {FCC5_FCCB, FCC5, FCCB, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 501 1.1 alc 502 1.1 alc {ETSI1_WORLD, ETSI1, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 503 1.1 alc {ETSI2_WORLD, ETSI2, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 504 1.1 alc {ETSI3_WORLD, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 505 1.1 alc {ETSI4_WORLD, ETSI4, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 506 1.1 alc {ETSI5_WORLD, ETSI5, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 507 1.1 alc {ETSI6_WORLD, ETSI6, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 508 1.1 alc 509 1.1 alc {ETSI3_ETSIA, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 510 1.1 alc {FRANCE_RES, ETSI3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 511 1.1 alc 512 1.1 alc {FCC1_WORLD, FCC1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 513 1.1 alc {FCC1_FCCA, FCC1, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 514 1.1 alc {APL1_WORLD, APL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 515 1.1 alc {APL2_WORLD, APL2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 516 1.1 alc {APL3_WORLD, APL3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 517 1.1 alc {APL4_WORLD, APL4, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 518 1.1 alc {APL5_WORLD, APL5, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 519 1.1 alc {APL6_WORLD, APL6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 520 1.1 alc {APL8_WORLD, APL8, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 521 1.1 alc {APL9_WORLD, APL9, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 522 1.1 alc 523 1.1 alc {APL3_FCCA, APL3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 524 1.1 alc {APL1_ETSIC, APL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 525 1.1 alc {APL2_ETSIC, APL2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 526 1.2 alc {APL2_APLD, APL2, APLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 527 1.1 alc 528 1.1 alc {MKK1_MKKA, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA, CTRY_JAPAN }, 529 1.1 alc {MKK1_MKKB, MKK1, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN1 }, 530 1.1 alc {MKK1_FCCA, MKK1, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN2 }, 531 1.1 alc {MKK1_MKKA1, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN4 }, 532 1.1 alc {MKK1_MKKA2, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN5 }, 533 1.1 alc {MKK1_MKKC, MKK1, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN6 }, 534 1.1 alc 535 1.1 alc /* MKK2 */ 536 1.1 alc {MKK2_MKKA, MKK2, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK2 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN3 }, 537 1.1 alc 538 1.1 alc /* MKK3 */ 539 1.1 alc {MKK3_MKKA, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC , PSCAN_MKKA, 0 }, 540 1.1 alc {MKK3_MKKB, MKK3, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN7 }, 541 1.1 alc {MKK3_MKKA1, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, 0 }, 542 1.1 alc {MKK3_MKKA2,MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN8 }, 543 1.1 alc {MKK3_MKKC, MKK3, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, CTRY_JAPAN9 }, 544 1.1 alc {MKK3_FCCA, MKK3, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, 0 }, 545 1.1 alc 546 1.1 alc /* MKK4 */ 547 1.1 alc {MKK4_MKKB, MKK4, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN10 }, 548 1.1 alc {MKK4_MKKA1, MKK4, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA1 | PSCAN_MKKA1_G, 0 }, 549 1.1 alc {MKK4_MKKA2, MKK4, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 |PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN11 }, 550 1.1 alc {MKK4_MKKC, MKK4, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN12 }, 551 1.1 alc {MKK4_FCCA, MKK4, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, 0 }, 552 1.1 alc 553 1.1 alc /* MKK5 */ 554 1.1 alc {MKK5_MKKB, MKK5, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN13 }, 555 1.1 alc {MKK5_MKKA2,MKK5, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN14 }, 556 1.1 alc {MKK5_MKKC, MKK5, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN15 }, 557 1.1 alc 558 1.1 alc /* MKK6 */ 559 1.1 alc {MKK6_MKKB, MKK6, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN16 }, 560 1.1 alc {MKK6_MKKA2, MKK6, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN17 }, 561 1.1 alc {MKK6_MKKC, MKK6, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN18 }, 562 1.1 alc 563 1.1 alc /* MKK7 */ 564 1.1 alc {MKK7_MKKB, MKK7, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN19 }, 565 1.1 alc {MKK7_MKKA2, MKK7, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN20 }, 566 1.1 alc {MKK7_MKKC, MKK7, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3, CTRY_JAPAN21 }, 567 1.1 alc 568 1.1 alc /* MKK8 */ 569 1.1 alc {MKK8_MKKB, MKK8, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN22 }, 570 1.1 alc {MKK8_MKKA2,MKK8, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN23 }, 571 1.1 alc {MKK8_MKKC, MKK8, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 , CTRY_JAPAN24 }, 572 1.1 alc 573 1.1 alc {MKK9_MKKA, MKK9, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, 0 }, 574 1.1 alc {MKK10_MKKA, MKK10, MKKA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, 0 }, 575 1.1 alc 576 1.1 alc /* These are super domains */ 577 1.1 alc {WOR0_WORLD, WOR0_WORLD, WOR0_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 578 1.1 alc {WOR1_WORLD, WOR1_WORLD, WOR1_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 579 1.1 alc {WOR2_WORLD, WOR2_WORLD, WOR2_WORLD, DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 580 1.1 alc {WOR3_WORLD, WOR3_WORLD, WOR3_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 581 1.1 alc {WOR4_WORLD, WOR4_WORLD, WOR4_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 582 1.1 alc {WOR5_ETSIC, WOR5_ETSIC, WOR5_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 583 1.1 alc {WOR01_WORLD, WOR01_WORLD, WOR01_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 584 1.1 alc {WOR02_WORLD, WOR02_WORLD, WOR02_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 585 1.1 alc {EU1_WORLD, EU1_WORLD, EU1_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, 586 1.1 alc {WOR9_WORLD, WOR9_WORLD, WOR9_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 587 1.1 alc {WORA_WORLD, WORA_WORLD, WORA_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, 588 1.1 alc {SR9_WORLD, NULL1, SR9_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_SR9 }, 589 1.1 alc {XR9_WORLD, NULL1, XR9_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_XR9 }, 590 1.1 alc {GZ901_WORLD, NULL1, GZ901_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_GZ901 }, 591 1.1 alc }; 592 1.1 alc 593 1.1 alc /* 594 1.1 alc * The following tables are the master list for all different freqeuncy 595 1.1 alc * bands with the complete matrix of all possible flags and settings 596 1.1 alc * for each band if it is used in ANY reg domain. 597 1.1 alc */ 598 1.1 alc 599 1.1 alc #define DEF_REGDMN FCC1_FCCA 600 1.1 alc #define DEF_DMN_5 FCC1 601 1.1 alc #define DEF_DMN_2 FCCA 602 1.1 alc #define COUNTRY_ERD_FLAG 0x8000 603 1.1 alc #define WORLDWIDE_ROAMING_FLAG 0x4000 604 1.1 alc #define SUPER_DOMAIN_MASK 0x0fff 605 1.1 alc #define COUNTRY_CODE_MASK 0x3fff 606 1.1 alc 607 1.1 alc #define YES AH_TRUE 608 1.1 alc #define NO AH_FALSE 609 1.1 alc 610 1.1 alc typedef struct { 611 1.1 alc HAL_CTRY_CODE countryCode; 612 1.1 alc HAL_REG_DOMAIN regDmnEnum; 613 1.1 alc HAL_BOOL allow11g; 614 1.1 alc HAL_BOOL allow11aTurbo; 615 1.1 alc HAL_BOOL allow11gTurbo; 616 1.1 alc HAL_BOOL allow11ng20; 617 1.1 alc HAL_BOOL allow11ng40; 618 1.1 alc HAL_BOOL allow11na20; 619 1.1 alc HAL_BOOL allow11na40; 620 1.1 alc uint16_t outdoorChanStart; 621 1.1 alc } COUNTRY_CODE_TO_ENUM_RD; 622 1.1 alc 623 1.1 alc static COUNTRY_CODE_TO_ENUM_RD allCountries[] = { 624 1.1 alc {CTRY_DEBUG, NO_ENUMRD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 625 1.1 alc {CTRY_DEFAULT, DEF_REGDMN, YES, YES, YES, YES,YES, YES,YES, 7000 }, 626 1.1 alc {CTRY_ALBANIA, NULL1_WORLD, YES, NO, YES, YES, NO, NO, NO, 7000 }, 627 1.1 alc {CTRY_ALGERIA, NULL1_WORLD, YES, NO, YES, YES, NO, NO, NO, 7000 }, 628 1.1 alc {CTRY_ARGENTINA, APL3_WORLD, NO, NO, NO, NO, NO, NO, NO, 7000 }, 629 1.1 alc {CTRY_ARMENIA, ETSI4_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 630 1.1 alc {CTRY_AUSTRALIA, FCC2_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 631 1.1 alc {CTRY_AUSTRIA, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 632 1.1 alc {CTRY_AZERBAIJAN, ETSI4_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 633 1.1 alc {CTRY_BAHRAIN, APL6_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 634 1.1 alc {CTRY_BELARUS, NULL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 635 1.1 alc {CTRY_BELGIUM, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 636 1.1 alc {CTRY_BELIZE, APL1_ETSIC, YES, YES, YES, YES,YES, YES,YES, 7000 }, 637 1.1 alc {CTRY_BOLIVIA, APL1_ETSIC, YES, YES, YES, YES,YES, YES,YES, 7000 }, 638 1.1 alc {CTRY_BRAZIL, FCC3_WORLD, YES, NO, NO, YES, NO, YES, NO, 7000 }, 639 1.1 alc {CTRY_BRUNEI_DARUSSALAM,APL1_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 640 1.1 alc {CTRY_BULGARIA, ETSI6_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 641 1.1 alc {CTRY_CANADA, FCC2_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 642 1.1 alc {CTRY_CHILE, APL6_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 643 1.1 alc {CTRY_CHINA, APL1_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 644 1.1 alc {CTRY_COLOMBIA, FCC1_FCCA, YES, NO, YES, YES,YES, YES, NO, 7000 }, 645 1.1 alc {CTRY_COSTA_RICA, NULL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 646 1.1 alc {CTRY_CROATIA, ETSI3_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 647 1.1 alc {CTRY_CYPRUS, ETSI1_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 648 1.1 alc {CTRY_CZECH, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 649 1.1 alc {CTRY_DENMARK, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 650 1.1 alc {CTRY_DOMINICAN_REPUBLIC,FCC1_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 651 1.1 alc {CTRY_ECUADOR, NULL1_WORLD, NO, NO, NO, NO, NO, NO, NO, 7000 }, 652 1.1 alc {CTRY_EGYPT, ETSI3_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 653 1.1 alc {CTRY_EL_SALVADOR, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 654 1.1 alc {CTRY_ESTONIA, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 655 1.1 alc {CTRY_FINLAND, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 656 1.1 alc {CTRY_FRANCE, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 657 1.1 alc {CTRY_FRANCE2, ETSI3_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 658 1.1 alc {CTRY_GEORGIA, ETSI4_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 659 1.1 alc {CTRY_GERMANY, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 660 1.1 alc {CTRY_GREECE, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 661 1.1 alc {CTRY_GUATEMALA, FCC1_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 662 1.1 alc {CTRY_GZ901, GZ901_WORLD, YES, NO, NO, NO, NO, NO, NO, 7000 }, 663 1.1 alc {CTRY_HONDURAS, NULL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 664 1.1 alc {CTRY_HONG_KONG, FCC2_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 665 1.1 alc {CTRY_HUNGARY, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 666 1.1 alc {CTRY_ICELAND, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 667 1.1 alc {CTRY_INDIA, APL6_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 668 1.1 alc {CTRY_INDONESIA, APL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 669 1.1 alc {CTRY_IRAN, APL1_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 670 1.1 alc {CTRY_IRELAND, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 671 1.1 alc {CTRY_ISRAEL, NULL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 672 1.1 alc {CTRY_ITALY, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 673 1.1 alc {CTRY_JAPAN, MKK1_MKKA, YES, NO, NO, YES, NO, YES, NO, 7000 }, 674 1.1 alc {CTRY_JAPAN1, MKK1_MKKB, YES, NO, NO, NO, NO, NO, NO, 7000 }, 675 1.1 alc {CTRY_JAPAN2, MKK1_FCCA, YES, NO, NO, NO, NO, NO, NO, 7000 }, 676 1.1 alc {CTRY_JAPAN3, MKK2_MKKA, YES, NO, NO, NO, NO, NO, NO, 7000 }, 677 1.1 alc {CTRY_JAPAN4, MKK1_MKKA1, YES, NO, NO, NO, NO, NO, NO, 7000 }, 678 1.1 alc {CTRY_JAPAN5, MKK1_MKKA2, YES, NO, NO, NO, NO, NO, NO, 7000 }, 679 1.1 alc {CTRY_JAPAN6, MKK1_MKKC, YES, NO, NO, NO, NO, NO, NO, 7000 }, 680 1.1 alc 681 1.1 alc {CTRY_JAPAN7, MKK3_MKKB, YES, NO, NO, NO, NO, NO, NO, 7000 }, 682 1.1 alc {CTRY_JAPAN8, MKK3_MKKA2, YES, NO, NO, NO, NO, NO, NO, 7000 }, 683 1.1 alc {CTRY_JAPAN9, MKK3_MKKC, YES, NO, NO, NO, NO, NO, NO, 7000 }, 684 1.1 alc 685 1.1 alc {CTRY_JAPAN10, MKK4_MKKB, YES, NO, NO, NO, NO, NO, NO, 7000 }, 686 1.1 alc {CTRY_JAPAN11, MKK4_MKKA2, YES, NO, NO, NO, NO, NO, NO, 7000 }, 687 1.1 alc {CTRY_JAPAN12, MKK4_MKKC, YES, NO, NO, NO, NO, NO, NO, 7000 }, 688 1.1 alc 689 1.1 alc {CTRY_JAPAN13, MKK5_MKKB, YES, NO, NO, NO, NO, NO, NO, 7000 }, 690 1.1 alc {CTRY_JAPAN14, MKK5_MKKA2, YES, NO, NO, NO, NO, NO, NO, 7000 }, 691 1.1 alc {CTRY_JAPAN15, MKK5_MKKC, YES, NO, NO, NO, NO, NO, NO, 7000 }, 692 1.1 alc 693 1.1 alc {CTRY_JAPAN16, MKK6_MKKB, YES, NO, NO, NO, NO, NO, NO, 7000 }, 694 1.1 alc {CTRY_JAPAN17, MKK6_MKKA2, YES, NO, NO, NO, NO, NO, NO, 7000 }, 695 1.1 alc {CTRY_JAPAN18, MKK6_MKKC, YES, NO, NO, NO, NO, NO, NO, 7000 }, 696 1.1 alc 697 1.1 alc {CTRY_JAPAN19, MKK7_MKKB, YES, NO, NO, NO, NO, NO, NO, 7000 }, 698 1.1 alc {CTRY_JAPAN20, MKK7_MKKA2, YES, NO, NO, YES, NO, YES, NO, 7000 }, 699 1.1 alc {CTRY_JAPAN21, MKK7_MKKC, YES, NO, NO, NO, NO, NO, NO, 7000 }, 700 1.1 alc 701 1.1 alc {CTRY_JAPAN22, MKK8_MKKB, YES, NO, NO, NO, NO, NO, NO, 7000 }, 702 1.1 alc {CTRY_JAPAN23, MKK8_MKKA2, YES, NO, NO, NO, NO, NO, NO, 7000 }, 703 1.1 alc {CTRY_JAPAN24, MKK8_MKKC, YES, NO, NO, NO, NO, NO, NO, 7000 }, 704 1.1 alc 705 1.1 alc {CTRY_JORDAN, APL4_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 706 1.1 alc {CTRY_KAZAKHSTAN, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 707 1.1 alc {CTRY_KOREA_NORTH, APL2_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 708 1.1 alc {CTRY_KOREA_ROC, APL2_WORLD, YES, NO, NO, YES, NO, YES, NO, 7000 }, 709 1.1 alc {CTRY_KOREA_ROC2, APL2_WORLD, YES, NO, NO, YES, NO, YES, NO, 7000 }, 710 1.1 alc {CTRY_KOREA_ROC3, APL9_WORLD, YES, NO, NO, YES, NO, YES, NO, 7000 }, 711 1.1 alc {CTRY_KUWAIT, NULL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 712 1.1 alc {CTRY_LATVIA, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 713 1.1 alc {CTRY_LEBANON, NULL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 714 1.1 alc {CTRY_LIECHTENSTEIN,ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 715 1.1 alc {CTRY_LITHUANIA, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 716 1.1 alc {CTRY_LUXEMBOURG, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 717 1.1 alc {CTRY_MACAU, FCC2_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 718 1.1 alc {CTRY_MACEDONIA, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 719 1.1 alc {CTRY_MALAYSIA, APL8_WORLD, YES, NO, NO, YES, NO, YES, NO, 7000 }, 720 1.1 alc {CTRY_MALTA, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 721 1.1 alc {CTRY_MEXICO, FCC1_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 722 1.1 alc {CTRY_MONACO, ETSI4_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 723 1.1 alc {CTRY_MOROCCO, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 724 1.1 alc {CTRY_NETHERLANDS, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 725 1.1 alc {CTRY_NEW_ZEALAND, FCC2_ETSIC, YES, NO, YES, YES,YES, YES,YES, 7000 }, 726 1.1 alc {CTRY_NORWAY, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 727 1.1 alc {CTRY_OMAN, APL6_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 728 1.1 alc {CTRY_PAKISTAN, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 729 1.1 alc {CTRY_PANAMA, FCC1_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 730 1.1 alc {CTRY_PERU, APL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 731 1.1 alc {CTRY_PHILIPPINES, FCC3_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 732 1.1 alc {CTRY_POLAND, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 733 1.1 alc {CTRY_PORTUGAL, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 734 1.1 alc {CTRY_PUERTO_RICO, FCC1_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 735 1.1 alc {CTRY_QATAR, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 736 1.1 alc {CTRY_ROMANIA, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 737 1.1 alc {CTRY_RUSSIA, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 738 1.1 alc {CTRY_SAUDI_ARABIA,FCC2_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 739 1.1 alc {CTRY_SINGAPORE, APL6_WORLD, YES, YES, YES, YES,YES, YES,YES, 7000 }, 740 1.1 alc {CTRY_SLOVAKIA, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 741 1.1 alc {CTRY_SLOVENIA, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 742 1.1 alc {CTRY_SOUTH_AFRICA,FCC3_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 743 1.1 alc {CTRY_SPAIN, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 744 1.1 alc {CTRY_SR9, SR9_WORLD, YES, NO, NO, NO, NO, NO, NO, 7000 }, 745 1.1 alc {CTRY_SWEDEN, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 746 1.1 alc {CTRY_SWITZERLAND, ETSI1_WORLD, YES, NO, YES, YES,YES, YES,YES, 7000 }, 747 1.1 alc {CTRY_SYRIA, NULL1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 748 1.1 alc {CTRY_TAIWAN, APL3_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 749 1.1 alc {CTRY_THAILAND, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 750 1.1 alc {CTRY_TRINIDAD_Y_TOBAGO,ETSI4_WORLD,YES, NO, YES, YES,YES, YES, NO, 7000 }, 751 1.1 alc {CTRY_TUNISIA, ETSI3_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 752 1.1 alc {CTRY_TURKEY, ETSI3_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 753 1.1 alc {CTRY_UKRAINE, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 754 1.1 alc {CTRY_UAE, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 755 1.1 alc {CTRY_UNITED_KINGDOM, ETSI1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 756 1.1 alc {CTRY_UNITED_STATES, FCC1_FCCA, YES, YES, YES, YES,YES, YES,YES, 5825 }, 757 1.1 alc {CTRY_UNITED_STATES_FCC49,FCC4_FCCA,YES, YES, YES, YES,YES, YES,YES, 7000 }, 758 1.1 alc {CTRY_URUGUAY, FCC1_WORLD, YES, NO, YES, YES,YES, YES, NO, 7000 }, 759 1.1 alc {CTRY_UZBEKISTAN, FCC3_FCCA, YES, YES, YES, YES,YES, YES,YES, 7000 }, 760 1.1 alc {CTRY_VENEZUELA, APL2_ETSIC, YES, NO, YES, YES,YES, YES, NO, 7000 }, 761 1.1 alc {CTRY_VIET_NAM, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 762 1.1 alc {CTRY_XR9, XR9_WORLD, YES, NO, NO, NO, NO, NO, NO, 7000 }, 763 1.1 alc {CTRY_YEMEN, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 }, 764 1.1 alc {CTRY_ZIMBABWE, NULL1_WORLD, YES, NO, YES, YES,YES, NO, NO, 7000 } 765 1.1 alc }; 766 1.1 alc 767 1.1 alc /* Bit masks for DFS per regdomain */ 768 1.1 alc enum { 769 1.1 alc NO_DFS = 0x0000000000000000ULL, /* NB: must be zero */ 770 1.1 alc DFS_FCC3 = 0x0000000000000001ULL, 771 1.1 alc DFS_ETSI = 0x0000000000000002ULL, 772 1.1 alc DFS_MKK4 = 0x0000000000000004ULL, 773 1.1 alc }; 774 1.1 alc 775 1.1 alc #define AFTER(x) ((x)+1) 776 1.1 alc 777 1.1 alc /* 778 1.1 alc * Frequency band collections are defined using bitmasks. Each bit 779 1.1 alc * in a mask is the index of an entry in one of the following tables. 780 1.1 alc * Bitmasks are BMLEN*64 bits so if a table grows beyond that the bit 781 1.1 alc * vectors must be enlarged or the tables split somehow (e.g. split 782 1.1 alc * 1/2 and 1/4 rate channels into a separate table). 783 1.1 alc * 784 1.1 alc * Beware of ordering; the indices are defined relative to the preceding 785 1.1 alc * entry so if things get off there will be confusion. A good way to 786 1.1 alc * check the indices is to collect them in a switch statement in a stub 787 1.1 alc * function so the compiler checks for duplicates. 788 1.1 alc */ 789 1.1 alc 790 1.1 alc typedef struct { 791 1.1 alc uint16_t lowChannel; /* Low channel center in MHz */ 792 1.1 alc uint16_t highChannel; /* High Channel center in MHz */ 793 1.1 alc uint8_t powerDfs; /* Max power (dBm) for channel 794 1.1 alc range when using DFS */ 795 1.1 alc uint8_t antennaMax; /* Max allowed antenna gain */ 796 1.1 alc uint8_t channelBW; /* Bandwidth of the channel */ 797 1.1 alc uint8_t channelSep; /* Channel separation within 798 1.1 alc the band */ 799 1.1 alc uint64_t useDfs; /* Use DFS in the RegDomain 800 1.1 alc if corresponding bit is set */ 801 1.1 alc uint64_t usePassScan; /* Use Passive Scan in the RegDomain 802 1.1 alc if corresponding bit is set */ 803 1.1 alc uint8_t regClassId; /* Regulatory class id */ 804 1.1 alc } REG_DMN_FREQ_BAND; 805 1.1 alc 806 1.1 alc /* 807 1.1 alc * 5GHz 11A channel tags 808 1.1 alc */ 809 1.1 alc static REG_DMN_FREQ_BAND regDmn5GhzFreq[] = { 810 1.1 alc { 4915, 4925, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 16 }, 811 1.1 alc #define F1_4915_4925 0 812 1.1 alc { 4935, 4945, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 16 }, 813 1.1 alc #define F1_4935_4945 AFTER(F1_4915_4925) 814 1.1 alc { 4920, 4980, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2, 7 }, 815 1.1 alc #define F1_4920_4980 AFTER(F1_4935_4945) 816 1.1 alc { 4942, 4987, 27, 6, 5, 5, NO_DFS, PSCAN_FCC, 0 }, 817 1.1 alc #define F1_4942_4987 AFTER(F1_4920_4980) 818 1.1 alc { 4945, 4985, 30, 6, 10, 5, NO_DFS, PSCAN_FCC, 0 }, 819 1.1 alc #define F1_4945_4985 AFTER(F1_4942_4987) 820 1.1 alc { 4950, 4980, 33, 6, 20, 5, NO_DFS, PSCAN_FCC, 0 }, 821 1.1 alc #define F1_4950_4980 AFTER(F1_4945_4985) 822 1.1 alc { 5035, 5040, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 12 }, 823 1.1 alc #define F1_5035_5040 AFTER(F1_4950_4980) 824 1.1 alc { 5040, 5080, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2, 2 }, 825 1.1 alc #define F1_5040_5080 AFTER(F1_5035_5040) 826 1.1 alc { 5055, 5055, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 12 }, 827 1.1 alc #define F1_5055_5055 AFTER(F1_5040_5080) 828 1.1 alc 829 1.1 alc { 5120, 5240, 5, 6, 20, 20, NO_DFS, NO_PSCAN, 0 }, 830 1.1 alc #define F1_5120_5240 AFTER(F1_5055_5055) 831 1.1 alc { 5120, 5240, 5, 6, 10, 10, NO_DFS, NO_PSCAN, 0 }, 832 1.1 alc #define F2_5120_5240 AFTER(F1_5120_5240) 833 1.1 alc { 5120, 5240, 5, 6, 5, 5, NO_DFS, NO_PSCAN, 0 }, 834 1.1 alc #define F3_5120_5240 AFTER(F2_5120_5240) 835 1.1 alc 836 1.1 alc { 5170, 5230, 23, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2, 1 }, 837 1.1 alc #define F1_5170_5230 AFTER(F3_5120_5240) 838 1.1 alc { 5170, 5230, 20, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2, 1 }, 839 1.1 alc #define F2_5170_5230 AFTER(F1_5170_5230) 840 1.1 alc 841 1.1 alc { 5180, 5240, 15, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0 }, 842 1.1 alc #define F1_5180_5240 AFTER(F2_5170_5230) 843 1.1 alc { 5180, 5240, 17, 6, 20, 20, NO_DFS, PSCAN_FCC, 1 }, 844 1.1 alc #define F2_5180_5240 AFTER(F1_5180_5240) 845 1.1 alc { 5180, 5240, 18, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0 }, 846 1.1 alc #define F3_5180_5240 AFTER(F2_5180_5240) 847 1.1 alc { 5180, 5240, 20, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0 }, 848 1.1 alc #define F4_5180_5240 AFTER(F3_5180_5240) 849 1.1 alc { 5180, 5240, 23, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0 }, 850 1.1 alc #define F5_5180_5240 AFTER(F4_5180_5240) 851 1.1 alc { 5180, 5240, 23, 6, 20, 20, NO_DFS, PSCAN_FCC, 0 }, 852 1.1 alc #define F6_5180_5240 AFTER(F5_5180_5240) 853 1.1 alc { 5180, 5240, 17, 6, 20, 10, NO_DFS, PSCAN_FCC, 1 }, 854 1.1 alc #define F7_5180_5240 AFTER(F6_5180_5240) 855 1.1 alc { 5180, 5240, 17, 6, 20, 5, NO_DFS, PSCAN_FCC, 1 }, 856 1.1 alc #define F8_5180_5240 AFTER(F7_5180_5240) 857 1.1 alc 858 1.1 alc { 5180, 5320, 20, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0 }, 859 1.1 alc #define F1_5180_5320 AFTER(F8_5180_5240) 860 1.1 alc 861 1.1 alc { 5240, 5280, 23, 0, 20, 20, DFS_FCC3, PSCAN_FCC | PSCAN_ETSI, 0 }, 862 1.1 alc #define F1_5240_5280 AFTER(F1_5180_5320) 863 1.1 alc 864 1.1 alc { 5260, 5280, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0 }, 865 1.1 alc #define F1_5260_5280 AFTER(F1_5240_5280) 866 1.1 alc 867 1.1 alc { 5260, 5320, 18, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0 }, 868 1.1 alc #define F1_5260_5320 AFTER(F1_5260_5280) 869 1.1 alc 870 1.1 alc { 5260, 5320, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_FCC | PSCAN_ETSI | PSCAN_MKK3 , 0 }, 871 1.1 alc #define F2_5260_5320 AFTER(F1_5260_5320) 872 1.1 alc 873 1.1 alc { 5260, 5320, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2 }, 874 1.1 alc #define F3_5260_5320 AFTER(F2_5260_5320) 875 1.1 alc { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2 }, 876 1.1 alc #define F4_5260_5320 AFTER(F3_5260_5320) 877 1.1 alc { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 0 }, 878 1.1 alc #define F5_5260_5320 AFTER(F4_5260_5320) 879 1.1 alc { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0 }, 880 1.1 alc #define F6_5260_5320 AFTER(F5_5260_5320) 881 1.1 alc { 5260, 5320, 23, 6, 20, 10, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2 }, 882 1.1 alc #define F7_5260_5320 AFTER(F6_5260_5320) 883 1.1 alc { 5260, 5320, 23, 6, 20, 5, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2 }, 884 1.1 alc #define F8_5260_5320 AFTER(F7_5260_5320) 885 1.1 alc 886 1.1 alc { 5260, 5700, 5, 6, 20, 20, DFS_FCC3 | DFS_ETSI, NO_PSCAN, 0 }, 887 1.1 alc #define F1_5260_5700 AFTER(F8_5260_5320) 888 1.1 alc { 5260, 5700, 5, 6, 10, 10, DFS_FCC3 | DFS_ETSI, NO_PSCAN, 0 }, 889 1.1 alc #define F2_5260_5700 AFTER(F1_5260_5700) 890 1.1 alc { 5260, 5700, 5, 6, 5, 5, DFS_FCC3 | DFS_ETSI, NO_PSCAN, 0 }, 891 1.1 alc #define F3_5260_5700 AFTER(F2_5260_5700) 892 1.1 alc 893 1.1 alc { 5280, 5320, 17, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 0 }, 894 1.1 alc #define F1_5280_5320 AFTER(F3_5260_5700) 895 1.1 alc 896 1.1 alc { 5500, 5620, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0 }, 897 1.1 alc #define F1_5500_5620 AFTER(F1_5280_5320) 898 1.1 alc 899 1.1 alc { 5500, 5700, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 4 }, 900 1.1 alc #define F1_5500_5700 AFTER(F1_5500_5620) 901 1.1 alc { 5500, 5700, 27, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0 }, 902 1.1 alc #define F2_5500_5700 AFTER(F1_5500_5700) 903 1.1 alc { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0 }, 904 1.1 alc #define F3_5500_5700 AFTER(F2_5500_5700) 905 1.1 alc { 5500, 5700, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_MKK3 | PSCAN_FCC, 0 }, 906 1.1 alc #define F4_5500_5700 AFTER(F3_5500_5700) 907 1.1 alc 908 1.1 alc { 5745, 5805, 23, 0, 20, 20, NO_DFS, NO_PSCAN, 0 }, 909 1.1 alc #define F1_5745_5805 AFTER(F4_5500_5700) 910 1.1 alc { 5745, 5805, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 0 }, 911 1.1 alc #define F2_5745_5805 AFTER(F1_5745_5805) 912 1.1 alc { 5745, 5805, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0 }, 913 1.1 alc #define F3_5745_5805 AFTER(F2_5745_5805) 914 1.1 alc { 5745, 5825, 5, 6, 20, 20, NO_DFS, NO_PSCAN, 0 }, 915 1.1 alc #define F1_5745_5825 AFTER(F3_5745_5805) 916 1.1 alc { 5745, 5825, 17, 0, 20, 20, NO_DFS, NO_PSCAN, 0 }, 917 1.1 alc #define F2_5745_5825 AFTER(F1_5745_5825) 918 1.1 alc { 5745, 5825, 20, 0, 20, 20, NO_DFS, NO_PSCAN, 0 }, 919 1.1 alc #define F3_5745_5825 AFTER(F2_5745_5825) 920 1.1 alc { 5745, 5825, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0 }, 921 1.1 alc #define F4_5745_5825 AFTER(F3_5745_5825) 922 1.1 alc { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 3 }, 923 1.1 alc #define F5_5745_5825 AFTER(F4_5745_5825) 924 1.1 alc { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 0 }, 925 1.1 alc #define F6_5745_5825 AFTER(F5_5745_5825) 926 1.1 alc { 5745, 5825, 5, 6, 10, 10, NO_DFS, NO_PSCAN, 0 }, 927 1.1 alc #define F7_5745_5825 AFTER(F6_5745_5825) 928 1.1 alc { 5745, 5825, 5, 6, 5, 5, NO_DFS, NO_PSCAN, 0 }, 929 1.1 alc #define F8_5745_5825 AFTER(F7_5745_5825) 930 1.1 alc { 5745, 5825, 30, 6, 20, 10, NO_DFS, NO_PSCAN, 3 }, 931 1.1 alc #define F9_5745_5825 AFTER(F8_5745_5825) 932 1.1 alc { 5745, 5825, 30, 6, 20, 5, NO_DFS, NO_PSCAN, 3 }, 933 1.1 alc #define F10_5745_5825 AFTER(F9_5745_5825) 934 1.1 alc 935 1.1 alc /* 936 1.1 alc * Below are the world roaming channels 937 1.1 alc * All WWR domains have no power limit, instead use the card's CTL 938 1.1 alc * or max power settings. 939 1.1 alc */ 940 1.1 alc { 4920, 4980, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0 }, 941 1.1 alc #define W1_4920_4980 AFTER(F10_5745_5825) 942 1.1 alc { 5040, 5080, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0 }, 943 1.1 alc #define W1_5040_5080 AFTER(W1_4920_4980) 944 1.1 alc { 5170, 5230, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0 }, 945 1.1 alc #define W1_5170_5230 AFTER(W1_5040_5080) 946 1.1 alc { 5180, 5240, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0 }, 947 1.1 alc #define W1_5180_5240 AFTER(W1_5170_5230) 948 1.1 alc { 5260, 5320, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0 }, 949 1.1 alc #define W1_5260_5320 AFTER(W1_5180_5240) 950 1.1 alc { 5745, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0 }, 951 1.1 alc #define W1_5745_5825 AFTER(W1_5260_5320) 952 1.1 alc { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0 }, 953 1.1 alc #define W1_5500_5700 AFTER(W1_5745_5825) 954 1.1 alc { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0 }, 955 1.1 alc #define W2_5260_5320 AFTER(W1_5500_5700) 956 1.1 alc { 5180, 5240, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0 }, 957 1.1 alc #define W2_5180_5240 AFTER(W2_5260_5320) 958 1.1 alc { 5825, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0 }, 959 1.1 alc #define W2_5825_5825 AFTER(W2_5180_5240) 960 1.1 alc }; 961 1.1 alc 962 1.1 alc /* 963 1.1 alc * 5GHz Turbo (dynamic & static) tags 964 1.1 alc */ 965 1.1 alc static REG_DMN_FREQ_BAND regDmn5GhzTurboFreq[] = { 966 1.1 alc { 5130, 5210, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 967 1.1 alc #define T1_5130_5210 0 968 1.1 alc { 5250, 5330, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0}, 969 1.1 alc #define T1_5250_5330 AFTER(T1_5130_5210) 970 1.1 alc { 5370, 5490, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 971 1.1 alc #define T1_5370_5490 AFTER(T1_5250_5330) 972 1.1 alc { 5530, 5650, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0}, 973 1.1 alc #define T1_5530_5650 AFTER(T1_5370_5490) 974 1.1 alc 975 1.1 alc { 5150, 5190, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 976 1.1 alc #define T1_5150_5190 AFTER(T1_5530_5650) 977 1.1 alc { 5230, 5310, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0}, 978 1.1 alc #define T1_5230_5310 AFTER(T1_5150_5190) 979 1.1 alc { 5350, 5470, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 980 1.1 alc #define T1_5350_5470 AFTER(T1_5230_5310) 981 1.1 alc { 5510, 5670, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0}, 982 1.1 alc #define T1_5510_5670 AFTER(T1_5350_5470) 983 1.1 alc 984 1.1 alc { 5200, 5240, 17, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 985 1.1 alc #define T1_5200_5240 AFTER(T1_5510_5670) 986 1.1 alc { 5200, 5240, 23, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 987 1.1 alc #define T2_5200_5240 AFTER(T1_5200_5240) 988 1.1 alc { 5210, 5210, 17, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 989 1.1 alc #define T1_5210_5210 AFTER(T2_5200_5240) 990 1.1 alc { 5210, 5210, 23, 0, 40, 40, NO_DFS, NO_PSCAN, 0}, 991 1.1 alc #define T2_5210_5210 AFTER(T1_5210_5210) 992 1.1 alc 993 1.1 alc { 5280, 5280, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0}, 994 1.1 alc #define T1_5280_5280 AFTER(T2_5210_5210) 995 1.1 alc { 5280, 5280, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0}, 996 1.1 alc #define T2_5280_5280 AFTER(T1_5280_5280) 997 1.1 alc { 5250, 5250, 17, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0}, 998 1.1 alc #define T1_5250_5250 AFTER(T2_5280_5280) 999 1.1 alc { 5290, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0}, 1000 1.1 alc #define T1_5290_5290 AFTER(T1_5250_5250) 1001 1.1 alc { 5250, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0}, 1002 1.1 alc #define T1_5250_5290 AFTER(T1_5290_5290) 1003 1.1 alc { 5250, 5290, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0}, 1004 1.1 alc #define T2_5250_5290 AFTER(T1_5250_5290) 1005 1.1 alc 1006 1.1 alc { 5540, 5660, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0}, 1007 1.1 alc #define T1_5540_5660 AFTER(T2_5250_5290) 1008 1.1 alc { 5760, 5800, 20, 0, 40, 40, NO_DFS, NO_PSCAN, 0}, 1009 1.1 alc #define T1_5760_5800 AFTER(T1_5540_5660) 1010 1.1 alc { 5760, 5800, 30, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 1011 1.1 alc #define T2_5760_5800 AFTER(T1_5760_5800) 1012 1.1 alc 1013 1.1 alc { 5765, 5805, 30, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 1014 1.1 alc #define T1_5765_5805 AFTER(T2_5760_5800) 1015 1.1 alc 1016 1.1 alc /* 1017 1.1 alc * Below are the WWR frequencies 1018 1.1 alc */ 1019 1.1 alc { 5210, 5250, 15, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0}, 1020 1.1 alc #define WT1_5210_5250 AFTER(T1_5765_5805) 1021 1.1 alc { 5290, 5290, 18, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0}, 1022 1.1 alc #define WT1_5290_5290 AFTER(WT1_5210_5250) 1023 1.1 alc { 5540, 5660, 20, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0}, 1024 1.1 alc #define WT1_5540_5660 AFTER(WT1_5290_5290) 1025 1.1 alc { 5760, 5800, 20, 0, 40, 40, NO_DFS, PSCAN_WWR, 0}, 1026 1.1 alc #define WT1_5760_5800 AFTER(WT1_5540_5660) 1027 1.1 alc }; 1028 1.1 alc 1029 1.1 alc /* 1030 1.1 alc * 2GHz 11b channel tags 1031 1.1 alc */ 1032 1.1 alc static REG_DMN_FREQ_BAND regDmn2GhzFreq[] = { 1033 1.1 alc { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1034 1.1 alc #define F1_2312_2372 0 1035 1.1 alc { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1036 1.1 alc #define F2_2312_2372 AFTER(F1_2312_2372) 1037 1.1 alc 1038 1.1 alc { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1039 1.1 alc #define F1_2412_2472 AFTER(F2_2312_2372) 1040 1.1 alc { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA, 0}, 1041 1.1 alc #define F2_2412_2472 AFTER(F1_2412_2472) 1042 1.1 alc { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1043 1.1 alc #define F3_2412_2472 AFTER(F2_2412_2472) 1044 1.1 alc 1045 1.1 alc { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1046 1.1 alc #define F1_2412_2462 AFTER(F3_2412_2472) 1047 1.1 alc { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA, 0}, 1048 1.1 alc #define F2_2412_2462 AFTER(F1_2412_2462) 1049 1.1 alc 1050 1.1 alc { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1051 1.1 alc #define F1_2432_2442 AFTER(F2_2412_2462) 1052 1.1 alc 1053 1.1 alc { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1054 1.1 alc #define F1_2457_2472 AFTER(F1_2432_2442) 1055 1.1 alc 1056 1.1 alc { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA, 0}, 1057 1.1 alc #define F1_2467_2472 AFTER(F1_2457_2472) 1058 1.1 alc 1059 1.1 alc { 2484, 2484, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1060 1.1 alc #define F1_2484_2484 AFTER(F1_2467_2472) 1061 1.1 alc { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA | PSCAN_MKKA1 | PSCAN_MKKA2, 0}, 1062 1.1 alc #define F2_2484_2484 AFTER(F1_2484_2484) 1063 1.1 alc 1064 1.1 alc { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1065 1.1 alc #define F1_2512_2732 AFTER(F2_2484_2484) 1066 1.1 alc 1067 1.1 alc /* 1068 1.1 alc * WWR have powers opened up to 20dBm. 1069 1.1 alc * Limits should often come from CTL/Max powers 1070 1.1 alc */ 1071 1.1 alc { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1072 1.1 alc #define W1_2312_2372 AFTER(F1_2512_2732) 1073 1.1 alc { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1074 1.1 alc #define W1_2412_2412 AFTER(W1_2312_2372) 1075 1.1 alc { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1076 1.1 alc #define W1_2417_2432 AFTER(W1_2412_2412) 1077 1.1 alc { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1078 1.1 alc #define W1_2437_2442 AFTER(W1_2417_2432) 1079 1.1 alc { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1080 1.1 alc #define W1_2447_2457 AFTER(W1_2437_2442) 1081 1.1 alc { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1082 1.1 alc #define W1_2462_2462 AFTER(W1_2447_2457) 1083 1.1 alc { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0}, 1084 1.1 alc #define W1_2467_2467 AFTER(W1_2462_2462) 1085 1.1 alc { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0}, 1086 1.1 alc #define W2_2467_2467 AFTER(W1_2467_2467) 1087 1.1 alc { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0}, 1088 1.1 alc #define W1_2472_2472 AFTER(W2_2467_2467) 1089 1.1 alc { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0}, 1090 1.1 alc #define W2_2472_2472 AFTER(W1_2472_2472) 1091 1.1 alc { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0}, 1092 1.1 alc #define W1_2484_2484 AFTER(W2_2472_2472) 1093 1.1 alc { 2484, 2484, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0}, 1094 1.1 alc #define W2_2484_2484 AFTER(W1_2484_2484) 1095 1.1 alc }; 1096 1.1 alc 1097 1.1 alc /* 1098 1.1 alc * 2GHz 11g channel tags 1099 1.1 alc */ 1100 1.1 alc static REG_DMN_FREQ_BAND regDmn2Ghz11gFreq[] = { 1101 1.1 alc { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1102 1.1 alc #define G1_2312_2372 0 1103 1.1 alc { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1104 1.1 alc #define G2_2312_2372 AFTER(G1_2312_2372) 1105 1.1 alc { 2312, 2372, 5, 6, 10, 5, NO_DFS, NO_PSCAN, 0}, 1106 1.1 alc #define G3_2312_2372 AFTER(G2_2312_2372) 1107 1.1 alc { 2312, 2372, 5, 6, 5, 5, NO_DFS, NO_PSCAN, 0}, 1108 1.1 alc #define G4_2312_2372 AFTER(G3_2312_2372) 1109 1.1 alc 1110 1.1 alc { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1111 1.1 alc #define G1_2412_2472 AFTER(G4_2312_2372) 1112 1.1 alc { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G, 0}, 1113 1.1 alc #define G2_2412_2472 AFTER(G1_2412_2472) 1114 1.1 alc { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1115 1.1 alc #define G3_2412_2472 AFTER(G2_2412_2472) 1116 1.1 alc { 2412, 2472, 5, 6, 10, 5, NO_DFS, NO_PSCAN, 0}, 1117 1.1 alc #define G4_2412_2472 AFTER(G3_2412_2472) 1118 1.1 alc { 2412, 2472, 5, 6, 5, 5, NO_DFS, NO_PSCAN, 0}, 1119 1.1 alc #define G5_2412_2472 AFTER(G4_2412_2472) 1120 1.1 alc 1121 1.1 alc { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1122 1.1 alc #define G1_2412_2462 AFTER(G5_2412_2472) 1123 1.1 alc { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G, 0}, 1124 1.1 alc #define G2_2412_2462 AFTER(G1_2412_2462) 1125 1.1 alc { 2412, 2462, 27, 6, 10, 5, NO_DFS, NO_PSCAN, 0}, 1126 1.1 alc #define G3_2412_2462 AFTER(G2_2412_2462) 1127 1.1 alc { 2412, 2462, 27, 6, 5, 5, NO_DFS, NO_PSCAN, 0}, 1128 1.1 alc #define G4_2412_2462 AFTER(G3_2412_2462) 1129 1.1 alc 1130 1.1 alc { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1131 1.1 alc #define G1_2432_2442 AFTER(G4_2412_2462) 1132 1.1 alc 1133 1.1 alc { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1134 1.1 alc #define G1_2457_2472 AFTER(G1_2432_2442) 1135 1.1 alc 1136 1.1 alc { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0}, 1137 1.1 alc #define G1_2512_2732 AFTER(G1_2457_2472) 1138 1.1 alc { 2512, 2732, 5, 6, 10, 5, NO_DFS, NO_PSCAN, 0}, 1139 1.1 alc #define G2_2512_2732 AFTER(G1_2512_2732) 1140 1.1 alc { 2512, 2732, 5, 6, 5, 5, NO_DFS, NO_PSCAN, 0}, 1141 1.1 alc #define G3_2512_2732 AFTER(G2_2512_2732) 1142 1.1 alc 1143 1.1 alc { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA, 0 }, 1144 1.1 alc #define G1_2467_2472 AFTER(G3_2512_2732) 1145 1.1 alc 1146 1.1 alc /* 1147 1.1 alc * WWR open up the power to 20dBm 1148 1.1 alc */ 1149 1.1 alc { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1150 1.1 alc #define WG1_2312_2372 AFTER(G1_2467_2472) 1151 1.1 alc { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1152 1.1 alc #define WG1_2412_2412 AFTER(WG1_2312_2372) 1153 1.1 alc { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1154 1.1 alc #define WG1_2417_2432 AFTER(WG1_2412_2412) 1155 1.1 alc { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1156 1.1 alc #define WG1_2437_2442 AFTER(WG1_2417_2432) 1157 1.1 alc { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1158 1.1 alc #define WG1_2447_2457 AFTER(WG1_2437_2442) 1159 1.1 alc { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0}, 1160 1.1 alc #define WG1_2462_2462 AFTER(WG1_2447_2457) 1161 1.1 alc { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0}, 1162 1.1 alc #define WG1_2467_2467 AFTER(WG1_2462_2462) 1163 1.1 alc { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0}, 1164 1.1 alc #define WG2_2467_2467 AFTER(WG1_2467_2467) 1165 1.1 alc { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0}, 1166 1.1 alc #define WG1_2472_2472 AFTER(WG2_2467_2467) 1167 1.1 alc { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0}, 1168 1.1 alc #define WG2_2472_2472 AFTER(WG1_2472_2472) 1169 1.1 alc 1170 1.1 alc /* 1171 1.1 alc * Mapping for 900MHz cards like Ubiquiti SR9 and XR9 1172 1.1 alc * and ZComax GZ-901. 1173 1.1 alc */ 1174 1.1 alc { 2422, 2437, 30, 0, 5, 5, NO_DFS, PSCAN_FCC, 0 }, 1175 1.1 alc #define S1_907_922_5 AFTER(WG2_2472_2472) 1176 1.1 alc { 2422, 2437, 30, 0, 10, 5, NO_DFS, PSCAN_FCC, 0 }, 1177 1.1 alc #define S1_907_922_10 AFTER(S1_907_922_5) 1178 1.1 alc { 2427, 2432, 30, 0, 20, 5, NO_DFS, PSCAN_FCC, 0 }, 1179 1.1 alc #define S1_912_917 AFTER(S1_907_922_10) 1180 1.1 alc { 2427, 2442, 30, 0, 5, 5, NO_DFS, PSCAN_FCC, 0 }, 1181 1.1 alc #define S2_907_922_5 AFTER(S1_912_917) 1182 1.1 alc { 2427, 2442, 30, 0, 10, 5, NO_DFS, PSCAN_FCC, 0 }, 1183 1.1 alc #define S2_907_922_10 AFTER(S2_907_922_5) 1184 1.1 alc { 2432, 2437, 30, 0, 20, 5, NO_DFS, PSCAN_FCC, 0 }, 1185 1.1 alc #define S2_912_917 AFTER(S2_907_922_10) 1186 1.1 alc { 2452, 2467, 30, 0, 5, 5, NO_DFS, PSCAN_FCC, 0 }, 1187 1.1 alc #define S1_908_923_5 AFTER(S2_912_917) 1188 1.1 alc { 2457, 2467, 30, 0, 10, 5, NO_DFS, PSCAN_FCC, 0 }, 1189 1.1 alc #define S1_913_918_10 AFTER(S1_908_923_5) 1190 1.1 alc { 2457, 2467, 30, 0, 20, 5, NO_DFS, PSCAN_FCC, 0 }, 1191 1.1 alc #define S1_913_918 AFTER(S1_913_918_10) 1192 1.1 alc }; 1193 1.1 alc 1194 1.1 alc /* 1195 1.1 alc * 2GHz Dynamic turbo tags 1196 1.1 alc */ 1197 1.1 alc static REG_DMN_FREQ_BAND regDmn2Ghz11gTurboFreq[] = { 1198 1.1 alc { 2312, 2372, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 1199 1.1 alc #define T1_2312_2372 0 1200 1.1 alc { 2437, 2437, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 1201 1.1 alc #define T1_2437_2437 AFTER(T1_2312_2372) 1202 1.1 alc { 2437, 2437, 20, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 1203 1.1 alc #define T2_2437_2437 AFTER(T1_2437_2437) 1204 1.1 alc { 2437, 2437, 18, 6, 40, 40, NO_DFS, PSCAN_WWR, 0}, 1205 1.1 alc #define T3_2437_2437 AFTER(T2_2437_2437) 1206 1.1 alc { 2512, 2732, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0}, 1207 1.1 alc #define T1_2512_2732 AFTER(T3_2437_2437) 1208 1.1 alc }; 1209 1.1 alc 1210 1.1 alc typedef struct regDomain { 1211 1.1 alc uint16_t regDmnEnum; /* value from EnumRd table */ 1212 1.1 alc uint8_t conformanceTestLimit; 1213 1.1 alc uint32_t flags; /* Requirement flags (AdHoc disallow, 1214 1.1 alc noise floor cal needed, etc) */ 1215 1.1 alc uint64_t dfsMask; /* DFS bitmask for 5Ghz tables */ 1216 1.1 alc uint64_t pscan; /* Bitmask for passive scan */ 1217 1.1 alc chanbmask_t chan11a; /* 11a channels */ 1218 1.1 alc chanbmask_t chan11a_turbo; /* 11a static turbo channels */ 1219 1.1 alc chanbmask_t chan11a_dyn_turbo; /* 11a dynamic turbo channels */ 1220 1.1 alc chanbmask_t chan11a_half; /* 11a 1/2 width channels */ 1221 1.1 alc chanbmask_t chan11a_quarter; /* 11a 1/4 width channels */ 1222 1.1 alc chanbmask_t chan11b; /* 11b channels */ 1223 1.1 alc chanbmask_t chan11g; /* 11g channels */ 1224 1.1 alc chanbmask_t chan11g_turbo; /* 11g dynamic turbo channels */ 1225 1.1 alc chanbmask_t chan11g_half; /* 11g 1/2 width channels */ 1226 1.1 alc chanbmask_t chan11g_quarter; /* 11g 1/4 width channels */ 1227 1.1 alc } REG_DOMAIN; 1228 1.1 alc 1229 1.1 alc static REG_DOMAIN regDomains[] = { 1230 1.1 alc 1231 1.1 alc {.regDmnEnum = DEBUG_REG_DMN, 1232 1.1 alc .conformanceTestLimit = FCC, 1233 1.1 alc .dfsMask = DFS_FCC3, 1234 1.1 alc .chan11a = BM3(F1_5120_5240, F1_5260_5700, F1_5745_5825), 1235 1.1 alc .chan11a_half = BM3(F2_5120_5240, F2_5260_5700, F7_5745_5825), 1236 1.1 alc .chan11a_quarter = BM3(F3_5120_5240, F3_5260_5700, F8_5745_5825), 1237 1.1 alc .chan11a_turbo = BM8(T1_5130_5210, 1238 1.1 alc T1_5250_5330, 1239 1.1 alc T1_5370_5490, 1240 1.1 alc T1_5530_5650, 1241 1.1 alc T1_5150_5190, 1242 1.1 alc T1_5230_5310, 1243 1.1 alc T1_5350_5470, 1244 1.1 alc T1_5510_5670), 1245 1.1 alc .chan11a_dyn_turbo = BM4(T1_5200_5240, 1246 1.1 alc T1_5280_5280, 1247 1.1 alc T1_5540_5660, 1248 1.1 alc T1_5765_5805), 1249 1.1 alc .chan11b = BM4(F1_2312_2372, 1250 1.1 alc F1_2412_2472, 1251 1.1 alc F1_2484_2484, 1252 1.1 alc F1_2512_2732), 1253 1.1 alc .chan11g = BM3(G1_2312_2372, G1_2412_2472, G1_2512_2732), 1254 1.1 alc .chan11g_turbo = BM3(T1_2312_2372, T1_2437_2437, T1_2512_2732), 1255 1.1 alc .chan11g_half = BM3(G2_2312_2372, G4_2412_2472, G2_2512_2732), 1256 1.1 alc .chan11g_quarter = BM3(G3_2312_2372, G5_2412_2472, G3_2512_2732), 1257 1.1 alc }, 1258 1.1 alc 1259 1.1 alc {.regDmnEnum = APL1, 1260 1.1 alc .conformanceTestLimit = FCC, 1261 1.1 alc .chan11a = BM1(F4_5745_5825), 1262 1.1 alc }, 1263 1.1 alc 1264 1.1 alc {.regDmnEnum = APL2, 1265 1.1 alc .conformanceTestLimit = FCC, 1266 1.1 alc .chan11a = BM1(F1_5745_5805), 1267 1.1 alc }, 1268 1.1 alc 1269 1.1 alc {.regDmnEnum = APL3, 1270 1.1 alc .conformanceTestLimit = FCC, 1271 1.1 alc .chan11a = BM2(F1_5280_5320, F2_5745_5805), 1272 1.1 alc }, 1273 1.1 alc 1274 1.1 alc {.regDmnEnum = APL4, 1275 1.1 alc .conformanceTestLimit = FCC, 1276 1.1 alc .chan11a = BM2(F4_5180_5240, F3_5745_5825), 1277 1.1 alc }, 1278 1.1 alc 1279 1.1 alc {.regDmnEnum = APL5, 1280 1.1 alc .conformanceTestLimit = FCC, 1281 1.1 alc .chan11a = BM1(F2_5745_5825), 1282 1.1 alc }, 1283 1.1 alc 1284 1.1 alc {.regDmnEnum = APL6, 1285 1.1 alc .conformanceTestLimit = ETSI, 1286 1.1 alc .dfsMask = DFS_ETSI, 1287 1.1 alc .pscan = PSCAN_FCC_T | PSCAN_FCC, 1288 1.1 alc .chan11a = BM3(F4_5180_5240, F2_5260_5320, F3_5745_5825), 1289 1.1 alc .chan11a_turbo = BM3(T2_5210_5210, T1_5250_5290, T1_5760_5800), 1290 1.1 alc }, 1291 1.1 alc 1292 1.1 alc {.regDmnEnum = APL8, 1293 1.1 alc .conformanceTestLimit = ETSI, 1294 1.1 alc .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 1295 1.1 alc .chan11a = BM2(F6_5260_5320, F4_5745_5825), 1296 1.1 alc }, 1297 1.1 alc 1298 1.1 alc {.regDmnEnum = APL9, 1299 1.1 alc .conformanceTestLimit = ETSI, 1300 1.1 alc .dfsMask = DFS_ETSI, 1301 1.1 alc .pscan = PSCAN_ETSI, 1302 1.1 alc .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 1303 1.1 alc .chan11a = BM3(F1_5180_5320, F1_5500_5620, F3_5745_5805), 1304 1.1 alc }, 1305 1.1 alc 1306 1.1 alc {.regDmnEnum = ETSI1, 1307 1.1 alc .conformanceTestLimit = ETSI, 1308 1.1 alc .dfsMask = DFS_ETSI, 1309 1.1 alc .pscan = PSCAN_ETSI, 1310 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1311 1.1 alc .chan11a = BM3(W2_5180_5240, F2_5260_5320, F2_5500_5700), 1312 1.1 alc }, 1313 1.1 alc 1314 1.1 alc {.regDmnEnum = ETSI2, 1315 1.1 alc .conformanceTestLimit = ETSI, 1316 1.1 alc .dfsMask = DFS_ETSI, 1317 1.1 alc .pscan = PSCAN_ETSI, 1318 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1319 1.1 alc .chan11a = BM1(F3_5180_5240), 1320 1.1 alc }, 1321 1.1 alc 1322 1.1 alc {.regDmnEnum = ETSI3, 1323 1.1 alc .conformanceTestLimit = ETSI, 1324 1.1 alc .dfsMask = DFS_ETSI, 1325 1.1 alc .pscan = PSCAN_ETSI, 1326 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1327 1.1 alc .chan11a = BM2(W2_5180_5240, F2_5260_5320), 1328 1.1 alc }, 1329 1.1 alc 1330 1.1 alc {.regDmnEnum = ETSI4, 1331 1.1 alc .conformanceTestLimit = ETSI, 1332 1.1 alc .dfsMask = DFS_ETSI, 1333 1.1 alc .pscan = PSCAN_ETSI, 1334 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1335 1.1 alc .chan11a = BM2(F3_5180_5240, F1_5260_5320), 1336 1.1 alc }, 1337 1.1 alc 1338 1.1 alc {.regDmnEnum = ETSI5, 1339 1.1 alc .conformanceTestLimit = ETSI, 1340 1.1 alc .dfsMask = DFS_ETSI, 1341 1.1 alc .pscan = PSCAN_ETSI, 1342 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1343 1.1 alc .chan11a = BM1(F1_5180_5240), 1344 1.1 alc }, 1345 1.1 alc 1346 1.1 alc {.regDmnEnum = ETSI6, 1347 1.1 alc .conformanceTestLimit = ETSI, 1348 1.1 alc .dfsMask = DFS_ETSI, 1349 1.1 alc .pscan = PSCAN_ETSI, 1350 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1351 1.1 alc .chan11a = BM3(F5_5180_5240, F1_5260_5280, F3_5500_5700), 1352 1.1 alc }, 1353 1.1 alc 1354 1.1 alc {.regDmnEnum = FCC1, 1355 1.1 alc .conformanceTestLimit = FCC, 1356 1.1 alc .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 1357 1.1 alc .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 1358 1.1 alc .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 1359 1.1 alc }, 1360 1.1 alc 1361 1.1 alc {.regDmnEnum = FCC2, 1362 1.1 alc .conformanceTestLimit = FCC, 1363 1.1 alc .chan11a = BM3(F6_5180_5240, F5_5260_5320, F6_5745_5825), 1364 1.1 alc .chan11a_dyn_turbo = BM3(T2_5200_5240, T1_5280_5280, T1_5765_5805), 1365 1.1 alc }, 1366 1.1 alc 1367 1.1 alc {.regDmnEnum = FCC3, 1368 1.1 alc .conformanceTestLimit = FCC, 1369 1.1 alc .dfsMask = DFS_FCC3, 1370 1.1 alc .pscan = PSCAN_FCC | PSCAN_FCC_T, 1371 1.1 alc .chan11a = BM4(F2_5180_5240, 1372 1.1 alc F3_5260_5320, 1373 1.1 alc F1_5500_5700, 1374 1.1 alc F5_5745_5825), 1375 1.1 alc .chan11a_turbo = BM4(T1_5210_5210, 1376 1.1 alc T1_5250_5250, 1377 1.1 alc T1_5290_5290, 1378 1.1 alc T2_5760_5800), 1379 1.1 alc .chan11a_dyn_turbo = BM3(T1_5200_5240, T2_5280_5280, T1_5540_5660), 1380 1.1 alc }, 1381 1.1 alc 1382 1.1 alc {.regDmnEnum = FCC4, 1383 1.1 alc .conformanceTestLimit = FCC, 1384 1.1 alc .dfsMask = DFS_FCC3, 1385 1.1 alc .pscan = PSCAN_FCC | PSCAN_FCC_T, 1386 1.1 alc .chan11a = BM1(F1_4950_4980), 1387 1.1 alc .chan11a_half = BM1(F1_4945_4985), 1388 1.1 alc .chan11a_quarter = BM1(F1_4942_4987), 1389 1.1 alc }, 1390 1.1 alc 1391 1.1 alc /* FCC1 w/ 1/2 and 1/4 width channels */ 1392 1.1 alc {.regDmnEnum = FCC5, 1393 1.1 alc .conformanceTestLimit = FCC, 1394 1.1 alc .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 1395 1.1 alc .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 1396 1.1 alc .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 1397 1.1 alc .chan11a_half = BM3(F7_5180_5240, F7_5260_5320, F9_5745_5825), 1398 1.1 alc .chan11a_quarter = BM3(F8_5180_5240, F8_5260_5320,F10_5745_5825), 1399 1.1 alc }, 1400 1.1 alc 1401 1.1 alc {.regDmnEnum = MKK1, 1402 1.1 alc .conformanceTestLimit = MKK, 1403 1.1 alc .pscan = PSCAN_MKK1, 1404 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1405 1.1 alc .chan11a = BM1(F1_5170_5230), 1406 1.1 alc }, 1407 1.1 alc 1408 1.1 alc {.regDmnEnum = MKK2, 1409 1.1 alc .conformanceTestLimit = MKK, 1410 1.1 alc .pscan = PSCAN_MKK2, 1411 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1412 1.1 alc .chan11a = BM3(F1_4920_4980, F1_5040_5080, F1_5170_5230), 1413 1.1 alc .chan11a_half = BM4(F1_4915_4925, 1414 1.1 alc F1_4935_4945, 1415 1.1 alc F1_5035_5040, 1416 1.1 alc F1_5055_5055), 1417 1.1 alc }, 1418 1.1 alc 1419 1.1 alc /* UNI-1 even */ 1420 1.1 alc {.regDmnEnum = MKK3, 1421 1.1 alc .conformanceTestLimit = MKK, 1422 1.1 alc .pscan = PSCAN_MKK3, 1423 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1424 1.1 alc .chan11a = BM1(F4_5180_5240), 1425 1.1 alc }, 1426 1.1 alc 1427 1.1 alc /* UNI-1 even + UNI-2 */ 1428 1.1 alc {.regDmnEnum = MKK4, 1429 1.1 alc .conformanceTestLimit = MKK, 1430 1.1 alc .dfsMask = DFS_MKK4, 1431 1.1 alc .pscan = PSCAN_MKK3, 1432 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1433 1.1 alc .chan11a = BM2(F4_5180_5240, F2_5260_5320), 1434 1.1 alc }, 1435 1.1 alc 1436 1.1 alc /* UNI-1 even + UNI-2 + mid-band */ 1437 1.1 alc {.regDmnEnum = MKK5, 1438 1.1 alc .conformanceTestLimit = MKK, 1439 1.1 alc .dfsMask = DFS_MKK4, 1440 1.1 alc .pscan = PSCAN_MKK3, 1441 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1442 1.1 alc .chan11a = BM3(F4_5180_5240, F2_5260_5320, F4_5500_5700), 1443 1.1 alc }, 1444 1.1 alc 1445 1.1 alc /* UNI-1 odd + even */ 1446 1.1 alc {.regDmnEnum = MKK6, 1447 1.1 alc .conformanceTestLimit = MKK, 1448 1.1 alc .pscan = PSCAN_MKK1, 1449 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1450 1.1 alc .chan11a = BM2(F2_5170_5230, F4_5180_5240), 1451 1.1 alc }, 1452 1.1 alc 1453 1.1 alc /* UNI-1 odd + UNI-1 even + UNI-2 */ 1454 1.1 alc {.regDmnEnum = MKK7, 1455 1.1 alc .conformanceTestLimit = MKK, 1456 1.1 alc .dfsMask = DFS_MKK4, 1457 1.1 alc .pscan = PSCAN_MKK1 | PSCAN_MKK3, 1458 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1459 1.1 alc .chan11a = BM3(F1_5170_5230, F4_5180_5240, F2_5260_5320), 1460 1.1 alc }, 1461 1.1 alc 1462 1.1 alc /* UNI-1 odd + UNI-1 even + UNI-2 + mid-band */ 1463 1.1 alc {.regDmnEnum = MKK8, 1464 1.1 alc .conformanceTestLimit = MKK, 1465 1.1 alc .dfsMask = DFS_MKK4, 1466 1.1 alc .pscan = PSCAN_MKK1 | PSCAN_MKK3, 1467 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1468 1.1 alc .chan11a = BM4(F1_5170_5230, 1469 1.1 alc F4_5180_5240, 1470 1.1 alc F2_5260_5320, 1471 1.1 alc F4_5500_5700), 1472 1.1 alc }, 1473 1.1 alc 1474 1.1 alc /* UNI-1 even + 4.9 GHZ */ 1475 1.1 alc {.regDmnEnum = MKK9, 1476 1.1 alc .conformanceTestLimit = MKK, 1477 1.1 alc .pscan = PSCAN_MKK3, 1478 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1479 1.1 alc .chan11a = BM7(F1_4915_4925, 1480 1.1 alc F1_4935_4945, 1481 1.1 alc F1_4920_4980, 1482 1.1 alc F1_5035_5040, 1483 1.1 alc F1_5055_5055, 1484 1.1 alc F1_5040_5080, 1485 1.1 alc F4_5180_5240), 1486 1.1 alc }, 1487 1.1 alc 1488 1.1 alc /* UNI-1 even + UNI-2 + 4.9 GHZ */ 1489 1.1 alc {.regDmnEnum = MKK10, 1490 1.1 alc .conformanceTestLimit = MKK, 1491 1.1 alc .dfsMask = DFS_MKK4, 1492 1.1 alc .pscan = PSCAN_MKK3, 1493 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1494 1.1 alc .chan11a = BM8(F1_4915_4925, 1495 1.1 alc F1_4935_4945, 1496 1.1 alc F1_4920_4980, 1497 1.1 alc F1_5035_5040, 1498 1.1 alc F1_5055_5055, 1499 1.1 alc F1_5040_5080, 1500 1.1 alc F4_5180_5240, 1501 1.1 alc F2_5260_5320), 1502 1.1 alc }, 1503 1.1 alc 1504 1.1 alc /* Defined here to use when 2G channels are authorised for country K2 */ 1505 1.1 alc {.regDmnEnum = APLD, 1506 1.1 alc .conformanceTestLimit = NO_CTL, 1507 1.1 alc .chan11b = BM2(F2_2312_2372,F2_2412_2472), 1508 1.1 alc .chan11g = BM2(G2_2312_2372,G2_2412_2472), 1509 1.1 alc }, 1510 1.1 alc 1511 1.1 alc {.regDmnEnum = ETSIA, 1512 1.1 alc .conformanceTestLimit = NO_CTL, 1513 1.1 alc .pscan = PSCAN_ETSIA, 1514 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1515 1.1 alc .chan11b = BM1(F1_2457_2472), 1516 1.1 alc .chan11g = BM1(G1_2457_2472), 1517 1.1 alc .chan11g_turbo = BM1(T2_2437_2437) 1518 1.1 alc }, 1519 1.1 alc 1520 1.1 alc {.regDmnEnum = ETSIB, 1521 1.1 alc .conformanceTestLimit = ETSI, 1522 1.1 alc .pscan = PSCAN_ETSIB, 1523 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1524 1.1 alc .chan11b = BM1(F1_2432_2442), 1525 1.1 alc .chan11g = BM1(G1_2432_2442), 1526 1.1 alc .chan11g_turbo = BM1(T2_2437_2437) 1527 1.1 alc }, 1528 1.1 alc 1529 1.1 alc {.regDmnEnum = ETSIC, 1530 1.1 alc .conformanceTestLimit = ETSI, 1531 1.1 alc .pscan = PSCAN_ETSIC, 1532 1.1 alc .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1533 1.1 alc .chan11b = BM1(F3_2412_2472), 1534 1.1 alc .chan11g = BM1(G3_2412_2472), 1535 1.1 alc .chan11g_turbo = BM1(T2_2437_2437) 1536 1.1 alc }, 1537 1.1 alc 1538 1.1 alc {.regDmnEnum = FCCA, 1539 1.1 alc .conformanceTestLimit = FCC, 1540 1.1 alc .chan11b = BM1(F1_2412_2462), 1541 1.1 alc .chan11g = BM1(G1_2412_2462), 1542 1.1 alc .chan11g_turbo = BM1(T2_2437_2437), 1543 1.1 alc }, 1544 1.1 alc 1545 1.1 alc /* FCCA w/ 1/2 and 1/4 width channels */ 1546 1.1 alc {.regDmnEnum = FCCB, 1547 1.1 alc .conformanceTestLimit = FCC, 1548 1.1 alc .chan11b = BM1(F1_2412_2462), 1549 1.1 alc .chan11g = BM1(G1_2412_2462), 1550 1.1 alc .chan11g_turbo = BM1(T2_2437_2437), 1551 1.1 alc .chan11g_half = BM1(G3_2412_2462), 1552 1.1 alc .chan11g_quarter = BM1(G4_2412_2462), 1553 1.1 alc }, 1554 1.1 alc 1555 1.1 alc {.regDmnEnum = MKKA, 1556 1.1 alc .conformanceTestLimit = MKK, 1557 1.1 alc .pscan = PSCAN_MKKA | PSCAN_MKKA_G 1558 1.1 alc | PSCAN_MKKA1 | PSCAN_MKKA1_G 1559 1.1 alc | PSCAN_MKKA2 | PSCAN_MKKA2_G, 1560 1.1 alc .flags = DISALLOW_ADHOC_11A_TURB, 1561 1.1 alc .chan11b = BM3(F2_2412_2462, F1_2467_2472, F2_2484_2484), 1562 1.1 alc .chan11g = BM2(G2_2412_2462, G1_2467_2472), 1563 1.1 alc .chan11g_turbo = BM1(T2_2437_2437) 1564 1.1 alc }, 1565 1.1 alc 1566 1.1 alc {.regDmnEnum = MKKC, 1567 1.1 alc .conformanceTestLimit = MKK, 1568 1.1 alc .chan11b = BM1(F2_2412_2472), 1569 1.1 alc .chan11g = BM1(G2_2412_2472), 1570 1.1 alc .chan11g_turbo = BM1(T2_2437_2437) 1571 1.1 alc }, 1572 1.1 alc 1573 1.1 alc {.regDmnEnum = WORLD, 1574 1.1 alc .conformanceTestLimit = ETSI, 1575 1.1 alc .chan11b = BM1(F2_2412_2472), 1576 1.1 alc .chan11g = BM1(G2_2412_2472), 1577 1.1 alc .chan11g_turbo = BM1(T2_2437_2437) 1578 1.1 alc }, 1579 1.1 alc 1580 1.1 alc {.regDmnEnum = WOR0_WORLD, 1581 1.1 alc .conformanceTestLimit = NO_CTL, 1582 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1583 1.1 alc .pscan = PSCAN_WWR, 1584 1.1 alc .flags = ADHOC_PER_11D, 1585 1.1 alc .chan11a = BM5(W1_5260_5320, 1586 1.1 alc W1_5180_5240, 1587 1.1 alc W1_5170_5230, 1588 1.1 alc W1_5745_5825, 1589 1.1 alc W1_5500_5700), 1590 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1591 1.1 alc WT1_5290_5290, 1592 1.1 alc WT1_5760_5800), 1593 1.1 alc .chan11b = BM8(W1_2412_2412, 1594 1.1 alc W1_2437_2442, 1595 1.1 alc W1_2462_2462, 1596 1.1 alc W1_2472_2472, 1597 1.1 alc W1_2417_2432, 1598 1.1 alc W1_2447_2457, 1599 1.1 alc W1_2467_2467, 1600 1.1 alc W1_2484_2484), 1601 1.1 alc .chan11g = BM7(WG1_2412_2412, 1602 1.1 alc WG1_2437_2442, 1603 1.1 alc WG1_2462_2462, 1604 1.1 alc WG1_2472_2472, 1605 1.1 alc WG1_2417_2432, 1606 1.1 alc WG1_2447_2457, 1607 1.1 alc WG1_2467_2467), 1608 1.1 alc .chan11g_turbo = BM1(T3_2437_2437) 1609 1.1 alc }, 1610 1.1 alc 1611 1.1 alc {.regDmnEnum = WOR01_WORLD, 1612 1.1 alc .conformanceTestLimit = NO_CTL, 1613 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1614 1.1 alc .pscan = PSCAN_WWR, 1615 1.1 alc .flags = ADHOC_PER_11D, 1616 1.1 alc .chan11a = BM5(W1_5260_5320, 1617 1.1 alc W1_5180_5240, 1618 1.1 alc W1_5170_5230, 1619 1.1 alc W1_5745_5825, 1620 1.1 alc W1_5500_5700), 1621 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1622 1.1 alc WT1_5290_5290, 1623 1.1 alc WT1_5760_5800), 1624 1.1 alc .chan11b = BM5(W1_2412_2412, 1625 1.1 alc W1_2437_2442, 1626 1.1 alc W1_2462_2462, 1627 1.1 alc W1_2417_2432, 1628 1.1 alc W1_2447_2457), 1629 1.1 alc .chan11g = BM5(WG1_2412_2412, 1630 1.1 alc WG1_2437_2442, 1631 1.1 alc WG1_2462_2462, 1632 1.1 alc WG1_2417_2432, 1633 1.1 alc WG1_2447_2457), 1634 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1635 1.1 alc 1636 1.1 alc {.regDmnEnum = WOR02_WORLD, 1637 1.1 alc .conformanceTestLimit = NO_CTL, 1638 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1639 1.1 alc .pscan = PSCAN_WWR, 1640 1.1 alc .flags = ADHOC_PER_11D, 1641 1.1 alc .chan11a = BM5(W1_5260_5320, 1642 1.1 alc W1_5180_5240, 1643 1.1 alc W1_5170_5230, 1644 1.1 alc W1_5745_5825, 1645 1.1 alc W1_5500_5700), 1646 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1647 1.1 alc WT1_5290_5290, 1648 1.1 alc WT1_5760_5800), 1649 1.1 alc .chan11b = BM7(W1_2412_2412, 1650 1.1 alc W1_2437_2442, 1651 1.1 alc W1_2462_2462, 1652 1.1 alc W1_2472_2472, 1653 1.1 alc W1_2417_2432, 1654 1.1 alc W1_2447_2457, 1655 1.1 alc W1_2467_2467), 1656 1.1 alc .chan11g = BM7(WG1_2412_2412, 1657 1.1 alc WG1_2437_2442, 1658 1.1 alc WG1_2462_2462, 1659 1.1 alc WG1_2472_2472, 1660 1.1 alc WG1_2417_2432, 1661 1.1 alc WG1_2447_2457, 1662 1.1 alc WG1_2467_2467), 1663 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1664 1.1 alc 1665 1.1 alc {.regDmnEnum = EU1_WORLD, 1666 1.1 alc .conformanceTestLimit = NO_CTL, 1667 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1668 1.1 alc .pscan = PSCAN_WWR, 1669 1.1 alc .flags = ADHOC_PER_11D, 1670 1.1 alc .chan11a = BM5(W1_5260_5320, 1671 1.1 alc W1_5180_5240, 1672 1.1 alc W1_5170_5230, 1673 1.1 alc W1_5745_5825, 1674 1.1 alc W1_5500_5700), 1675 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1676 1.1 alc WT1_5290_5290, 1677 1.1 alc WT1_5760_5800), 1678 1.1 alc .chan11b = BM7(W1_2412_2412, 1679 1.1 alc W1_2437_2442, 1680 1.1 alc W1_2462_2462, 1681 1.1 alc W2_2472_2472, 1682 1.1 alc W1_2417_2432, 1683 1.1 alc W1_2447_2457, 1684 1.1 alc W2_2467_2467), 1685 1.1 alc .chan11g = BM7(WG1_2412_2412, 1686 1.1 alc WG1_2437_2442, 1687 1.1 alc WG1_2462_2462, 1688 1.1 alc WG2_2472_2472, 1689 1.1 alc WG1_2417_2432, 1690 1.1 alc WG1_2447_2457, 1691 1.1 alc WG2_2467_2467), 1692 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1693 1.1 alc 1694 1.1 alc {.regDmnEnum = WOR1_WORLD, 1695 1.1 alc .conformanceTestLimit = NO_CTL, 1696 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1697 1.1 alc .pscan = PSCAN_WWR, 1698 1.1 alc .flags = ADHOC_NO_11A, 1699 1.1 alc .chan11a = BM5(W1_5260_5320, 1700 1.1 alc W1_5180_5240, 1701 1.1 alc W1_5170_5230, 1702 1.1 alc W1_5745_5825, 1703 1.1 alc W1_5500_5700), 1704 1.1 alc .chan11b = BM8(W1_2412_2412, 1705 1.1 alc W1_2437_2442, 1706 1.1 alc W1_2462_2462, 1707 1.1 alc W1_2472_2472, 1708 1.1 alc W1_2417_2432, 1709 1.1 alc W1_2447_2457, 1710 1.1 alc W1_2467_2467, 1711 1.1 alc W1_2484_2484), 1712 1.1 alc .chan11g = BM7(WG1_2412_2412, 1713 1.1 alc WG1_2437_2442, 1714 1.1 alc WG1_2462_2462, 1715 1.1 alc WG1_2472_2472, 1716 1.1 alc WG1_2417_2432, 1717 1.1 alc WG1_2447_2457, 1718 1.1 alc WG1_2467_2467), 1719 1.1 alc .chan11g_turbo = BM1(T3_2437_2437) 1720 1.1 alc }, 1721 1.1 alc 1722 1.1 alc {.regDmnEnum = WOR2_WORLD, 1723 1.1 alc .conformanceTestLimit = NO_CTL, 1724 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1725 1.1 alc .pscan = PSCAN_WWR, 1726 1.1 alc .flags = ADHOC_NO_11A, 1727 1.1 alc .chan11a = BM5(W1_5260_5320, 1728 1.1 alc W1_5180_5240, 1729 1.1 alc W1_5170_5230, 1730 1.1 alc W1_5745_5825, 1731 1.1 alc W1_5500_5700), 1732 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1733 1.1 alc WT1_5290_5290, 1734 1.1 alc WT1_5760_5800), 1735 1.1 alc .chan11b = BM8(W1_2412_2412, 1736 1.1 alc W1_2437_2442, 1737 1.1 alc W1_2462_2462, 1738 1.1 alc W1_2472_2472, 1739 1.1 alc W1_2417_2432, 1740 1.1 alc W1_2447_2457, 1741 1.1 alc W1_2467_2467, 1742 1.1 alc W1_2484_2484), 1743 1.1 alc .chan11g = BM7(WG1_2412_2412, 1744 1.1 alc WG1_2437_2442, 1745 1.1 alc WG1_2462_2462, 1746 1.1 alc WG1_2472_2472, 1747 1.1 alc WG1_2417_2432, 1748 1.1 alc WG1_2447_2457, 1749 1.1 alc WG1_2467_2467), 1750 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1751 1.1 alc 1752 1.1 alc {.regDmnEnum = WOR3_WORLD, 1753 1.1 alc .conformanceTestLimit = NO_CTL, 1754 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1755 1.1 alc .pscan = PSCAN_WWR, 1756 1.1 alc .flags = ADHOC_PER_11D, 1757 1.1 alc .chan11a = BM4(W1_5260_5320, 1758 1.1 alc W1_5180_5240, 1759 1.1 alc W1_5170_5230, 1760 1.1 alc W1_5745_5825), 1761 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1762 1.1 alc WT1_5290_5290, 1763 1.1 alc WT1_5760_5800), 1764 1.1 alc .chan11b = BM7(W1_2412_2412, 1765 1.1 alc W1_2437_2442, 1766 1.1 alc W1_2462_2462, 1767 1.1 alc W1_2472_2472, 1768 1.1 alc W1_2417_2432, 1769 1.1 alc W1_2447_2457, 1770 1.1 alc W1_2467_2467), 1771 1.1 alc .chan11g = BM7(WG1_2412_2412, 1772 1.1 alc WG1_2437_2442, 1773 1.1 alc WG1_2462_2462, 1774 1.1 alc WG1_2472_2472, 1775 1.1 alc WG1_2417_2432, 1776 1.1 alc WG1_2447_2457, 1777 1.1 alc WG1_2467_2467), 1778 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1779 1.1 alc 1780 1.1 alc {.regDmnEnum = WOR4_WORLD, 1781 1.1 alc .conformanceTestLimit = NO_CTL, 1782 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1783 1.1 alc .pscan = PSCAN_WWR, 1784 1.1 alc .flags = ADHOC_NO_11A, 1785 1.1 alc .chan11a = BM4(W2_5260_5320, 1786 1.1 alc W2_5180_5240, 1787 1.1 alc F2_5745_5805, 1788 1.1 alc W2_5825_5825), 1789 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1790 1.1 alc WT1_5290_5290, 1791 1.1 alc WT1_5760_5800), 1792 1.1 alc .chan11b = BM5(W1_2412_2412, 1793 1.1 alc W1_2437_2442, 1794 1.1 alc W1_2462_2462, 1795 1.1 alc W1_2417_2432, 1796 1.1 alc W1_2447_2457), 1797 1.1 alc .chan11g = BM5(WG1_2412_2412, 1798 1.1 alc WG1_2437_2442, 1799 1.1 alc WG1_2462_2462, 1800 1.1 alc WG1_2417_2432, 1801 1.1 alc WG1_2447_2457), 1802 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1803 1.1 alc 1804 1.1 alc {.regDmnEnum = WOR5_ETSIC, 1805 1.1 alc .conformanceTestLimit = NO_CTL, 1806 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1807 1.1 alc .pscan = PSCAN_WWR, 1808 1.1 alc .flags = ADHOC_NO_11A, 1809 1.1 alc .chan11a = BM3(W1_5260_5320, W2_5180_5240, F6_5745_5825), 1810 1.1 alc .chan11b = BM7(W1_2412_2412, 1811 1.1 alc W1_2437_2442, 1812 1.1 alc W1_2462_2462, 1813 1.1 alc W2_2472_2472, 1814 1.1 alc W1_2417_2432, 1815 1.1 alc W1_2447_2457, 1816 1.1 alc W2_2467_2467), 1817 1.1 alc .chan11g = BM7(WG1_2412_2412, 1818 1.1 alc WG1_2437_2442, 1819 1.1 alc WG1_2462_2462, 1820 1.1 alc WG2_2472_2472, 1821 1.1 alc WG1_2417_2432, 1822 1.1 alc WG1_2447_2457, 1823 1.1 alc WG2_2467_2467), 1824 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1825 1.1 alc 1826 1.1 alc {.regDmnEnum = WOR9_WORLD, 1827 1.1 alc .conformanceTestLimit = NO_CTL, 1828 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1829 1.1 alc .pscan = PSCAN_WWR, 1830 1.1 alc .flags = ADHOC_NO_11A, 1831 1.1 alc .chan11a = BM4(W1_5260_5320, 1832 1.1 alc W1_5180_5240, 1833 1.1 alc W1_5745_5825, 1834 1.1 alc W1_5500_5700), 1835 1.1 alc .chan11a_turbo = BM3(WT1_5210_5250, 1836 1.1 alc WT1_5290_5290, 1837 1.1 alc WT1_5760_5800), 1838 1.1 alc .chan11b = BM5(W1_2412_2412, 1839 1.1 alc W1_2437_2442, 1840 1.1 alc W1_2462_2462, 1841 1.1 alc W1_2417_2432, 1842 1.1 alc W1_2447_2457), 1843 1.1 alc .chan11g = BM5(WG1_2412_2412, 1844 1.1 alc WG1_2437_2442, 1845 1.1 alc WG1_2462_2462, 1846 1.1 alc WG1_2417_2432, 1847 1.1 alc WG1_2447_2457), 1848 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1849 1.1 alc 1850 1.1 alc {.regDmnEnum = WORA_WORLD, 1851 1.1 alc .conformanceTestLimit = NO_CTL, 1852 1.1 alc .dfsMask = DFS_FCC3 | DFS_ETSI, 1853 1.1 alc .pscan = PSCAN_WWR, 1854 1.1 alc .flags = ADHOC_NO_11A, 1855 1.1 alc .chan11a = BM4(W1_5260_5320, 1856 1.1 alc W1_5180_5240, 1857 1.1 alc W1_5745_5825, 1858 1.1 alc W1_5500_5700), 1859 1.1 alc .chan11b = BM7(W1_2412_2412, 1860 1.1 alc W1_2437_2442, 1861 1.1 alc W1_2462_2462, 1862 1.1 alc W1_2472_2472, 1863 1.1 alc W1_2417_2432, 1864 1.1 alc W1_2447_2457, 1865 1.1 alc W1_2467_2467), 1866 1.1 alc .chan11g = BM7(WG1_2412_2412, 1867 1.1 alc WG1_2437_2442, 1868 1.1 alc WG1_2462_2462, 1869 1.1 alc WG1_2472_2472, 1870 1.1 alc WG1_2417_2432, 1871 1.1 alc WG1_2447_2457, 1872 1.1 alc WG1_2467_2467), 1873 1.1 alc .chan11g_turbo = BM1(T3_2437_2437)}, 1874 1.1 alc 1875 1.1 alc {.regDmnEnum = SR9_WORLD, 1876 1.1 alc .conformanceTestLimit = NO_CTL, 1877 1.1 alc .pscan = PSCAN_FCC | PSCAN_FCC_T, 1878 1.1 alc .chan11g = BM1(S1_912_917), 1879 1.1 alc .chan11g_half = BM1(S1_907_922_10), 1880 1.1 alc .chan11g_quarter = BM1(S1_907_922_5), 1881 1.1 alc }, 1882 1.1 alc 1883 1.1 alc {.regDmnEnum = XR9_WORLD, 1884 1.1 alc .conformanceTestLimit = NO_CTL, 1885 1.1 alc .pscan = PSCAN_FCC | PSCAN_FCC_T, 1886 1.1 alc .chan11g = BM1(S2_912_917), 1887 1.1 alc .chan11g_half = BM1(S2_907_922_10), 1888 1.1 alc .chan11g_quarter = BM1(S2_907_922_5), 1889 1.1 alc }, 1890 1.1 alc 1891 1.1 alc {.regDmnEnum = GZ901_WORLD, 1892 1.1 alc .conformanceTestLimit = NO_CTL, 1893 1.1 alc .pscan = PSCAN_FCC | PSCAN_FCC_T, 1894 1.1 alc .chan11g = BM1(S1_913_918), 1895 1.1 alc .chan11g_half = BM1(S1_913_918_10), 1896 1.1 alc .chan11g_quarter = BM1(S1_908_923_5), 1897 1.1 alc }, 1898 1.1 alc 1899 1.1 alc {.regDmnEnum = NULL1, 1900 1.1 alc .conformanceTestLimit = NO_CTL, 1901 1.1 alc } 1902 1.1 alc }; 1903 1.1 alc 1904 1.1 alc struct cmode { 1905 1.1 alc u_int mode; 1906 1.1 alc u_int flags; 1907 1.1 alc }; 1908 1.1 alc 1909 1.1 alc static const struct cmode modes[] = { 1910 1.1 alc { HAL_MODE_TURBO, CHANNEL_ST}, /* NB: 11a Static Turbo */ 1911 1.1 alc { HAL_MODE_11A, CHANNEL_A}, 1912 1.1 alc { HAL_MODE_11B, CHANNEL_B}, 1913 1.1 alc { HAL_MODE_11G, CHANNEL_G}, 1914 1.1 alc { HAL_MODE_11G_TURBO, CHANNEL_108G}, 1915 1.1 alc { HAL_MODE_11A_TURBO, CHANNEL_108A}, 1916 1.1 alc { HAL_MODE_11A_QUARTER_RATE, CHANNEL_A | CHANNEL_QUARTER}, 1917 1.1 alc { HAL_MODE_11A_HALF_RATE, CHANNEL_A | CHANNEL_HALF}, 1918 1.1 alc { HAL_MODE_11G_QUARTER_RATE, CHANNEL_G | CHANNEL_QUARTER}, 1919 1.1 alc { HAL_MODE_11G_HALF_RATE, CHANNEL_G | CHANNEL_HALF}, 1920 1.1 alc { HAL_MODE_11NG_HT20, CHANNEL_G_HT20}, 1921 1.1 alc { HAL_MODE_11NG_HT40PLUS, CHANNEL_G_HT40PLUS}, 1922 1.1 alc { HAL_MODE_11NG_HT40MINUS, CHANNEL_G_HT40MINUS}, 1923 1.1 alc { HAL_MODE_11NA_HT20, CHANNEL_A_HT20}, 1924 1.1 alc { HAL_MODE_11NA_HT40PLUS, CHANNEL_A_HT40PLUS}, 1925 1.1 alc { HAL_MODE_11NA_HT40MINUS, CHANNEL_A_HT40MINUS}, 1926 1.1 alc }; 1927 1.1 alc 1928 1.1 alc static int 1929 1.1 alc chansort(const void *a, const void *b) 1930 1.1 alc { 1931 1.1 alc #define CHAN_FLAGS (CHANNEL_ALL|CHANNEL_HALF|CHANNEL_QUARTER) 1932 1.1 alc const HAL_CHANNEL_INTERNAL *ca = a; 1933 1.1 alc const HAL_CHANNEL_INTERNAL *cb = b; 1934 1.1 alc 1935 1.1 alc return (ca->channel == cb->channel) ? 1936 1.1 alc (ca->channelFlags & CHAN_FLAGS) - 1937 1.1 alc (cb->channelFlags & CHAN_FLAGS) : 1938 1.1 alc ca->channel - cb->channel; 1939 1.1 alc #undef CHAN_FLAGS 1940 1.1 alc } 1941 1.1 alc typedef int ath_hal_cmp_t(const void *, const void *); 1942 1.1 alc static void ath_hal_sort(void *a, size_t n, size_t es, ath_hal_cmp_t *cmp); 1943 1.1 alc static COUNTRY_CODE_TO_ENUM_RD* findCountry(HAL_CTRY_CODE countryCode); 1944 1.1 alc static HAL_BOOL getWmRD(struct ath_hal *ah, COUNTRY_CODE_TO_ENUM_RD *country, uint16_t channelFlag, REG_DOMAIN *rd); 1945 1.1 alc 1946 1.1 alc 1947 1.1 alc static uint16_t 1948 1.1 alc getEepromRD(struct ath_hal *ah) 1949 1.1 alc { 1950 1.1 alc return AH_PRIVATE(ah)->ah_currentRD &~ WORLDWIDE_ROAMING_FLAG; 1951 1.1 alc } 1952 1.1 alc 1953 1.1 alc /* 1954 1.1 alc * Test to see if the bitmask array is all zeros 1955 1.1 alc */ 1956 1.1 alc static HAL_BOOL 1957 1.1 alc isChanBitMaskZero(const uint64_t *bitmask) 1958 1.1 alc { 1959 1.1 alc #if BMLEN > 2 1960 1.1 alc #error "add more cases" 1961 1.1 alc #endif 1962 1.1 alc #if BMLEN > 1 1963 1.1 alc if (bitmask[1] != 0) 1964 1.1 alc return AH_FALSE; 1965 1.1 alc #endif 1966 1.1 alc return (bitmask[0] == 0); 1967 1.1 alc } 1968 1.1 alc 1969 1.1 alc /* 1970 1.1 alc * Return whether or not the regulatory domain/country in EEPROM 1971 1.1 alc * is acceptable. 1972 1.1 alc */ 1973 1.1 alc static HAL_BOOL 1974 1.1 alc isEepromValid(struct ath_hal *ah) 1975 1.1 alc { 1976 1.1 alc uint16_t rd = getEepromRD(ah); 1977 1.1 alc int i; 1978 1.1 alc 1979 1.1 alc if (rd & COUNTRY_ERD_FLAG) { 1980 1.1 alc uint16_t cc = rd &~ COUNTRY_ERD_FLAG; 1981 1.1 alc for (i = 0; i < N(allCountries); i++) 1982 1.1 alc if (allCountries[i].countryCode == cc) 1983 1.1 alc return AH_TRUE; 1984 1.1 alc } else { 1985 1.1 alc for (i = 0; i < N(regDomainPairs); i++) 1986 1.1 alc if (regDomainPairs[i].regDmnEnum == rd) 1987 1.1 alc return AH_TRUE; 1988 1.1 alc } 1989 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1990 1.1 alc "%s: invalid regulatory domain/country code 0x%x\n", __func__, rd); 1991 1.1 alc return AH_FALSE; 1992 1.1 alc } 1993 1.1 alc 1994 1.1 alc /* 1995 1.1 alc * Returns whether or not the specified country code 1996 1.1 alc * is allowed by the EEPROM setting 1997 1.1 alc */ 1998 1.1 alc static HAL_BOOL 1999 1.1 alc isCountryCodeValid(struct ath_hal *ah, HAL_CTRY_CODE cc) 2000 1.1 alc { 2001 1.1 alc uint16_t rd; 2002 1.1 alc 2003 1.1 alc /* Default setting requires no checks */ 2004 1.1 alc if (cc == CTRY_DEFAULT) 2005 1.1 alc return AH_TRUE; 2006 1.1 alc #ifdef AH_DEBUG_COUNTRY 2007 1.1 alc if (cc == CTRY_DEBUG) 2008 1.1 alc return AH_TRUE; 2009 1.1 alc #endif 2010 1.1 alc rd = getEepromRD(ah); 2011 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: EEPROM regdomain 0x%x\n", 2012 1.1 alc __func__, rd); 2013 1.1 alc 2014 1.1 alc if (rd & COUNTRY_ERD_FLAG) { 2015 1.1 alc /* EEP setting is a country - config shall match */ 2016 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2017 1.1 alc "%s: EEPROM setting is country code %u\n", __func__, 2018 1.1 alc rd &~ COUNTRY_ERD_FLAG); 2019 1.1 alc return (cc == (rd & ~COUNTRY_ERD_FLAG)); 2020 1.1 alc } else if (rd == DEBUG_REG_DMN || rd == NO_ENUMRD) { 2021 1.1 alc /* Set to Debug or AllowAnyCountry mode - allow any setting */ 2022 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: rd %d allowed\n", 2023 1.1 alc __func__, rd); 2024 1.1 alc return AH_TRUE; 2025 1.1 alc #ifdef AH_SUPPORT_11D 2026 1.1 alc } else if ((rd & WORLD_SKU_MASK) == WORLD_SKU_PREFIX) { 2027 1.1 alc int i; 2028 1.1 alc for (i=0; i < N(allCountries); i++) { 2029 1.1 alc if (cc == allCountries[i].countryCode) 2030 1.1 alc return AH_TRUE; 2031 1.1 alc } 2032 1.1 alc #endif 2033 1.1 alc } else { 2034 1.1 alc int i; 2035 1.1 alc for (i = 0; i < N(allCountries); i++) { 2036 1.1 alc if (cc == allCountries[i].countryCode && 2037 1.1 alc allCountries[i].regDmnEnum == rd) 2038 1.1 alc return AH_TRUE; 2039 1.1 alc } 2040 1.1 alc } 2041 1.1 alc return AH_FALSE; 2042 1.1 alc } 2043 1.1 alc 2044 1.1 alc /* 2045 1.1 alc * Return the mask of available modes based on the hardware 2046 1.1 alc * capabilities and the specified country code and reg domain. 2047 1.1 alc */ 2048 1.1 alc static u_int 2049 1.1 alc ath_hal_getwmodesnreg(struct ath_hal *ah, 2050 1.1 alc const COUNTRY_CODE_TO_ENUM_RD *country, const REG_DOMAIN *rd5GHz) 2051 1.1 alc { 2052 1.1 alc #define HAL_MODE_11G_ALL \ 2053 1.1 alc (HAL_MODE_11G | HAL_MODE_11G_TURBO | HAL_MODE_11G_QUARTER_RATE | \ 2054 1.1 alc HAL_MODE_11G_HALF_RATE) 2055 1.1 alc #define HAL_MODE_11A_ALL \ 2056 1.1 alc (HAL_MODE_11A | HAL_MODE_11A_TURBO | HAL_MODE_TURBO | \ 2057 1.1 alc HAL_MODE_11A_QUARTER_RATE | HAL_MODE_11A_HALF_RATE) 2058 1.1 alc u_int modesAvail; 2059 1.1 alc 2060 1.1 alc /* Get modes that HW is capable of */ 2061 1.1 alc modesAvail = ath_hal_getWirelessModes(ah); 2062 1.1 alc 2063 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2064 1.1 alc "%s: wireless modes 0x%x cc %u rd %u\n", 2065 1.1 alc __func__, modesAvail, country->countryCode, country->regDmnEnum); 2066 1.1 alc 2067 1.1 alc /* Check country regulations for allowed modes */ 2068 1.1 alc if (!country->allow11g && (modesAvail & HAL_MODE_11G_ALL)) { 2069 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2070 1.1 alc "%s: disallow all 11g\n", __func__); 2071 1.1 alc modesAvail &= ~HAL_MODE_11G_ALL; 2072 1.1 alc } 2073 1.1 alc if (isChanBitMaskZero(rd5GHz->chan11a) && 2074 1.1 alc (modesAvail & HAL_MODE_11A_ALL)) { 2075 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2076 1.1 alc "%s: disallow all 11a\n", __func__); 2077 1.1 alc modesAvail &= ~HAL_MODE_11A_ALL; 2078 1.1 alc } 2079 1.1 alc if ((modesAvail & (HAL_MODE_11A_TURBO | HAL_MODE_TURBO)) && 2080 1.1 alc !country->allow11aTurbo) { 2081 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2082 1.1 alc "%s: disallow 11aTurbo\n", __func__); 2083 1.1 alc modesAvail &= ~(HAL_MODE_11A_TURBO | HAL_MODE_TURBO); 2084 1.1 alc } 2085 1.1 alc if ((modesAvail & HAL_MODE_11G_TURBO) && !country->allow11gTurbo) { 2086 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2087 1.1 alc "%s: disallow 11gTurbo\n", __func__); 2088 1.1 alc modesAvail &= ~HAL_MODE_11G_TURBO; 2089 1.1 alc } 2090 1.1 alc 2091 1.1 alc /* Check 11n operation */ 2092 1.1 alc if ((modesAvail & HAL_MODE_11NG_HT20) && !country->allow11ng20) { 2093 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2094 1.1 alc "%s: disallow 11g HT20\n", __func__); 2095 1.1 alc modesAvail &= ~HAL_MODE_11NG_HT20; 2096 1.1 alc } 2097 1.1 alc if ((modesAvail & HAL_MODE_11NA_HT20) && !country->allow11na20) { 2098 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2099 1.1 alc "%s: disallow 11a HT20\n", __func__); 2100 1.1 alc modesAvail &= ~HAL_MODE_11NA_HT20; 2101 1.1 alc } 2102 1.1 alc if ((modesAvail & HAL_MODE_11NG_HT40PLUS) && !country->allow11ng40) { 2103 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2104 1.1 alc "%s: disallow 11g HT40+\n", __func__); 2105 1.1 alc modesAvail &= ~HAL_MODE_11NG_HT40PLUS; 2106 1.1 alc } 2107 1.1 alc if ((modesAvail & HAL_MODE_11NG_HT40MINUS) && !country->allow11ng40) { 2108 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2109 1.1 alc "%s: disallow 11g HT40-\n", __func__); 2110 1.1 alc modesAvail &= ~HAL_MODE_11NG_HT40MINUS; 2111 1.1 alc } 2112 1.1 alc if ((modesAvail & HAL_MODE_11NA_HT40PLUS) && !country->allow11na40) { 2113 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2114 1.1 alc "%s: disallow 11a HT40+\n", __func__); 2115 1.1 alc modesAvail &= ~HAL_MODE_11NA_HT40PLUS; 2116 1.1 alc } 2117 1.1 alc if ((modesAvail & HAL_MODE_11NA_HT40MINUS) && !country->allow11na40) { 2118 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2119 1.1 alc "%s: disallow 11a HT40-\n", __func__); 2120 1.1 alc modesAvail &= ~HAL_MODE_11NA_HT40MINUS; 2121 1.1 alc } 2122 1.1 alc 2123 1.1 alc return modesAvail; 2124 1.1 alc #undef HAL_MODE_11A_ALL 2125 1.1 alc #undef HAL_MODE_11G_ALL 2126 1.1 alc } 2127 1.1 alc 2128 1.1 alc /* 2129 1.1 alc * Return the mask of available modes based on the hardware 2130 1.1 alc * capabilities and the specified country code. 2131 1.1 alc */ 2132 1.1 alc 2133 1.1 alc u_int 2134 1.1 alc ath_hal_getwirelessmodes(struct ath_hal *ah, HAL_CTRY_CODE cc) 2135 1.1 alc { 2136 1.1 alc COUNTRY_CODE_TO_ENUM_RD *country = AH_NULL; 2137 1.1 alc u_int mode = 0; 2138 1.1 alc REG_DOMAIN rd; 2139 1.1 alc 2140 1.1 alc country = findCountry(cc); 2141 1.1 alc if (country != AH_NULL) { 2142 1.1 alc if (getWmRD(ah, country, ~CHANNEL_2GHZ, &rd)) 2143 1.1 alc mode = ath_hal_getwmodesnreg(ah, country, &rd); 2144 1.1 alc } 2145 1.1 alc return mode; 2146 1.1 alc } 2147 1.1 alc 2148 1.1 alc /* 2149 1.1 alc * Return if device is public safety. 2150 1.1 alc */ 2151 1.1 alc HAL_BOOL 2152 1.1 alc ath_hal_ispublicsafetysku(struct ath_hal *ah) 2153 1.1 alc { 2154 1.1 alc uint16_t rd = getEepromRD(ah); 2155 1.1 alc 2156 1.1 alc switch (rd) { 2157 1.1 alc case FCC4_FCCA: 2158 1.1 alc case CTRY_UNITED_STATES_FCC49 | COUNTRY_ERD_FLAG: 2159 1.1 alc return AH_TRUE; 2160 1.1 alc case DEBUG_REG_DMN: 2161 1.1 alc case NO_ENUMRD: 2162 1.1 alc if (AH_PRIVATE(ah)->ah_countryCode == CTRY_UNITED_STATES_FCC49) 2163 1.1 alc return AH_TRUE; 2164 1.1 alc break; 2165 1.1 alc } 2166 1.1 alc return AH_FALSE; 2167 1.1 alc } 2168 1.1 alc 2169 1.1 alc /* 2170 1.1 alc * Return if device is actually operating in 900 MHz band. 2171 1.1 alc */ 2172 1.1 alc HAL_BOOL 2173 1.1 alc ath_hal_isgsmsku(struct ath_hal *ah) 2174 1.1 alc { 2175 1.1 alc uint16_t rd = getEepromRD(ah); 2176 1.1 alc 2177 1.1 alc switch (rd) { 2178 1.1 alc case SR9_WORLD: 2179 1.1 alc case XR9_WORLD: 2180 1.1 alc case GZ901_WORLD: 2181 1.1 alc case CTRY_SR9 | COUNTRY_ERD_FLAG: 2182 1.1 alc case CTRY_XR9 | COUNTRY_ERD_FLAG: 2183 1.1 alc case CTRY_GZ901 | COUNTRY_ERD_FLAG: 2184 1.1 alc return AH_TRUE; 2185 1.1 alc case DEBUG_REG_DMN: 2186 1.1 alc case NO_ENUMRD: 2187 1.1 alc return AH_PRIVATE(ah)->ah_countryCode == CTRY_SR9 2188 1.1 alc || AH_PRIVATE(ah)->ah_countryCode == CTRY_XR9 2189 1.1 alc || AH_PRIVATE(ah)->ah_countryCode == CTRY_GZ901 2190 1.1 alc ; 2191 1.1 alc } 2192 1.1 alc return AH_FALSE; 2193 1.1 alc } 2194 1.1 alc 2195 1.1 alc /* 2196 1.1 alc * Find the pointer to the country element in the country table 2197 1.1 alc * corresponding to the country code 2198 1.1 alc */ 2199 1.1 alc static COUNTRY_CODE_TO_ENUM_RD* 2200 1.1 alc findCountry(HAL_CTRY_CODE countryCode) 2201 1.1 alc { 2202 1.1 alc int i; 2203 1.1 alc 2204 1.1 alc for (i = 0; i < N(allCountries); i++) { 2205 1.1 alc if (allCountries[i].countryCode == countryCode) 2206 1.1 alc return &allCountries[i]; 2207 1.1 alc } 2208 1.1 alc return AH_NULL; /* Not found */ 2209 1.1 alc } 2210 1.1 alc 2211 1.1 alc /* 2212 1.1 alc * Calculate a default country based on the EEPROM setting. 2213 1.1 alc */ 2214 1.1 alc static HAL_CTRY_CODE 2215 1.1 alc getDefaultCountry(struct ath_hal *ah) 2216 1.1 alc { 2217 1.1 alc uint16_t rd; 2218 1.1 alc int i; 2219 1.1 alc 2220 1.1 alc rd = getEepromRD(ah); 2221 1.1 alc if (rd & COUNTRY_ERD_FLAG) { 2222 1.1 alc COUNTRY_CODE_TO_ENUM_RD *country = AH_NULL; 2223 1.1 alc uint16_t cc = rd & ~COUNTRY_ERD_FLAG; 2224 1.1 alc 2225 1.1 alc country = findCountry(cc); 2226 1.1 alc if (country != AH_NULL) 2227 1.1 alc return cc; 2228 1.1 alc } 2229 1.1 alc /* 2230 1.1 alc * Check reg domains that have only one country 2231 1.1 alc */ 2232 1.1 alc for (i = 0; i < N(regDomainPairs); i++) 2233 1.1 alc if (regDomainPairs[i].regDmnEnum == rd) { 2234 1.1 alc if (regDomainPairs[i].singleCC != 0) 2235 1.1 alc return regDomainPairs[i].singleCC; 2236 1.1 alc else 2237 1.1 alc i = N(regDomainPairs); 2238 1.1 alc } 2239 1.1 alc return CTRY_DEFAULT; 2240 1.1 alc } 2241 1.1 alc 2242 1.1 alc static HAL_BOOL 2243 1.1 alc isValidRegDmn(int regDmn, REG_DOMAIN *rd) 2244 1.1 alc { 2245 1.1 alc int i; 2246 1.1 alc 2247 1.1 alc for (i = 0; i < N(regDomains); i++) { 2248 1.1 alc if (regDomains[i].regDmnEnum == regDmn) { 2249 1.1 alc if (rd != AH_NULL) { 2250 1.1 alc OS_MEMCPY(rd, ®Domains[i], 2251 1.1 alc sizeof(REG_DOMAIN)); 2252 1.1 alc } 2253 1.1 alc return AH_TRUE; 2254 1.1 alc } 2255 1.1 alc } 2256 1.1 alc return AH_FALSE; 2257 1.1 alc } 2258 1.1 alc 2259 1.1 alc static HAL_BOOL 2260 1.1 alc isValidRegDmnPair(int regDmnPair) 2261 1.1 alc { 2262 1.1 alc int i; 2263 1.1 alc 2264 1.1 alc if (regDmnPair == NO_ENUMRD) 2265 1.1 alc return AH_FALSE; 2266 1.1 alc for (i = 0; i < N(regDomainPairs); i++) { 2267 1.1 alc if (regDomainPairs[i].regDmnEnum == regDmnPair) 2268 1.1 alc return AH_TRUE; 2269 1.1 alc } 2270 1.1 alc return AH_FALSE; 2271 1.1 alc } 2272 1.1 alc 2273 1.1 alc /* 2274 1.1 alc * Return the Wireless Mode Regulatory Domain based 2275 1.1 alc * on the country code and the wireless mode. 2276 1.1 alc */ 2277 1.1 alc static HAL_BOOL 2278 1.1 alc getWmRD(struct ath_hal *ah, COUNTRY_CODE_TO_ENUM_RD *country, 2279 1.1 alc uint16_t channelFlag, REG_DOMAIN *rd) 2280 1.1 alc { 2281 1.1 alc int regDmn; 2282 1.1 alc REG_DMN_PAIR_MAPPING *regPair; 2283 1.1 alc uint64_t flags; 2284 1.1 alc 2285 1.1 alc if (country->countryCode == CTRY_DEFAULT) { 2286 1.1 alc uint16_t rdnum = getEepromRD(ah); 2287 1.1 alc 2288 1.1 alc if ((rdnum & COUNTRY_ERD_FLAG) == 0) { 2289 1.1 alc if (isValidRegDmn(rdnum, AH_NULL) || 2290 1.1 alc isValidRegDmnPair(rdnum)) 2291 1.1 alc regDmn = rdnum; 2292 1.1 alc else 2293 1.1 alc regDmn = country->regDmnEnum; 2294 1.1 alc } else 2295 1.1 alc regDmn = country->regDmnEnum; 2296 1.1 alc } else 2297 1.1 alc regDmn = country->regDmnEnum; 2298 1.1 alc regPair = AH_NULL; 2299 1.1 alc flags = NO_REQ; 2300 1.1 alc if ((regDmn & MULTI_DOMAIN_MASK) == 0) { 2301 1.1 alc int i; 2302 1.1 alc 2303 1.1 alc for (i = 0; i < N(regDomainPairs); i++) { 2304 1.1 alc if (regDomainPairs[i].regDmnEnum == regDmn) { 2305 1.1 alc regPair = ®DomainPairs[i]; 2306 1.1 alc break; 2307 1.1 alc } 2308 1.1 alc } 2309 1.1 alc if (regPair == AH_NULL) { 2310 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2311 1.1 alc "%s: Failed to find reg domain pair %u\n", 2312 1.1 alc __func__, regDmn); 2313 1.1 alc return AH_FALSE; 2314 1.1 alc } 2315 1.1 alc if (channelFlag & CHANNEL_2GHZ) { 2316 1.1 alc regDmn = regPair->regDmn2GHz; 2317 1.1 alc flags = regPair->flags2GHz; 2318 1.1 alc } else { 2319 1.1 alc regDmn = regPair->regDmn5GHz; 2320 1.1 alc flags = regPair->flags5GHz; 2321 1.1 alc } 2322 1.1 alc } 2323 1.1 alc 2324 1.1 alc /* 2325 1.1 alc * We either started with a unitary reg domain or we've found the 2326 1.1 alc * unitary reg domain of the pair 2327 1.1 alc */ 2328 1.1 alc if (isValidRegDmn(regDmn, rd)) { 2329 1.1 alc if (regPair != AH_NULL) 2330 1.1 alc rd->pscan &= regPair->pscanMask; 2331 1.1 alc if ((country->regDmnEnum & MULTI_DOMAIN_MASK) == 0 && 2332 1.1 alc flags != NO_REQ) 2333 1.1 alc rd->flags = flags; 2334 1.1 alc return AH_TRUE; 2335 1.1 alc } else { 2336 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2337 1.1 alc "%s: Failed to find unitary reg domain %u\n", __func__, 2338 1.1 alc country->regDmnEnum); 2339 1.1 alc return AH_FALSE; 2340 1.1 alc } 2341 1.1 alc } 2342 1.1 alc 2343 1.1 alc static HAL_BOOL 2344 1.1 alc IS_BIT_SET(int bit, const uint64_t bitmask[]) 2345 1.1 alc { 2346 1.1 alc int byteOffset, bitnum; 2347 1.1 alc uint64_t val; 2348 1.1 alc 2349 1.1 alc byteOffset = bit/64; 2350 1.1 alc bitnum = bit - byteOffset*64; 2351 1.1 alc val = ((uint64_t) 1) << bitnum; 2352 1.1 alc return (bitmask[byteOffset] & val) != 0; 2353 1.1 alc } 2354 1.1 alc 2355 1.1 alc /* Add given regclassid into regclassids array upto max of maxregids */ 2356 1.1 alc static void 2357 1.1 alc ath_add_regclassid(uint8_t *regclassids, u_int maxregids, 2358 1.1 alc u_int *nregids, uint8_t regclassid) 2359 1.1 alc { 2360 1.1 alc int i; 2361 1.1 alc 2362 1.1 alc /* Is regclassid valid? */ 2363 1.1 alc if (regclassid == 0) 2364 1.1 alc return; 2365 1.1 alc 2366 1.1 alc for (i = 0; i < maxregids; i++) { 2367 1.1 alc if (regclassids[i] == regclassid) /* already present */ 2368 1.1 alc return; 2369 1.1 alc if (regclassids[i] == 0) { /* free slot */ 2370 1.1 alc regclassids[i] = regclassid; 2371 1.1 alc (*nregids)++; 2372 1.1 alc return; 2373 1.1 alc } 2374 1.1 alc } 2375 1.1 alc } 2376 1.1 alc 2377 1.1 alc /* 2378 1.1 alc * Setup the channel list based on the information in the EEPROM and 2379 1.1 alc * any supplied country code. Note that we also do a bunch of EEPROM 2380 1.1 alc * verification here and setup certain regulatory-related access 2381 1.1 alc * control data used later on. 2382 1.1 alc */ 2383 1.1 alc 2384 1.1 alc HAL_BOOL 2385 1.1 alc ath_hal_init_channels(struct ath_hal *ah, 2386 1.1 alc HAL_CHANNEL *chans, u_int maxchans, u_int *nchans, 2387 1.1 alc uint8_t *regclassids, u_int maxregids, u_int *nregids, 2388 1.1 alc HAL_CTRY_CODE cc, u_int modeSelect, 2389 1.1 alc HAL_BOOL enableOutdoor, HAL_BOOL enableExtendedChannels) 2390 1.1 alc { 2391 1.1 alc #define CHANNEL_HALF_BW 10 2392 1.1 alc #define CHANNEL_QUARTER_BW 5 2393 1.1 alc u_int modesAvail; 2394 1.1 alc uint16_t maxChan; 2395 1.1 alc COUNTRY_CODE_TO_ENUM_RD *country = AH_NULL; 2396 1.1 alc REG_DOMAIN rd5GHz, rd2GHz; 2397 1.1 alc const struct cmode *cm; 2398 1.1 alc HAL_CHANNEL_INTERNAL *ichans = &AH_PRIVATE(ah)->ah_channels[0]; 2399 1.1 alc int next, b; 2400 1.1 alc uint8_t ctl; 2401 1.1 alc 2402 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u mode 0x%x%s%s\n", 2403 1.1 alc __func__, cc, modeSelect, enableOutdoor? " Enable outdoor" : " ", 2404 1.1 alc enableExtendedChannels ? " Enable ecm" : ""); 2405 1.1 alc 2406 1.1 alc /* 2407 1.1 alc * Validate the EEPROM setting and setup defaults 2408 1.1 alc */ 2409 1.1 alc if (!isEepromValid(ah)) { 2410 1.1 alc /* 2411 1.1 alc * Don't return any channels if the EEPROM has an 2412 1.1 alc * invalid regulatory domain/country code setting. 2413 1.1 alc */ 2414 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2415 1.1 alc "%s: invalid EEPROM contents\n",__func__); 2416 1.1 alc return AH_FALSE; 2417 1.1 alc } 2418 1.1 alc 2419 1.1 alc AH_PRIVATE(ah)->ah_countryCode = getDefaultCountry(ah); 2420 1.1 alc 2421 1.1 alc #ifndef AH_SUPPORT_11D 2422 1.1 alc if (AH_PRIVATE(ah)->ah_countryCode == CTRY_DEFAULT) { 2423 1.1 alc #endif 2424 1.1 alc /* 2425 1.1 alc * We now have enough state to validate any country code 2426 1.1 alc * passed in by the caller. 2427 1.1 alc */ 2428 1.1 alc if (!isCountryCodeValid(ah, cc)) { 2429 1.1 alc /* NB: Atheros silently ignores invalid country codes */ 2430 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2431 1.1 alc "%s: invalid country code %d\n", __func__, cc); 2432 1.1 alc return AH_FALSE; 2433 1.1 alc } 2434 1.1 alc AH_PRIVATE(ah)->ah_countryCode = cc & COUNTRY_CODE_MASK; 2435 1.1 alc #ifndef AH_SUPPORT_11D 2436 1.1 alc } 2437 1.1 alc #endif 2438 1.1 alc 2439 1.1 alc /* Get pointers to the country element and the reg domain elements */ 2440 1.1 alc country = findCountry(AH_PRIVATE(ah)->ah_countryCode); 2441 1.1 alc 2442 1.1 alc if (country == AH_NULL) { 2443 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "NULL Country!, cc= %d\n", 2444 1.1 alc AH_PRIVATE(ah)->ah_countryCode); 2445 1.1 alc return AH_FALSE; 2446 1.1 alc } 2447 1.1 alc 2448 1.1 alc if (!getWmRD(ah, country, ~CHANNEL_2GHZ, &rd5GHz)) { 2449 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2450 1.1 alc "%s: no unitary 5GHz regdomain for country %u\n", 2451 1.1 alc __func__, AH_PRIVATE(ah)->ah_countryCode); 2452 1.1 alc return AH_FALSE; 2453 1.1 alc } 2454 1.1 alc if (!getWmRD(ah, country, CHANNEL_2GHZ, &rd2GHz)) { 2455 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2456 1.1 alc "%s: no unitary 2GHz regdomain for country %u\n", 2457 1.1 alc __func__, AH_PRIVATE(ah)->ah_countryCode); 2458 1.1 alc return AH_FALSE; 2459 1.1 alc } 2460 1.1 alc 2461 1.1 alc modesAvail = ath_hal_getwmodesnreg(ah, country, &rd5GHz); 2462 1.1 alc maxChan = !enableOutdoor ? country->outdoorChanStart : 7000; 2463 1.1 alc 2464 1.1 alc if (maxchans > N(AH_PRIVATE(ah)->ah_channels)) 2465 1.1 alc maxchans = N(AH_PRIVATE(ah)->ah_channels); 2466 1.1 alc next = 0; 2467 1.1 alc for (cm = modes; cm < &modes[N(modes)]; cm++) { 2468 1.1 alc uint16_t c, c_hi, c_lo; 2469 1.1 alc uint64_t *channelBM = AH_NULL; 2470 1.1 alc REG_DOMAIN *rd = AH_NULL; 2471 1.1 alc REG_DMN_FREQ_BAND *fband = AH_NULL,*freqs; 2472 1.1 alc int low_adj, hi_adj, channelSep, lastc; 2473 1.1 alc 2474 1.1 alc if ((cm->mode & modeSelect) == 0) { 2475 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2476 1.1 alc "%s: skip mode 0x%x flags 0x%x\n", 2477 1.1 alc __func__, cm->mode, cm->flags); 2478 1.1 alc continue; 2479 1.1 alc } 2480 1.1 alc if ((cm->mode & modesAvail) == 0) { 2481 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2482 1.1 alc "%s: !avail mode 0x%x (0x%x) flags 0x%x\n", 2483 1.1 alc __func__, modesAvail, cm->mode, cm->flags); 2484 1.1 alc continue; 2485 1.1 alc } 2486 1.1 alc if (!ath_hal_getChannelEdges(ah, cm->flags, &c_lo, &c_hi)) { 2487 1.1 alc /* channel not supported by hardware, skip it */ 2488 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2489 1.1 alc "%s: channels 0x%x not supported by hardware\n", 2490 1.1 alc __func__,cm->flags); 2491 1.1 alc continue; 2492 1.1 alc } 2493 1.1 alc switch (cm->mode) { 2494 1.1 alc case HAL_MODE_TURBO: 2495 1.1 alc rd = &rd5GHz; 2496 1.1 alc channelBM = rd->chan11a_turbo; 2497 1.1 alc freqs = ®Dmn5GhzTurboFreq[0]; 2498 1.1 alc ctl = rd->conformanceTestLimit | CTL_TURBO; 2499 1.1 alc break; 2500 1.1 alc case HAL_MODE_11A: 2501 1.1 alc case HAL_MODE_11A_HALF_RATE: 2502 1.1 alc case HAL_MODE_11A_QUARTER_RATE: 2503 1.1 alc case HAL_MODE_11NA_HT20: 2504 1.1 alc case HAL_MODE_11NA_HT40PLUS: 2505 1.1 alc case HAL_MODE_11NA_HT40MINUS: 2506 1.1 alc rd = &rd5GHz; 2507 1.1 alc if (cm->mode == HAL_MODE_11A_HALF_RATE) 2508 1.1 alc channelBM = rd->chan11a_half; 2509 1.1 alc else if (cm->mode == HAL_MODE_11A_QUARTER_RATE) 2510 1.1 alc channelBM = rd->chan11a_quarter; 2511 1.1 alc else 2512 1.1 alc channelBM = rd->chan11a; 2513 1.1 alc freqs = ®Dmn5GhzFreq[0]; 2514 1.1 alc ctl = rd->conformanceTestLimit; 2515 1.1 alc break; 2516 1.1 alc case HAL_MODE_11B: 2517 1.1 alc rd = &rd2GHz; 2518 1.1 alc channelBM = rd->chan11b; 2519 1.1 alc freqs = ®Dmn2GhzFreq[0]; 2520 1.1 alc ctl = rd->conformanceTestLimit | CTL_11B; 2521 1.1 alc break; 2522 1.1 alc case HAL_MODE_11G: 2523 1.1 alc case HAL_MODE_11G_HALF_RATE: 2524 1.1 alc case HAL_MODE_11G_QUARTER_RATE: 2525 1.1 alc case HAL_MODE_11NG_HT20: 2526 1.1 alc case HAL_MODE_11NG_HT40PLUS: 2527 1.1 alc case HAL_MODE_11NG_HT40MINUS: 2528 1.1 alc rd = &rd2GHz; 2529 1.1 alc if (cm->mode == HAL_MODE_11G_HALF_RATE) 2530 1.1 alc channelBM = rd->chan11g_half; 2531 1.1 alc else if (cm->mode == HAL_MODE_11G_QUARTER_RATE) 2532 1.1 alc channelBM = rd->chan11g_quarter; 2533 1.1 alc else 2534 1.1 alc channelBM = rd->chan11g; 2535 1.1 alc freqs = ®Dmn2Ghz11gFreq[0]; 2536 1.1 alc ctl = rd->conformanceTestLimit | CTL_11G; 2537 1.1 alc break; 2538 1.1 alc case HAL_MODE_11G_TURBO: 2539 1.1 alc rd = &rd2GHz; 2540 1.1 alc channelBM = rd->chan11g_turbo; 2541 1.1 alc freqs = ®Dmn2Ghz11gTurboFreq[0]; 2542 1.1 alc ctl = rd->conformanceTestLimit | CTL_108G; 2543 1.1 alc break; 2544 1.1 alc case HAL_MODE_11A_TURBO: 2545 1.1 alc rd = &rd5GHz; 2546 1.1 alc channelBM = rd->chan11a_dyn_turbo; 2547 1.1 alc freqs = ®Dmn5GhzTurboFreq[0]; 2548 1.1 alc ctl = rd->conformanceTestLimit | CTL_108G; 2549 1.1 alc break; 2550 1.1 alc default: 2551 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2552 1.1 alc "%s: Unkonwn HAL mode 0x%x\n", __func__, cm->mode); 2553 1.1 alc continue; 2554 1.1 alc } 2555 1.1 alc if (isChanBitMaskZero(channelBM)) 2556 1.1 alc continue; 2557 1.1 alc /* 2558 1.1 alc * Setup special handling for HT40 channels; e.g. 2559 1.1 alc * 5G HT40 channels require 40Mhz channel separation. 2560 1.1 alc */ 2561 1.1 alc hi_adj = (cm->mode == HAL_MODE_11NA_HT40PLUS || 2562 1.1 alc cm->mode == HAL_MODE_11NG_HT40PLUS) ? -20 : 0; 2563 1.1 alc low_adj = (cm->mode == HAL_MODE_11NA_HT40MINUS || 2564 1.1 alc cm->mode == HAL_MODE_11NG_HT40MINUS) ? 20 : 0; 2565 1.1 alc channelSep = (cm->mode == HAL_MODE_11NA_HT40PLUS || 2566 1.1 alc cm->mode == HAL_MODE_11NA_HT40MINUS) ? 40 : 0; 2567 1.1 alc 2568 1.1 alc for (b = 0; b < 64*BMLEN; b++) { 2569 1.1 alc if (!IS_BIT_SET(b, channelBM)) 2570 1.1 alc continue; 2571 1.1 alc fband = &freqs[b]; 2572 1.1 alc lastc = 0; 2573 1.1 alc 2574 1.1 alc ath_add_regclassid(regclassids, maxregids, 2575 1.1 alc nregids, fband->regClassId); 2576 1.1 alc 2577 1.1 alc for (c = fband->lowChannel + low_adj; 2578 1.1 alc c <= fband->highChannel + hi_adj; 2579 1.1 alc c += fband->channelSep) { 2580 1.1 alc HAL_CHANNEL_INTERNAL icv; 2581 1.1 alc 2582 1.1 alc if (!(c_lo <= c && c <= c_hi)) { 2583 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2584 1.1 alc "%s: c %u out of range [%u..%u]\n", 2585 1.1 alc __func__, c, c_lo, c_hi); 2586 1.1 alc continue; 2587 1.1 alc } 2588 1.1 alc if (((c+fband->channelSep)/2) > (maxChan+HALF_MAXCHANBW)) { 2589 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2590 1.1 alc "%s: c %u > maxChan %u\n", 2591 1.1 alc __func__, c, maxChan); 2592 1.1 alc continue; 2593 1.1 alc } 2594 1.1 alc if (next >= maxchans){ 2595 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2596 1.1 alc "%s: too many channels for channel table\n", 2597 1.1 alc __func__); 2598 1.1 alc goto done; 2599 1.1 alc } 2600 1.1 alc if ((fband->usePassScan & IS_ECM_CHAN) && 2601 1.1 alc !enableExtendedChannels) { 2602 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2603 1.1 alc "Skipping ecm channel\n"); 2604 1.1 alc continue; 2605 1.1 alc } 2606 1.1 alc /* XXX needs to be in ath_hal_checkchannel */ 2607 1.1 alc if ((rd->flags & NO_HOSTAP) && 2608 1.1 alc (AH_PRIVATE(ah)->ah_opmode == HAL_M_HOSTAP)) { 2609 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2610 1.1 alc "Skipping HOSTAP channel\n"); 2611 1.1 alc continue; 2612 1.1 alc } 2613 1.1 alc /* 2614 1.1 alc * Make sure that channel separation 2615 1.1 alc * meets the requirement. 2616 1.1 alc */ 2617 1.1 alc if (lastc && channelSep && 2618 1.1 alc (c-lastc) < channelSep) 2619 1.1 alc continue; 2620 1.1 alc 2621 1.1 alc OS_MEMZERO(&icv, sizeof(icv)); 2622 1.1 alc icv.channel = c; 2623 1.1 alc icv.channelFlags = cm->flags; 2624 1.1 alc icv.maxRegTxPower = fband->powerDfs; 2625 1.1 alc icv.antennaMax = fband->antennaMax; 2626 1.1 alc icv.regDmnFlags = rd->flags; 2627 1.1 alc icv.conformanceTestLimit = ctl; 2628 1.1 alc if (fband->usePassScan & rd->pscan) 2629 1.1 alc icv.channelFlags |= CHANNEL_PASSIVE; 2630 1.1 alc else 2631 1.1 alc icv.channelFlags &= ~CHANNEL_PASSIVE; 2632 1.1 alc lastc = c; 2633 1.1 alc if (fband->useDfs & rd->dfsMask) { 2634 1.1 alc /* DFS and HT40 don't mix */ 2635 1.1 alc if (cm->mode == HAL_MODE_11NA_HT40PLUS || 2636 1.1 alc cm->mode == HAL_MODE_11NA_HT40MINUS) 2637 1.1 alc continue; 2638 1.1 alc icv.privFlags = CHANNEL_DFS; 2639 1.1 alc } else 2640 1.1 alc icv.privFlags = 0; 2641 1.1 alc if (rd->flags & LIMIT_FRAME_4MS) 2642 1.1 alc icv.privFlags |= CHANNEL_4MS_LIMIT; 2643 1.1 alc 2644 1.1 alc ichans[next++] = icv; 2645 1.1 alc } 2646 1.1 alc } 2647 1.1 alc } 2648 1.1 alc done: 2649 1.1 alc if (next != 0) { 2650 1.1 alc int i; 2651 1.1 alc 2652 1.1 alc /* XXX maxchans set above so this cannot happen? */ 2653 1.1 alc if (next > N(AH_PRIVATE(ah)->ah_channels)) { 2654 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2655 1.1 alc "%s: too many channels %u; truncating to %u\n", 2656 1.1 alc __func__, next, 2657 1.1 alc (int) N(AH_PRIVATE(ah)->ah_channels)); 2658 1.1 alc next = N(AH_PRIVATE(ah)->ah_channels); 2659 1.1 alc } 2660 1.1 alc 2661 1.1 alc /* 2662 1.1 alc * Keep a private copy of the channel list so we can 2663 1.1 alc * constrain future requests to only these channels 2664 1.1 alc */ 2665 1.1 alc ath_hal_sort(ichans, next, sizeof(HAL_CHANNEL_INTERNAL), 2666 1.1 alc chansort); 2667 1.1 alc AH_PRIVATE(ah)->ah_nchan = next; 2668 1.1 alc 2669 1.1 alc /* 2670 1.1 alc * Copy the channel list to the public channel list 2671 1.1 alc */ 2672 1.1 alc for (i = 0; i < next; i++) { 2673 1.1 alc chans[i].channel = ichans[i].channel; 2674 1.1 alc chans[i].channelFlags = ichans[i].channelFlags; 2675 1.1 alc chans[i].privFlags = ichans[i].privFlags; 2676 1.1 alc chans[i].maxRegTxPower = ichans[i].maxRegTxPower; 2677 1.1 alc } 2678 1.1 alc /* 2679 1.1 alc * Retrieve power limits. 2680 1.1 alc */ 2681 1.1 alc ath_hal_getpowerlimits(ah, chans, next); 2682 1.1 alc for (i = 0; i < next; i++) { 2683 1.1 alc ichans[i].maxTxPower = chans[i].maxTxPower; 2684 1.1 alc ichans[i].minTxPower = chans[i].minTxPower; 2685 1.1 alc } 2686 1.1 alc } 2687 1.1 alc *nchans = next; 2688 1.1 alc /* XXX copy private setting to public area */ 2689 1.1 alc ah->ah_countryCode = AH_PRIVATE(ah)->ah_countryCode; 2690 1.1 alc return (next != 0); 2691 1.1 alc #undef CHANNEL_HALF_BW 2692 1.1 alc #undef CHANNEL_QUARTER_BW 2693 1.1 alc } 2694 1.1 alc 2695 1.1 alc /* 2696 1.1 alc * Return whether or not the specified channel is ok to use 2697 1.1 alc * based on the current regulatory domain constraints and 2698 1.1 alc * DFS interference. 2699 1.1 alc */ 2700 1.1 alc HAL_CHANNEL_INTERNAL * 2701 1.1 alc ath_hal_checkchannel(struct ath_hal *ah, const HAL_CHANNEL *c) 2702 1.1 alc { 2703 1.1 alc #define CHAN_FLAGS (CHANNEL_ALL|CHANNEL_HALF|CHANNEL_QUARTER) 2704 1.1 alc HAL_CHANNEL_INTERNAL *base, *cc; 2705 1.1 alc /* NB: be wary of user-specified channel flags */ 2706 1.1 alc int flags = c->channelFlags & CHAN_FLAGS; 2707 1.1 alc int n, lim, d; 2708 1.1 alc 2709 1.1 alc /* 2710 1.1 alc * Check current channel to avoid the lookup. 2711 1.1 alc */ 2712 1.1 alc cc = AH_PRIVATE(ah)->ah_curchan; 2713 1.1 alc if (cc != AH_NULL && cc->channel == c->channel && 2714 1.1 alc (cc->channelFlags & CHAN_FLAGS) == flags) { 2715 1.1 alc if ((cc->privFlags & CHANNEL_INTERFERENCE) && 2716 1.1 alc (cc->channelFlags & CHANNEL_DFS)) 2717 1.1 alc return AH_NULL; 2718 1.1 alc else 2719 1.1 alc return cc; 2720 1.1 alc } 2721 1.1 alc 2722 1.1 alc /* binary search based on known sorting order */ 2723 1.1 alc base = AH_PRIVATE(ah)->ah_channels; 2724 1.1 alc n = AH_PRIVATE(ah)->ah_nchan; 2725 1.1 alc /* binary search based on known sorting order */ 2726 1.1 alc for (lim = n; lim != 0; lim >>= 1) { 2727 1.1 alc cc = &base[lim>>1]; 2728 1.1 alc d = c->channel - cc->channel; 2729 1.1 alc if (d == 0) { 2730 1.1 alc if ((cc->channelFlags & CHAN_FLAGS) == flags) { 2731 1.1 alc if ((cc->privFlags & CHANNEL_INTERFERENCE) && 2732 1.1 alc (cc->channelFlags & CHANNEL_DFS)) 2733 1.1 alc return AH_NULL; 2734 1.1 alc else 2735 1.1 alc return cc; 2736 1.1 alc } 2737 1.1 alc d = flags - (cc->channelFlags & CHAN_FLAGS); 2738 1.1 alc } 2739 1.1 alc if (d > 0) { 2740 1.1 alc base = cc + 1; 2741 1.1 alc lim--; 2742 1.1 alc } 2743 1.1 alc } 2744 1.1 alc HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: no match for %u/0x%x\n", 2745 1.1 alc __func__, c->channel, c->channelFlags); 2746 1.1 alc return AH_NULL; 2747 1.1 alc #undef CHAN_FLAGS 2748 1.1 alc } 2749 1.1 alc 2750 1.1 alc /* 2751 1.1 alc * Return the max allowed antenna gain and apply any regulatory 2752 1.1 alc * domain specific changes. 2753 1.1 alc * 2754 1.1 alc * NOTE: a negative reduction is possible in RD's that only 2755 1.1 alc * measure radiated power (e.g., ETSI) which would increase 2756 1.1 alc * that actual conducted output power (though never beyond 2757 1.1 alc * the calibrated target power). 2758 1.1 alc */ 2759 1.1 alc u_int 2760 1.1 alc ath_hal_getantennareduction(struct ath_hal *ah, HAL_CHANNEL *chan, u_int twiceGain) 2761 1.1 alc { 2762 1.1 alc HAL_CHANNEL_INTERNAL *ichan=AH_NULL; 2763 1.1 alc int8_t antennaMax; 2764 1.1 alc 2765 1.1 alc if ((ichan = ath_hal_checkchannel(ah, chan)) != AH_NULL) { 2766 1.1 alc antennaMax = twiceGain - ichan->antennaMax*2; 2767 1.1 alc return (antennaMax < 0) ? 0 : antennaMax; 2768 1.1 alc } else { 2769 1.1 alc /* Failed to find the correct index - may be a debug channel */ 2770 1.1 alc return 0; 2771 1.1 alc } 2772 1.1 alc } 2773 1.1 alc 2774 1.1 alc 2775 1.1 alc /* XXX - maybe move ctl decision into channel set area or 2776 1.1 alc into the tables so no decision is needed in the code */ 2777 1.1 alc 2778 1.1 alc #define isWwrSKU(_ah) \ 2779 1.1 alc ((getEepromRD((_ah)) & WORLD_SKU_MASK) == WORLD_SKU_PREFIX || \ 2780 1.1 alc getEepromRD(_ah) == WORLD) 2781 1.1 alc 2782 1.1 alc 2783 1.1 alc /* 2784 1.1 alc * Return the test group from the specified channel from 2785 1.1 alc * the regulatory table. 2786 1.1 alc * 2787 1.1 alc * TODO: CTL for 11B CommonMode when regulatory domain is unknown 2788 1.1 alc */ 2789 1.1 alc u_int 2790 1.1 alc ath_hal_getctl(struct ath_hal *ah, HAL_CHANNEL *chan) 2791 1.1 alc { 2792 1.1 alc u_int ctl = NO_CTL; 2793 1.1 alc HAL_CHANNEL_INTERNAL *ichan; 2794 1.1 alc 2795 1.1 alc /* Special CTL to signify WWR SKU without a known country */ 2796 1.1 alc if (AH_PRIVATE(ah)->ah_countryCode == CTRY_DEFAULT && isWwrSKU(ah)) { 2797 1.1 alc if (IS_CHAN_B(chan)) { 2798 1.1 alc ctl = SD_NO_CTL | CTL_11B; 2799 1.1 alc } else if (IS_CHAN_G(chan)) { 2800 1.1 alc ctl = SD_NO_CTL | CTL_11G; 2801 1.1 alc } else if (IS_CHAN_108G(chan)) { 2802 1.1 alc ctl = SD_NO_CTL | CTL_108G; 2803 1.1 alc } else if (IS_CHAN_T(chan)) { 2804 1.1 alc ctl = SD_NO_CTL | CTL_TURBO; 2805 1.1 alc } else { 2806 1.1 alc ctl = SD_NO_CTL | CTL_11A; 2807 1.1 alc } 2808 1.1 alc } else { 2809 1.1 alc if ((ichan = ath_hal_checkchannel(ah, chan)) != AH_NULL) { 2810 1.1 alc ctl = ichan->conformanceTestLimit; 2811 1.1 alc /* limit 11G OFDM power */ 2812 1.1 alc if (IS_CHAN_PUREG(chan) && 2813 1.1 alc (ctl & CTL_MODE_M) == CTL_11B) 2814 1.1 alc ctl = (ctl &~ CTL_MODE_M) | CTL_11G; 2815 1.1 alc } 2816 1.1 alc } 2817 1.1 alc return ctl; 2818 1.1 alc } 2819 1.1 alc 2820 1.1 alc /* 2821 1.1 alc * Return whether or not a noise floor check is required in 2822 1.1 alc * the current regulatory domain for the specified channel. 2823 1.1 alc */ 2824 1.1 alc HAL_BOOL 2825 1.1 alc ath_hal_getnfcheckrequired(struct ath_hal *ah, HAL_CHANNEL *chan) 2826 1.1 alc { 2827 1.1 alc HAL_CHANNEL_INTERNAL *ichan; 2828 1.1 alc 2829 1.1 alc if ((ichan = ath_hal_checkchannel(ah, chan)) != AH_NULL) 2830 1.1 alc return ((ichan->regDmnFlags & NEED_NFC) ? AH_TRUE : AH_FALSE); 2831 1.1 alc return AH_FALSE; 2832 1.1 alc } 2833 1.1 alc 2834 1.1 alc /* 2835 1.1 alc * Insertion sort. 2836 1.1 alc */ 2837 1.1 alc #define swap(_a, _b, _size) { \ 2838 1.1 alc uint8_t *s = _b; \ 2839 1.1 alc int i = _size; \ 2840 1.1 alc do { \ 2841 1.1 alc uint8_t tmp = *_a; \ 2842 1.1 alc *_a++ = *s; \ 2843 1.1 alc *s++ = tmp; \ 2844 1.1 alc } while (--i); \ 2845 1.1 alc _a -= _size; \ 2846 1.1 alc } 2847 1.1 alc 2848 1.1 alc static void 2849 1.1 alc ath_hal_sort(void *a, size_t n, size_t size, ath_hal_cmp_t *cmp) 2850 1.1 alc { 2851 1.1 alc uint8_t *aa = a; 2852 1.1 alc uint8_t *ai, *t; 2853 1.1 alc 2854 1.1 alc for (ai = aa+size; --n >= 1; ai += size) 2855 1.1 alc for (t = ai; t > aa; t -= size) { 2856 1.1 alc uint8_t *u = t - size; 2857 1.1 alc if (cmp(u, t) <= 0) 2858 1.1 alc break; 2859 1.1 alc swap(u, t, size); 2860 1.1 alc } 2861 1.1 alc } 2862