ah_regdomain.c revision 188213
1/* 2 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting 3 * Copyright (c) 2005-2006 Atheros Communications, Inc. 4 * All rights reserved. 5 * 6 * Permission to use, copy, modify, and/or distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 * 18 * $FreeBSD: head/sys/dev/ath/ath_hal/ah_regdomain.c 188213 2009-02-06 00:48:56Z sam $ 19 */ 20#include "opt_ah.h" 21 22#include "ah.h" 23 24#include <net80211/_ieee80211.h> 25#include <net80211/ieee80211_regdomain.h> 26 27#include "ah_internal.h" 28#include "ah_eeprom.h" 29#include "ah_devid.h" 30 31/* 32 * XXX this code needs a audit+review 33 */ 34 35/* used throughout this file... */ 36#define N(a) (sizeof (a) / sizeof (a[0])) 37 38#define HAL_MODE_11A_TURBO HAL_MODE_108A 39#define HAL_MODE_11G_TURBO HAL_MODE_108G 40 41/* 42 * BMLEN defines the size of the bitmask used to hold frequency 43 * band specifications. Note this must agree with the BM macro 44 * definition that's used to setup initializers. See also further 45 * comments below. 46 */ 47#define BMLEN 2 /* 2 x 64 bits in each channel bitmask */ 48typedef uint64_t chanbmask_t[BMLEN]; 49 50#define W0(_a) \ 51 (((_a) >= 0 && (_a) < 64 ? (((uint64_t) 1)<<(_a)) : (uint64_t) 0)) 52#define W1(_a) \ 53 (((_a) > 63 && (_a) < 128 ? (((uint64_t) 1)<<((_a)-64)) : (uint64_t) 0)) 54#define BM1(_fa) { W0(_fa), W1(_fa) } 55#define BM2(_fa, _fb) { W0(_fa) | W0(_fb), W1(_fa) | W1(_fb) } 56#define BM3(_fa, _fb, _fc) \ 57 { W0(_fa) | W0(_fb) | W0(_fc), W1(_fa) | W1(_fb) | W1(_fc) } 58#define BM4(_fa, _fb, _fc, _fd) \ 59 { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd), \ 60 W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) } 61#define BM5(_fa, _fb, _fc, _fd, _fe) \ 62 { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe), \ 63 W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) } 64#define BM6(_fa, _fb, _fc, _fd, _fe, _ff) \ 65 { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff), \ 66 W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) } 67#define BM7(_fa, _fb, _fc, _fd, _fe, _ff, _fg) \ 68 { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff) | \ 69 W0(_fg),\ 70 W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) | \ 71 W1(_fg) } 72#define BM8(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh) \ 73 { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff) | \ 74 W0(_fg) | W0(_fh) , \ 75 W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) | \ 76 W1(_fg) | W1(_fh) } 77 78/* 79 * Mask to check whether a domain is a multidomain or a single domain 80 */ 81#define MULTI_DOMAIN_MASK 0xFF00 82 83/* 84 * Enumerated Regulatory Domain Information 8 bit values indicate that 85 * the regdomain is really a pair of unitary regdomains. 12 bit values 86 * are the real unitary regdomains and are the only ones which have the 87 * frequency bitmasks and flags set. 88 */ 89enum { 90 /* 91 * The following regulatory domain definitions are 92 * found in the EEPROM. Each regulatory domain 93 * can operate in either a 5GHz or 2.4GHz wireless mode or 94 * both 5GHz and 2.4GHz wireless modes. 95 * In general, the value holds no special 96 * meaning and is used to decode into either specific 97 * 2.4GHz or 5GHz wireless mode for that particular 98 * regulatory domain. 99 */ 100 NO_ENUMRD = 0x00, 101 NULL1_WORLD = 0x03, /* For 11b-only countries (no 11a allowed) */ 102 NULL1_ETSIB = 0x07, /* Israel */ 103 NULL1_ETSIC = 0x08, 104 FCC1_FCCA = 0x10, /* USA */ 105 FCC1_WORLD = 0x11, /* Hong Kong */ 106 FCC4_FCCA = 0x12, /* USA - Public Safety */ 107 FCC5_FCCB = 0x13, /* USA w/ 1/2 and 1/4 width channels */ 108 109 FCC2_FCCA = 0x20, /* Canada */ 110 FCC2_WORLD = 0x21, /* Australia & HK */ 111 FCC2_ETSIC = 0x22, 112 FRANCE_RES = 0x31, /* Legacy France for OEM */ 113 FCC3_FCCA = 0x3A, /* USA & Canada w/5470 band, 11h, DFS enabled */ 114 FCC3_WORLD = 0x3B, /* USA & Canada w/5470 band, 11h, DFS enabled */ 115 116 ETSI1_WORLD = 0x37, 117 ETSI3_ETSIA = 0x32, /* France (optional) */ 118 ETSI2_WORLD = 0x35, /* Hungary & others */ 119 ETSI3_WORLD = 0x36, /* France & others */ 120 ETSI4_WORLD = 0x30, 121 ETSI4_ETSIC = 0x38, 122 ETSI5_WORLD = 0x39, 123 ETSI6_WORLD = 0x34, /* Bulgaria */ 124 ETSI_RESERVED = 0x33, /* Reserved (Do not used) */ 125 126 MKK1_MKKA = 0x40, /* Japan (JP1) */ 127 MKK1_MKKB = 0x41, /* Japan (JP0) */ 128 APL4_WORLD = 0x42, /* Singapore */ 129 MKK2_MKKA = 0x43, /* Japan with 4.9G channels */ 130 APL_RESERVED = 0x44, /* Reserved (Do not used) */ 131 APL2_WORLD = 0x45, /* Korea */ 132 APL2_APLC = 0x46, 133 APL3_WORLD = 0x47, 134 MKK1_FCCA = 0x48, /* Japan (JP1-1) */ 135 APL2_APLD = 0x49, /* Korea with 2.3G channels */ 136 MKK1_MKKA1 = 0x4A, /* Japan (JE1) */ 137 MKK1_MKKA2 = 0x4B, /* Japan (JE2) */ 138 MKK1_MKKC = 0x4C, /* Japan (MKK1_MKKA,except Ch14) */ 139 140 APL3_FCCA = 0x50, 141 APL1_WORLD = 0x52, /* Latin America */ 142 APL1_FCCA = 0x53, 143 APL1_APLA = 0x54, 144 APL1_ETSIC = 0x55, 145 APL2_ETSIC = 0x56, /* Venezuela */ 146 APL5_WORLD = 0x58, /* Chile */ 147 APL6_WORLD = 0x5B, /* Singapore */ 148 APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */ 149 APL8_WORLD = 0x5D, /* Malaysia 5GHz */ 150 APL9_WORLD = 0x5E, /* Korea 5GHz */ 151 152 /* 153 * World mode SKUs 154 */ 155 WOR0_WORLD = 0x60, /* World0 (WO0 SKU) */ 156 WOR1_WORLD = 0x61, /* World1 (WO1 SKU) */ 157 WOR2_WORLD = 0x62, /* World2 (WO2 SKU) */ 158 WOR3_WORLD = 0x63, /* World3 (WO3 SKU) */ 159 WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */ 160 WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */ 161 162 WOR01_WORLD = 0x66, /* World0-1 (WW0-1 SKU) */ 163 WOR02_WORLD = 0x67, /* World0-2 (WW0-2 SKU) */ 164 EU1_WORLD = 0x68, /* Same as World0-2 (WW0-2 SKU), except active scan ch1-13. No ch14 */ 165 166 WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */ 167 WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */ 168 169 MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */ 170 MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */ 171 MKK3_MKKC = 0x82, /* Japan UNI-1 even + MKKC */ 172 173 MKK4_MKKB = 0x83, /* Japan UNI-1 even + UNI-2 + MKKB */ 174 MKK4_MKKA2 = 0x84, /* Japan UNI-1 even + UNI-2 + MKKA2 */ 175 MKK4_MKKC = 0x85, /* Japan UNI-1 even + UNI-2 + MKKC */ 176 177 MKK5_MKKB = 0x86, /* Japan UNI-1 even + UNI-2 + mid-band + MKKB */ 178 MKK5_MKKA2 = 0x87, /* Japan UNI-1 even + UNI-2 + mid-band + MKKA2 */ 179 MKK5_MKKC = 0x88, /* Japan UNI-1 even + UNI-2 + mid-band + MKKC */ 180 181 MKK6_MKKB = 0x89, /* Japan UNI-1 even + UNI-1 odd MKKB */ 182 MKK6_MKKA2 = 0x8A, /* Japan UNI-1 even + UNI-1 odd + MKKA2 */ 183 MKK6_MKKC = 0x8B, /* Japan UNI-1 even + UNI-1 odd + MKKC */ 184 185 MKK7_MKKB = 0x8C, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKB */ 186 MKK7_MKKA2 = 0x8D, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA2 */ 187 MKK7_MKKC = 0x8E, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKC */ 188 189 MKK8_MKKB = 0x8F, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKB */ 190 MKK8_MKKA2 = 0x90, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKA2 */ 191 MKK8_MKKC = 0x91, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKC */ 192 193 /* Following definitions are used only by s/w to map old 194 * Japan SKUs. 195 */ 196 MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */ 197 MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */ 198 MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */ 199 MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */ 200 MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */ 201 MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */ 202 MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz */ 203 MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz */ 204 205 /* 206 * Regulator domains ending in a number (e.g. APL1, 207 * MK1, ETSI4, etc) apply to 5GHz channel and power 208 * information. Regulator domains ending in a letter 209 * (e.g. APLA, FCCA, etc) apply to 2.4GHz channel and 210 * power information. 211 */ 212 APL1 = 0x0150, /* LAT & Asia */ 213 APL2 = 0x0250, /* LAT & Asia */ 214 APL3 = 0x0350, /* Taiwan */ 215 APL4 = 0x0450, /* Jordan */ 216 APL5 = 0x0550, /* Chile */ 217 APL6 = 0x0650, /* Singapore */ 218 APL8 = 0x0850, /* Malaysia */ 219 APL9 = 0x0950, /* Korea (South) ROC 3 */ 220 221 ETSI1 = 0x0130, /* Europe & others */ 222 ETSI2 = 0x0230, /* Europe & others */ 223 ETSI3 = 0x0330, /* Europe & others */ 224 ETSI4 = 0x0430, /* Europe & others */ 225 ETSI5 = 0x0530, /* Europe & others */ 226 ETSI6 = 0x0630, /* Europe & others */ 227 ETSIA = 0x0A30, /* France */ 228 ETSIB = 0x0B30, /* Israel */ 229 ETSIC = 0x0C30, /* Latin America */ 230 231 FCC1 = 0x0110, /* US & others */ 232 FCC2 = 0x0120, /* Canada, Australia & New Zealand */ 233 FCC3 = 0x0160, /* US w/new middle band & DFS */ 234 FCC4 = 0x0165, /* US Public Safety */ 235 FCC5 = 0x0166, /* US w/ 1/2 and 1/4 width channels */ 236 FCCA = 0x0A10, 237 FCCB = 0x0A11, /* US w/ 1/2 and 1/4 width channels */ 238 239 APLD = 0x0D50, /* South Korea */ 240 241 MKK1 = 0x0140, /* Japan (UNI-1 odd)*/ 242 MKK2 = 0x0240, /* Japan (4.9 GHz + UNI-1 odd) */ 243 MKK3 = 0x0340, /* Japan (UNI-1 even) */ 244 MKK4 = 0x0440, /* Japan (UNI-1 even + UNI-2) */ 245 MKK5 = 0x0540, /* Japan (UNI-1 even + UNI-2 + mid-band) */ 246 MKK6 = 0x0640, /* Japan (UNI-1 odd + UNI-1 even) */ 247 MKK7 = 0x0740, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 */ 248 MKK8 = 0x0840, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 + mid-band) */ 249 MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */ 250 MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ 251 MKKA = 0x0A40, /* Japan */ 252 MKKC = 0x0A50, 253 254 NULL1 = 0x0198, 255 WORLD = 0x0199, 256 DEBUG_REG_DMN = 0x01ff, 257}; 258 259#define WORLD_SKU_MASK 0x00F0 260#define WORLD_SKU_PREFIX 0x0060 261 262enum { /* conformance test limits */ 263 FCC = 0x10, 264 MKK = 0x40, 265 ETSI = 0x30, 266}; 267 268/* 269 * The following are flags for different requirements per reg domain. 270 * These requirements are either inhereted from the reg domain pair or 271 * from the unitary reg domain if the reg domain pair flags value is 0 272 */ 273enum { 274 NO_REQ = 0x00000000, /* NB: must be zero */ 275 DISALLOW_ADHOC_11A = 0x00000001, /* adhoc not allowed in 5GHz */ 276 DISALLOW_ADHOC_11A_TURB = 0x00000002, /* not allowed w/ 5GHz turbo */ 277 NEED_NFC = 0x00000004, /* need noise floor check */ 278 ADHOC_PER_11D = 0x00000008, /* must receive 11d beacon */ 279 LIMIT_FRAME_4MS = 0x00000020, /* 4msec tx burst limit */ 280 NO_HOSTAP = 0x00000040, /* No HOSTAP mode opereation */ 281}; 282 283/* 284 * The following describe the bit masks for different passive scan 285 * capability/requirements per regdomain. 286 */ 287#define NO_PSCAN 0x0ULL /* NB: must be zero */ 288#define PSCAN_FCC 0x0000000000000001ULL 289#define PSCAN_FCC_T 0x0000000000000002ULL 290#define PSCAN_ETSI 0x0000000000000004ULL 291#define PSCAN_MKK1 0x0000000000000008ULL 292#define PSCAN_MKK2 0x0000000000000010ULL 293#define PSCAN_MKKA 0x0000000000000020ULL 294#define PSCAN_MKKA_G 0x0000000000000040ULL 295#define PSCAN_ETSIA 0x0000000000000080ULL 296#define PSCAN_ETSIB 0x0000000000000100ULL 297#define PSCAN_ETSIC 0x0000000000000200ULL 298#define PSCAN_WWR 0x0000000000000400ULL 299#define PSCAN_MKKA1 0x0000000000000800ULL 300#define PSCAN_MKKA1_G 0x0000000000001000ULL 301#define PSCAN_MKKA2 0x0000000000002000ULL 302#define PSCAN_MKKA2_G 0x0000000000004000ULL 303#define PSCAN_MKK3 0x0000000000008000ULL 304#define PSCAN_DEFER 0x7FFFFFFFFFFFFFFFULL 305#define IS_ECM_CHAN 0x8000000000000000ULL 306 307/* 308 * THE following table is the mapping of regdomain pairs specified by 309 * an 8 bit regdomain value to the individual unitary reg domains 310 */ 311typedef struct regDomainPair { 312 HAL_REG_DOMAIN regDmnEnum; /* 16 bit reg domain pair */ 313 HAL_REG_DOMAIN regDmn5GHz; /* 5GHz reg domain */ 314 HAL_REG_DOMAIN regDmn2GHz; /* 2GHz reg domain */ 315 uint32_t flags5GHz; /* Requirements flags (AdHoc 316 disallow, noise floor cal needed, 317 etc) */ 318 uint32_t flags2GHz; /* Requirements flags (AdHoc 319 disallow, noise floor cal needed, 320 etc) */ 321 uint64_t pscanMask; /* Passive Scan flags which 322 can override unitary domain 323 passive scan flags. This 324 value is used as a mask on 325 the unitary flags*/ 326 uint16_t singleCC; /* Country code of single country if 327 a one-on-one mapping exists */ 328} REG_DMN_PAIR_MAPPING; 329 330static REG_DMN_PAIR_MAPPING regDomainPairs[] = { 331 {NO_ENUMRD, DEBUG_REG_DMN, DEBUG_REG_DMN, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 332 {NULL1_WORLD, NULL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 333 {NULL1_ETSIB, NULL1, ETSIB, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 334 {NULL1_ETSIC, NULL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 335 336 {FCC2_FCCA, FCC2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 337 {FCC2_WORLD, FCC2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 338 {FCC2_ETSIC, FCC2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 339 {FCC3_FCCA, FCC3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 340 {FCC3_WORLD, FCC3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 341 {FCC4_FCCA, FCC4, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 342 {FCC5_FCCB, FCC5, FCCB, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 343 344 {ETSI1_WORLD, ETSI1, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 345 {ETSI2_WORLD, ETSI2, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 346 {ETSI3_WORLD, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 347 {ETSI4_WORLD, ETSI4, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 348 {ETSI5_WORLD, ETSI5, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 349 {ETSI6_WORLD, ETSI6, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 350 351 {ETSI3_ETSIA, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 352 {FRANCE_RES, ETSI3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 353 354 {FCC1_WORLD, FCC1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 355 {FCC1_FCCA, FCC1, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 356 {APL1_WORLD, APL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 357 {APL2_WORLD, APL2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 358 {APL3_WORLD, APL3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 359 {APL4_WORLD, APL4, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 360 {APL5_WORLD, APL5, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 361 {APL6_WORLD, APL6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 362 {APL8_WORLD, APL8, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 363 {APL9_WORLD, APL9, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 364 365 {APL3_FCCA, APL3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 366 {APL1_ETSIC, APL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 367 {APL2_ETSIC, APL2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 368 {APL2_APLD, APL2, APLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 369 370 {MKK1_MKKA, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA, CTRY_JAPAN }, 371 {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 }, 372 {MKK1_FCCA, MKK1, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN2 }, 373 {MKK1_MKKA1, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN4 }, 374 {MKK1_MKKA2, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN5 }, 375 {MKK1_MKKC, MKK1, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN6 }, 376 377 /* MKK2 */ 378 {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 }, 379 380 /* MKK3 */ 381 {MKK3_MKKA, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC , PSCAN_MKKA, CTRY_DEFAULT }, 382 {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 }, 383 {MKK3_MKKA1, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_DEFAULT }, 384 {MKK3_MKKA2,MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN8 }, 385 {MKK3_MKKC, MKK3, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, CTRY_JAPAN9 }, 386 {MKK3_FCCA, MKK3, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, CTRY_DEFAULT }, 387 388 /* MKK4 */ 389 {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 }, 390 {MKK4_MKKA1, MKK4, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_DEFAULT }, 391 {MKK4_MKKA2, MKK4, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 |PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN11 }, 392 {MKK4_MKKC, MKK4, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN12 }, 393 {MKK4_FCCA, MKK4, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_DEFAULT }, 394 395 /* MKK5 */ 396 {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 }, 397 {MKK5_MKKA2,MKK5, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN14 }, 398 {MKK5_MKKC, MKK5, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN15 }, 399 400 /* MKK6 */ 401 {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 }, 402 {MKK6_MKKA2, MKK6, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN17 }, 403 {MKK6_MKKC, MKK6, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN18 }, 404 405 /* MKK7 */ 406 {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 }, 407 {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 }, 408 {MKK7_MKKC, MKK7, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3, CTRY_JAPAN21 }, 409 410 /* MKK8 */ 411 {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 }, 412 {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 }, 413 {MKK8_MKKC, MKK8, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 , CTRY_JAPAN24 }, 414 415 {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, CTRY_DEFAULT }, 416 {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, CTRY_DEFAULT }, 417 418 /* These are super domains */ 419 {WOR0_WORLD, WOR0_WORLD, WOR0_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 420 {WOR1_WORLD, WOR1_WORLD, WOR1_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 421 {WOR2_WORLD, WOR2_WORLD, WOR2_WORLD, DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 422 {WOR3_WORLD, WOR3_WORLD, WOR3_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 423 {WOR4_WORLD, WOR4_WORLD, WOR4_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 424 {WOR5_ETSIC, WOR5_ETSIC, WOR5_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 425 {WOR01_WORLD, WOR01_WORLD, WOR01_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 426 {WOR02_WORLD, WOR02_WORLD, WOR02_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 427 {EU1_WORLD, EU1_WORLD, EU1_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 428 {WOR9_WORLD, WOR9_WORLD, WOR9_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 429 {WORA_WORLD, WORA_WORLD, WORA_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 430}; 431 432/* 433 * The following tables are the master list for all different freqeuncy 434 * bands with the complete matrix of all possible flags and settings 435 * for each band if it is used in ANY reg domain. 436 */ 437 438#define DEF_REGDMN FCC1_FCCA 439#define COUNTRY_ERD_FLAG 0x8000 440#define WORLDWIDE_ROAMING_FLAG 0x4000 441 442typedef struct { 443 HAL_CTRY_CODE countryCode; 444 HAL_REG_DOMAIN regDmnEnum; 445} COUNTRY_CODE_TO_ENUM_RD; 446 447static COUNTRY_CODE_TO_ENUM_RD allCountries[] = { 448 { CTRY_DEBUG, NO_ENUMRD }, 449 { CTRY_DEFAULT, DEF_REGDMN }, 450 { CTRY_ALBANIA, NULL1_WORLD }, 451 { CTRY_ALGERIA, NULL1_WORLD }, 452 { CTRY_ARGENTINA, APL3_WORLD }, 453 { CTRY_ARMENIA, ETSI4_WORLD }, 454 { CTRY_AUSTRALIA, FCC2_WORLD }, 455 { CTRY_AUSTRIA, ETSI1_WORLD }, 456 { CTRY_AZERBAIJAN, ETSI4_WORLD }, 457 { CTRY_BAHRAIN, APL6_WORLD }, 458 { CTRY_BELARUS, NULL1_WORLD }, 459 { CTRY_BELGIUM, ETSI1_WORLD }, 460 { CTRY_BELIZE, APL1_ETSIC }, 461 { CTRY_BOLIVIA, APL1_ETSIC }, 462 { CTRY_BRAZIL, FCC3_WORLD }, 463 { CTRY_BRUNEI_DARUSSALAM,APL1_WORLD }, 464 { CTRY_BULGARIA, ETSI6_WORLD }, 465 { CTRY_CANADA, FCC2_FCCA }, 466 { CTRY_CHILE, APL6_WORLD }, 467 { CTRY_CHINA, APL1_WORLD }, 468 { CTRY_COLOMBIA, FCC1_FCCA }, 469 { CTRY_COSTA_RICA, NULL1_WORLD }, 470 { CTRY_CROATIA, ETSI3_WORLD }, 471 { CTRY_CYPRUS, ETSI1_WORLD }, 472 { CTRY_CZECH, ETSI1_WORLD }, 473 { CTRY_DENMARK, ETSI1_WORLD }, 474 { CTRY_DOMINICAN_REPUBLIC,FCC1_FCCA }, 475 { CTRY_ECUADOR, NULL1_WORLD }, 476 { CTRY_EGYPT, ETSI3_WORLD }, 477 { CTRY_EL_SALVADOR, NULL1_WORLD }, 478 { CTRY_ESTONIA, ETSI1_WORLD }, 479 { CTRY_FINLAND, ETSI1_WORLD }, 480 { CTRY_FRANCE, ETSI1_WORLD }, 481 { CTRY_FRANCE2, ETSI3_WORLD }, 482 { CTRY_GEORGIA, ETSI4_WORLD }, 483 { CTRY_GERMANY, ETSI1_WORLD }, 484 { CTRY_GREECE, ETSI1_WORLD }, 485 { CTRY_GUATEMALA, FCC1_FCCA }, 486 { CTRY_HONDURAS, NULL1_WORLD }, 487 { CTRY_HONG_KONG, FCC2_WORLD }, 488 { CTRY_HUNGARY, ETSI1_WORLD }, 489 { CTRY_ICELAND, ETSI1_WORLD }, 490 { CTRY_INDIA, APL6_WORLD }, 491 { CTRY_INDONESIA, APL1_WORLD }, 492 { CTRY_IRAN, APL1_WORLD }, 493 { CTRY_IRELAND, ETSI1_WORLD }, 494 { CTRY_ISRAEL, NULL1_WORLD }, 495 { CTRY_ITALY, ETSI1_WORLD }, 496 { CTRY_JAPAN, MKK1_MKKA }, 497 { CTRY_JAPAN1, MKK1_MKKB }, 498 { CTRY_JAPAN2, MKK1_FCCA }, 499 { CTRY_JAPAN3, MKK2_MKKA }, 500 { CTRY_JAPAN4, MKK1_MKKA1 }, 501 { CTRY_JAPAN5, MKK1_MKKA2 }, 502 { CTRY_JAPAN6, MKK1_MKKC }, 503 504 { CTRY_JAPAN7, MKK3_MKKB }, 505 { CTRY_JAPAN8, MKK3_MKKA2 }, 506 { CTRY_JAPAN9, MKK3_MKKC }, 507 508 { CTRY_JAPAN10, MKK4_MKKB }, 509 { CTRY_JAPAN11, MKK4_MKKA2 }, 510 { CTRY_JAPAN12, MKK4_MKKC }, 511 512 { CTRY_JAPAN13, MKK5_MKKB }, 513 { CTRY_JAPAN14, MKK5_MKKA2 }, 514 { CTRY_JAPAN15, MKK5_MKKC }, 515 516 { CTRY_JAPAN16, MKK6_MKKB }, 517 { CTRY_JAPAN17, MKK6_MKKA2 }, 518 { CTRY_JAPAN18, MKK6_MKKC }, 519 520 { CTRY_JAPAN19, MKK7_MKKB }, 521 { CTRY_JAPAN20, MKK7_MKKA2 }, 522 { CTRY_JAPAN21, MKK7_MKKC }, 523 524 { CTRY_JAPAN22, MKK8_MKKB }, 525 { CTRY_JAPAN23, MKK8_MKKA2 }, 526 { CTRY_JAPAN24, MKK8_MKKC }, 527 528 { CTRY_JORDAN, APL4_WORLD }, 529 { CTRY_KAZAKHSTAN, NULL1_WORLD }, 530 { CTRY_KOREA_NORTH, APL2_WORLD }, 531 { CTRY_KOREA_ROC, APL2_WORLD }, 532 { CTRY_KOREA_ROC2, APL2_WORLD }, 533 { CTRY_KOREA_ROC3, APL9_WORLD }, 534 { CTRY_KUWAIT, NULL1_WORLD }, 535 { CTRY_LATVIA, ETSI1_WORLD }, 536 { CTRY_LEBANON, NULL1_WORLD }, 537 { CTRY_LIECHTENSTEIN,ETSI1_WORLD }, 538 { CTRY_LITHUANIA, ETSI1_WORLD }, 539 { CTRY_LUXEMBOURG, ETSI1_WORLD }, 540 { CTRY_MACAU, FCC2_WORLD }, 541 { CTRY_MACEDONIA, NULL1_WORLD }, 542 { CTRY_MALAYSIA, APL8_WORLD }, 543 { CTRY_MALTA, ETSI1_WORLD }, 544 { CTRY_MEXICO, FCC1_FCCA }, 545 { CTRY_MONACO, ETSI4_WORLD }, 546 { CTRY_MOROCCO, NULL1_WORLD }, 547 { CTRY_NETHERLANDS, ETSI1_WORLD }, 548 { CTRY_NEW_ZEALAND, FCC2_ETSIC }, 549 { CTRY_NORWAY, ETSI1_WORLD }, 550 { CTRY_OMAN, APL6_WORLD }, 551 { CTRY_PAKISTAN, NULL1_WORLD }, 552 { CTRY_PANAMA, FCC1_FCCA }, 553 { CTRY_PERU, APL1_WORLD }, 554 { CTRY_PHILIPPINES, FCC3_WORLD }, 555 { CTRY_POLAND, ETSI1_WORLD }, 556 { CTRY_PORTUGAL, ETSI1_WORLD }, 557 { CTRY_PUERTO_RICO, FCC1_FCCA }, 558 { CTRY_QATAR, NULL1_WORLD }, 559 { CTRY_ROMANIA, NULL1_WORLD }, 560 { CTRY_RUSSIA, NULL1_WORLD }, 561 { CTRY_SAUDI_ARABIA,FCC2_WORLD }, 562 { CTRY_SINGAPORE, APL6_WORLD }, 563 { CTRY_SLOVAKIA, ETSI1_WORLD }, 564 { CTRY_SLOVENIA, ETSI1_WORLD }, 565 { CTRY_SOUTH_AFRICA,FCC3_WORLD }, 566 { CTRY_SPAIN, ETSI1_WORLD }, 567 { CTRY_SWEDEN, ETSI1_WORLD }, 568 { CTRY_SWITZERLAND, ETSI1_WORLD }, 569 { CTRY_SYRIA, NULL1_WORLD }, 570 { CTRY_TAIWAN, APL3_FCCA }, 571 { CTRY_THAILAND, NULL1_WORLD }, 572 { CTRY_TRINIDAD_Y_TOBAGO,ETSI4_WORLD }, 573 { CTRY_TUNISIA, ETSI3_WORLD }, 574 { CTRY_TURKEY, ETSI3_WORLD }, 575 { CTRY_UKRAINE, NULL1_WORLD }, 576 { CTRY_UAE, NULL1_WORLD }, 577 { CTRY_UNITED_KINGDOM, ETSI1_WORLD }, 578 { CTRY_UNITED_STATES, FCC1_FCCA }, 579 { CTRY_UNITED_STATES_FCC49,FCC4_FCCA }, 580 { CTRY_URUGUAY, FCC1_WORLD }, 581 { CTRY_UZBEKISTAN, FCC3_FCCA }, 582 { CTRY_VENEZUELA, APL2_ETSIC }, 583 { CTRY_VIET_NAM, NULL1_WORLD }, 584 { CTRY_ZIMBABWE, NULL1_WORLD } 585}; 586 587/* Bit masks for DFS per regdomain */ 588enum { 589 NO_DFS = 0x0000000000000000ULL, /* NB: must be zero */ 590 DFS_FCC3 = 0x0000000000000001ULL, 591 DFS_ETSI = 0x0000000000000002ULL, 592 DFS_MKK4 = 0x0000000000000004ULL, 593}; 594 595#define AFTER(x) ((x)+1) 596 597/* 598 * Frequency band collections are defined using bitmasks. Each bit 599 * in a mask is the index of an entry in one of the following tables. 600 * Bitmasks are BMLEN*64 bits so if a table grows beyond that the bit 601 * vectors must be enlarged or the tables split somehow (e.g. split 602 * 1/2 and 1/4 rate channels into a separate table). 603 * 604 * Beware of ordering; the indices are defined relative to the preceding 605 * entry so if things get off there will be confusion. A good way to 606 * check the indices is to collect them in a switch statement in a stub 607 * function so the compiler checks for duplicates. 608 */ 609 610typedef struct { 611 uint16_t lowChannel; /* Low channel center in MHz */ 612 uint16_t highChannel; /* High Channel center in MHz */ 613 uint8_t powerDfs; /* Max power (dBm) for channel 614 range when using DFS */ 615 uint8_t antennaMax; /* Max allowed antenna gain */ 616 uint8_t channelBW; /* Bandwidth of the channel */ 617 uint8_t channelSep; /* Channel separation within 618 the band */ 619 uint64_t useDfs; /* Use DFS in the RegDomain 620 if corresponding bit is set */ 621 uint64_t usePassScan; /* Use Passive Scan in the RegDomain 622 if corresponding bit is set */ 623} REG_DMN_FREQ_BAND; 624 625/* 626 * 5GHz 11A channel tags 627 */ 628static REG_DMN_FREQ_BAND regDmn5GhzFreq[] = { 629 { 4915, 4925, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 630#define F1_4915_4925 0 631 { 4935, 4945, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 632#define F1_4935_4945 AFTER(F1_4915_4925) 633 { 4920, 4980, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2 }, 634#define F1_4920_4980 AFTER(F1_4935_4945) 635 { 4942, 4987, 27, 6, 5, 5, NO_DFS, PSCAN_FCC }, 636#define F1_4942_4987 AFTER(F1_4920_4980) 637 { 4945, 4985, 30, 6, 10, 5, NO_DFS, PSCAN_FCC }, 638#define F1_4945_4985 AFTER(F1_4942_4987) 639 { 4950, 4980, 33, 6, 20, 5, NO_DFS, PSCAN_FCC }, 640#define F1_4950_4980 AFTER(F1_4945_4985) 641 { 5035, 5040, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 642#define F1_5035_5040 AFTER(F1_4950_4980) 643 { 5040, 5080, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2 }, 644#define F1_5040_5080 AFTER(F1_5035_5040) 645 { 5055, 5055, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 646#define F1_5055_5055 AFTER(F1_5040_5080) 647 648 { 5120, 5240, 5, 6, 20, 20, NO_DFS, NO_PSCAN }, 649#define F1_5120_5240 AFTER(F1_5055_5055) 650 { 5120, 5240, 5, 6, 10, 10, NO_DFS, NO_PSCAN }, 651#define F2_5120_5240 AFTER(F1_5120_5240) 652 { 5120, 5240, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 653#define F3_5120_5240 AFTER(F2_5120_5240) 654 655 { 5170, 5230, 23, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2 }, 656#define F1_5170_5230 AFTER(F3_5120_5240) 657 { 5170, 5230, 20, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2 }, 658#define F2_5170_5230 AFTER(F1_5170_5230) 659 660 { 5180, 5240, 15, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 661#define F1_5180_5240 AFTER(F2_5170_5230) 662 { 5180, 5240, 17, 6, 20, 20, NO_DFS, PSCAN_FCC }, 663#define F2_5180_5240 AFTER(F1_5180_5240) 664 { 5180, 5240, 18, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 665#define F3_5180_5240 AFTER(F2_5180_5240) 666 { 5180, 5240, 20, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 667#define F4_5180_5240 AFTER(F3_5180_5240) 668 { 5180, 5240, 23, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 669#define F5_5180_5240 AFTER(F4_5180_5240) 670 { 5180, 5240, 23, 6, 20, 20, NO_DFS, PSCAN_FCC }, 671#define F6_5180_5240 AFTER(F5_5180_5240) 672 { 5180, 5240, 17, 6, 20, 10, NO_DFS, PSCAN_FCC }, 673#define F7_5180_5240 AFTER(F6_5180_5240) 674 { 5180, 5240, 17, 6, 20, 5, NO_DFS, PSCAN_FCC }, 675#define F8_5180_5240 AFTER(F7_5180_5240) 676 { 5180, 5320, 20, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 677 678#define F1_5180_5320 AFTER(F8_5180_5240) 679 { 5240, 5280, 23, 0, 20, 20, DFS_FCC3, PSCAN_FCC | PSCAN_ETSI }, 680 681#define F1_5240_5280 AFTER(F1_5180_5320) 682 { 5260, 5280, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 683 684#define F1_5260_5280 AFTER(F1_5240_5280) 685 { 5260, 5320, 18, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 686 687#define F1_5260_5320 AFTER(F1_5260_5280) 688 { 5260, 5320, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_FCC | PSCAN_ETSI | PSCAN_MKK3 }, 689#define F2_5260_5320 AFTER(F1_5260_5320) 690 691 { 5260, 5320, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 692#define F3_5260_5320 AFTER(F2_5260_5320) 693 { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 694#define F4_5260_5320 AFTER(F3_5260_5320) 695 { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 696#define F5_5260_5320 AFTER(F4_5260_5320) 697 { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 698#define F6_5260_5320 AFTER(F5_5260_5320) 699 { 5260, 5320, 23, 6, 20, 10, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 700#define F7_5260_5320 AFTER(F6_5260_5320) 701 { 5260, 5320, 23, 6, 20, 5, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 702#define F8_5260_5320 AFTER(F7_5260_5320) 703 704 { 5260, 5700, 5, 6, 20, 20, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 705#define F1_5260_5700 AFTER(F8_5260_5320) 706 { 5260, 5700, 5, 6, 10, 10, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 707#define F2_5260_5700 AFTER(F1_5260_5700) 708 { 5260, 5700, 5, 6, 5, 5, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 709#define F3_5260_5700 AFTER(F2_5260_5700) 710 711 { 5280, 5320, 17, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 712#define F1_5280_5320 AFTER(F3_5260_5700) 713 714 { 5500, 5620, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 715#define F1_5500_5620 AFTER(F1_5280_5320) 716 717 { 5500, 5700, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 718#define F1_5500_5700 AFTER(F1_5500_5620) 719 { 5500, 5700, 27, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 720#define F2_5500_5700 AFTER(F1_5500_5700) 721 { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 722#define F3_5500_5700 AFTER(F2_5500_5700) 723 { 5500, 5700, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_MKK3 | PSCAN_FCC }, 724#define F4_5500_5700 AFTER(F3_5500_5700) 725 726 { 5745, 5805, 23, 0, 20, 20, NO_DFS, NO_PSCAN }, 727#define F1_5745_5805 AFTER(F4_5500_5700) 728 { 5745, 5805, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 729#define F2_5745_5805 AFTER(F1_5745_5805) 730 { 5745, 5805, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 731#define F3_5745_5805 AFTER(F2_5745_5805) 732 { 5745, 5825, 5, 6, 20, 20, NO_DFS, NO_PSCAN }, 733#define F1_5745_5825 AFTER(F3_5745_5805) 734 { 5745, 5825, 17, 0, 20, 20, NO_DFS, NO_PSCAN }, 735#define F2_5745_5825 AFTER(F1_5745_5825) 736 { 5745, 5825, 20, 0, 20, 20, NO_DFS, NO_PSCAN }, 737#define F3_5745_5825 AFTER(F2_5745_5825) 738 { 5745, 5825, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 739#define F4_5745_5825 AFTER(F3_5745_5825) 740 { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 741#define F5_5745_5825 AFTER(F4_5745_5825) 742 { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 743#define F6_5745_5825 AFTER(F5_5745_5825) 744 { 5745, 5825, 5, 6, 10, 10, NO_DFS, NO_PSCAN }, 745#define F7_5745_5825 AFTER(F6_5745_5825) 746 { 5745, 5825, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 747#define F8_5745_5825 AFTER(F7_5745_5825) 748 { 5745, 5825, 30, 6, 20, 10, NO_DFS, NO_PSCAN }, 749#define F9_5745_5825 AFTER(F8_5745_5825) 750 { 5745, 5825, 30, 6, 20, 5, NO_DFS, NO_PSCAN }, 751#define F10_5745_5825 AFTER(F9_5745_5825) 752 753 /* 754 * Below are the world roaming channels 755 * All WWR domains have no power limit, instead use the card's CTL 756 * or max power settings. 757 */ 758 { 4920, 4980, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 759#define W1_4920_4980 AFTER(F10_5745_5825) 760 { 5040, 5080, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 761#define W1_5040_5080 AFTER(W1_4920_4980) 762 { 5170, 5230, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 763#define W1_5170_5230 AFTER(W1_5040_5080) 764 { 5180, 5240, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 765#define W1_5180_5240 AFTER(W1_5170_5230) 766 { 5260, 5320, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 767#define W1_5260_5320 AFTER(W1_5180_5240) 768 { 5745, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 769#define W1_5745_5825 AFTER(W1_5260_5320) 770 { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 771#define W1_5500_5700 AFTER(W1_5745_5825) 772 { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 773#define W2_5260_5320 AFTER(W1_5500_5700) 774 { 5180, 5240, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 775#define W2_5180_5240 AFTER(W2_5260_5320) 776 { 5825, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 777#define W2_5825_5825 AFTER(W2_5180_5240) 778}; 779 780/* 781 * 5GHz Turbo (dynamic & static) tags 782 */ 783static REG_DMN_FREQ_BAND regDmn5GhzTurboFreq[] = { 784 { 5130, 5210, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 785#define T1_5130_5210 0 786 { 5250, 5330, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 787#define T1_5250_5330 AFTER(T1_5130_5210) 788 { 5370, 5490, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 789#define T1_5370_5490 AFTER(T1_5250_5330) 790 { 5530, 5650, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 791#define T1_5530_5650 AFTER(T1_5370_5490) 792 793 { 5150, 5190, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 794#define T1_5150_5190 AFTER(T1_5530_5650) 795 { 5230, 5310, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 796#define T1_5230_5310 AFTER(T1_5150_5190) 797 { 5350, 5470, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 798#define T1_5350_5470 AFTER(T1_5230_5310) 799 { 5510, 5670, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 800#define T1_5510_5670 AFTER(T1_5350_5470) 801 802 { 5200, 5240, 17, 6, 40, 40, NO_DFS, NO_PSCAN }, 803#define T1_5200_5240 AFTER(T1_5510_5670) 804 { 5200, 5240, 23, 6, 40, 40, NO_DFS, NO_PSCAN }, 805#define T2_5200_5240 AFTER(T1_5200_5240) 806 { 5210, 5210, 17, 6, 40, 40, NO_DFS, NO_PSCAN }, 807#define T1_5210_5210 AFTER(T2_5200_5240) 808 { 5210, 5210, 23, 0, 40, 40, NO_DFS, NO_PSCAN }, 809#define T2_5210_5210 AFTER(T1_5210_5210) 810 811 { 5280, 5280, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 812#define T1_5280_5280 AFTER(T2_5210_5210) 813 { 5280, 5280, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 814#define T2_5280_5280 AFTER(T1_5280_5280) 815 { 5250, 5250, 17, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 816#define T1_5250_5250 AFTER(T2_5280_5280) 817 { 5290, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 818#define T1_5290_5290 AFTER(T1_5250_5250) 819 { 5250, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 820#define T1_5250_5290 AFTER(T1_5290_5290) 821 { 5250, 5290, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 822#define T2_5250_5290 AFTER(T1_5250_5290) 823 824 { 5540, 5660, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 825#define T1_5540_5660 AFTER(T2_5250_5290) 826 { 5760, 5800, 20, 0, 40, 40, NO_DFS, NO_PSCAN }, 827#define T1_5760_5800 AFTER(T1_5540_5660) 828 { 5760, 5800, 30, 6, 40, 40, NO_DFS, NO_PSCAN }, 829#define T2_5760_5800 AFTER(T1_5760_5800) 830 831 { 5765, 5805, 30, 6, 40, 40, NO_DFS, NO_PSCAN }, 832#define T1_5765_5805 AFTER(T2_5760_5800) 833 834 /* 835 * Below are the WWR frequencies 836 */ 837 { 5210, 5250, 15, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 838#define WT1_5210_5250 AFTER(T1_5765_5805) 839 { 5290, 5290, 18, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 840#define WT1_5290_5290 AFTER(WT1_5210_5250) 841 { 5540, 5660, 20, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 842#define WT1_5540_5660 AFTER(WT1_5290_5290) 843 { 5760, 5800, 20, 0, 40, 40, NO_DFS, PSCAN_WWR }, 844#define WT1_5760_5800 AFTER(WT1_5540_5660) 845}; 846 847/* 848 * 2GHz 11b channel tags 849 */ 850static REG_DMN_FREQ_BAND regDmn2GhzFreq[] = { 851 { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 852#define F1_2312_2372 0 853 { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 854#define F2_2312_2372 AFTER(F1_2312_2372) 855 856 { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 857#define F1_2412_2472 AFTER(F2_2312_2372) 858 { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA }, 859#define F2_2412_2472 AFTER(F1_2412_2472) 860 { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN }, 861#define F3_2412_2472 AFTER(F2_2412_2472) 862 863 { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN }, 864#define F1_2412_2462 AFTER(F3_2412_2472) 865 { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA }, 866#define F2_2412_2462 AFTER(F1_2412_2462) 867 868 { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 869#define F1_2432_2442 AFTER(F2_2412_2462) 870 871 { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 872#define F1_2457_2472 AFTER(F1_2432_2442) 873 874 { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA }, 875#define F1_2467_2472 AFTER(F1_2457_2472) 876 877 { 2484, 2484, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 878#define F1_2484_2484 AFTER(F1_2467_2472) 879 { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA | PSCAN_MKKA1 | PSCAN_MKKA2 }, 880#define F2_2484_2484 AFTER(F1_2484_2484) 881 882 { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 883#define F1_2512_2732 AFTER(F2_2484_2484) 884 885 /* 886 * WWR have powers opened up to 20dBm. 887 * Limits should often come from CTL/Max powers 888 */ 889 { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 890#define W1_2312_2372 AFTER(F1_2512_2732) 891 { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 892#define W1_2412_2412 AFTER(W1_2312_2372) 893 { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 894#define W1_2417_2432 AFTER(W1_2412_2412) 895 { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 896#define W1_2437_2442 AFTER(W1_2417_2432) 897 { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 898#define W1_2447_2457 AFTER(W1_2437_2442) 899 { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 900#define W1_2462_2462 AFTER(W1_2447_2457) 901 { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 902#define W1_2467_2467 AFTER(W1_2462_2462) 903 { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 904#define W2_2467_2467 AFTER(W1_2467_2467) 905 { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 906#define W1_2472_2472 AFTER(W2_2467_2467) 907 { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 908#define W2_2472_2472 AFTER(W1_2472_2472) 909 { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 910#define W1_2484_2484 AFTER(W2_2472_2472) 911 { 2484, 2484, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 912#define W2_2484_2484 AFTER(W1_2484_2484) 913}; 914 915/* 916 * 2GHz 11g channel tags 917 */ 918static REG_DMN_FREQ_BAND regDmn2Ghz11gFreq[] = { 919 { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 920#define G1_2312_2372 0 921 { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 922#define G2_2312_2372 AFTER(G1_2312_2372) 923 { 2312, 2372, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 924#define G3_2312_2372 AFTER(G2_2312_2372) 925 { 2312, 2372, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 926#define G4_2312_2372 AFTER(G3_2312_2372) 927 928 { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 929#define G1_2412_2472 AFTER(G4_2312_2372) 930 { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G }, 931#define G2_2412_2472 AFTER(G1_2412_2472) 932 { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN }, 933#define G3_2412_2472 AFTER(G2_2412_2472) 934 { 2412, 2472, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 935#define G4_2412_2472 AFTER(G3_2412_2472) 936 { 2412, 2472, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 937#define G5_2412_2472 AFTER(G4_2412_2472) 938 939 { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN }, 940#define G1_2412_2462 AFTER(G5_2412_2472) 941 { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G }, 942#define G2_2412_2462 AFTER(G1_2412_2462) 943 { 2412, 2462, 27, 6, 10, 5, NO_DFS, NO_PSCAN }, 944#define G3_2412_2462 AFTER(G2_2412_2462) 945 { 2412, 2462, 27, 6, 5, 5, NO_DFS, NO_PSCAN }, 946#define G4_2412_2462 AFTER(G3_2412_2462) 947 948 { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 949#define G1_2432_2442 AFTER(G4_2412_2462) 950 951 { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 952#define G1_2457_2472 AFTER(G1_2432_2442) 953 954 { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 955#define G1_2512_2732 AFTER(G1_2457_2472) 956 { 2512, 2732, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 957#define G2_2512_2732 AFTER(G1_2512_2732) 958 { 2512, 2732, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 959#define G3_2512_2732 AFTER(G2_2512_2732) 960 961 { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA }, 962#define G1_2467_2472 AFTER(G3_2512_2732) 963 964 /* 965 * WWR open up the power to 20dBm 966 */ 967 { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 968#define WG1_2312_2372 AFTER(G1_2467_2472) 969 { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 970#define WG1_2412_2412 AFTER(WG1_2312_2372) 971 { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 972#define WG1_2417_2432 AFTER(WG1_2412_2412) 973 { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 974#define WG1_2437_2442 AFTER(WG1_2417_2432) 975 { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 976#define WG1_2447_2457 AFTER(WG1_2437_2442) 977 { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 978#define WG1_2462_2462 AFTER(WG1_2447_2457) 979 { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 980#define WG1_2467_2467 AFTER(WG1_2462_2462) 981 { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 982#define WG2_2467_2467 AFTER(WG1_2467_2467) 983 { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 984#define WG1_2472_2472 AFTER(WG2_2467_2467) 985 { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 986#define WG2_2472_2472 AFTER(WG1_2472_2472) 987}; 988 989/* 990 * 2GHz Dynamic turbo tags 991 */ 992static REG_DMN_FREQ_BAND regDmn2Ghz11gTurboFreq[] = { 993 { 2312, 2372, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 994#define T1_2312_2372 0 995 { 2437, 2437, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 996#define T1_2437_2437 AFTER(T1_2312_2372) 997 { 2437, 2437, 20, 6, 40, 40, NO_DFS, NO_PSCAN }, 998#define T2_2437_2437 AFTER(T1_2437_2437) 999 { 2437, 2437, 18, 6, 40, 40, NO_DFS, PSCAN_WWR }, 1000#define T3_2437_2437 AFTER(T2_2437_2437) 1001 { 2512, 2732, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 1002#define T1_2512_2732 AFTER(T3_2437_2437) 1003}; 1004 1005typedef struct regDomain { 1006 uint16_t regDmnEnum; /* value from EnumRd table */ 1007 uint8_t conformanceTestLimit; 1008 uint32_t flags; /* Requirement flags (AdHoc disallow, 1009 noise floor cal needed, etc) */ 1010 uint64_t dfsMask; /* DFS bitmask for 5Ghz tables */ 1011 uint64_t pscan; /* Bitmask for passive scan */ 1012 chanbmask_t chan11a; /* 11a channels */ 1013 chanbmask_t chan11a_turbo; /* 11a static turbo channels */ 1014 chanbmask_t chan11a_dyn_turbo; /* 11a dynamic turbo channels */ 1015 chanbmask_t chan11a_half; /* 11a 1/2 width channels */ 1016 chanbmask_t chan11a_quarter; /* 11a 1/4 width channels */ 1017 chanbmask_t chan11b; /* 11b channels */ 1018 chanbmask_t chan11g; /* 11g channels */ 1019 chanbmask_t chan11g_turbo; /* 11g dynamic turbo channels */ 1020 chanbmask_t chan11g_half; /* 11g 1/2 width channels */ 1021 chanbmask_t chan11g_quarter; /* 11g 1/4 width channels */ 1022} REG_DOMAIN; 1023 1024static REG_DOMAIN regDomains[] = { 1025 1026 {.regDmnEnum = DEBUG_REG_DMN, 1027 .conformanceTestLimit = FCC, 1028 .dfsMask = DFS_FCC3, 1029 .chan11a = BM4(F1_4950_4980, 1030 F1_5120_5240, 1031 F1_5260_5700, 1032 F1_5745_5825), 1033 .chan11a_half = BM4(F1_4945_4985, 1034 F2_5120_5240, 1035 F2_5260_5700, 1036 F7_5745_5825), 1037 .chan11a_quarter = BM4(F1_4942_4987, 1038 F3_5120_5240, 1039 F3_5260_5700, 1040 F8_5745_5825), 1041 .chan11a_turbo = BM8(T1_5130_5210, 1042 T1_5250_5330, 1043 T1_5370_5490, 1044 T1_5530_5650, 1045 T1_5150_5190, 1046 T1_5230_5310, 1047 T1_5350_5470, 1048 T1_5510_5670), 1049 .chan11a_dyn_turbo = BM4(T1_5200_5240, 1050 T1_5280_5280, 1051 T1_5540_5660, 1052 T1_5765_5805), 1053 .chan11b = BM4(F1_2312_2372, 1054 F1_2412_2472, 1055 F1_2484_2484, 1056 F1_2512_2732), 1057 .chan11g = BM3(G1_2312_2372, G1_2412_2472, G1_2512_2732), 1058 .chan11g_turbo = BM3(T1_2312_2372, T1_2437_2437, T1_2512_2732), 1059 .chan11g_half = BM3(G2_2312_2372, G4_2412_2472, G2_2512_2732), 1060 .chan11g_quarter = BM3(G3_2312_2372, G5_2412_2472, G3_2512_2732), 1061 }, 1062 1063 {.regDmnEnum = APL1, 1064 .conformanceTestLimit = FCC, 1065 .chan11a = BM1(F4_5745_5825), 1066 }, 1067 1068 {.regDmnEnum = APL2, 1069 .conformanceTestLimit = FCC, 1070 .chan11a = BM1(F1_5745_5805), 1071 }, 1072 1073 {.regDmnEnum = APL3, 1074 .conformanceTestLimit = FCC, 1075 .chan11a = BM2(F1_5280_5320, F2_5745_5805), 1076 }, 1077 1078 {.regDmnEnum = APL4, 1079 .conformanceTestLimit = FCC, 1080 .chan11a = BM2(F4_5180_5240, F3_5745_5825), 1081 }, 1082 1083 {.regDmnEnum = APL5, 1084 .conformanceTestLimit = FCC, 1085 .chan11a = BM1(F2_5745_5825), 1086 }, 1087 1088 {.regDmnEnum = APL6, 1089 .conformanceTestLimit = ETSI, 1090 .dfsMask = DFS_ETSI, 1091 .pscan = PSCAN_FCC_T | PSCAN_FCC, 1092 .chan11a = BM3(F4_5180_5240, F2_5260_5320, F3_5745_5825), 1093 .chan11a_turbo = BM3(T2_5210_5210, T1_5250_5290, T1_5760_5800), 1094 }, 1095 1096 {.regDmnEnum = APL8, 1097 .conformanceTestLimit = ETSI, 1098 .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 1099 .chan11a = BM2(F6_5260_5320, F4_5745_5825), 1100 }, 1101 1102 {.regDmnEnum = APL9, 1103 .conformanceTestLimit = ETSI, 1104 .dfsMask = DFS_ETSI, 1105 .pscan = PSCAN_ETSI, 1106 .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 1107 .chan11a = BM3(F1_5180_5320, F1_5500_5620, F3_5745_5805), 1108 }, 1109 1110 {.regDmnEnum = ETSI1, 1111 .conformanceTestLimit = ETSI, 1112 .dfsMask = DFS_ETSI, 1113 .pscan = PSCAN_ETSI, 1114 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1115 .chan11a = BM3(W2_5180_5240, F2_5260_5320, F2_5500_5700), 1116 }, 1117 1118 {.regDmnEnum = ETSI2, 1119 .conformanceTestLimit = ETSI, 1120 .dfsMask = DFS_ETSI, 1121 .pscan = PSCAN_ETSI, 1122 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1123 .chan11a = BM1(F3_5180_5240), 1124 }, 1125 1126 {.regDmnEnum = ETSI3, 1127 .conformanceTestLimit = ETSI, 1128 .dfsMask = DFS_ETSI, 1129 .pscan = PSCAN_ETSI, 1130 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1131 .chan11a = BM2(W2_5180_5240, F2_5260_5320), 1132 }, 1133 1134 {.regDmnEnum = ETSI4, 1135 .conformanceTestLimit = ETSI, 1136 .dfsMask = DFS_ETSI, 1137 .pscan = PSCAN_ETSI, 1138 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1139 .chan11a = BM2(F3_5180_5240, F1_5260_5320), 1140 }, 1141 1142 {.regDmnEnum = ETSI5, 1143 .conformanceTestLimit = ETSI, 1144 .dfsMask = DFS_ETSI, 1145 .pscan = PSCAN_ETSI, 1146 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1147 .chan11a = BM1(F1_5180_5240), 1148 }, 1149 1150 {.regDmnEnum = ETSI6, 1151 .conformanceTestLimit = ETSI, 1152 .dfsMask = DFS_ETSI, 1153 .pscan = PSCAN_ETSI, 1154 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1155 .chan11a = BM3(F5_5180_5240, F1_5260_5280, F3_5500_5700), 1156 }, 1157 1158 {.regDmnEnum = FCC1, 1159 .conformanceTestLimit = FCC, 1160 .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 1161 .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 1162 .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 1163 }, 1164 1165 {.regDmnEnum = FCC2, 1166 .conformanceTestLimit = FCC, 1167 .chan11a = BM3(F6_5180_5240, F5_5260_5320, F6_5745_5825), 1168 .chan11a_dyn_turbo = BM3(T2_5200_5240, T1_5280_5280, T1_5765_5805), 1169 }, 1170 1171 {.regDmnEnum = FCC3, 1172 .conformanceTestLimit = FCC, 1173 .dfsMask = DFS_FCC3, 1174 .pscan = PSCAN_FCC | PSCAN_FCC_T, 1175 .chan11a = BM4(F2_5180_5240, 1176 F3_5260_5320, 1177 F1_5500_5700, 1178 F5_5745_5825), 1179 .chan11a_turbo = BM4(T1_5210_5210, 1180 T1_5250_5250, 1181 T1_5290_5290, 1182 T2_5760_5800), 1183 .chan11a_dyn_turbo = BM3(T1_5200_5240, T2_5280_5280, T1_5540_5660), 1184 }, 1185 1186 {.regDmnEnum = FCC4, 1187 .conformanceTestLimit = FCC, 1188 .dfsMask = DFS_FCC3, 1189 .pscan = PSCAN_FCC | PSCAN_FCC_T, 1190 .chan11a = BM1(F1_4950_4980), 1191 .chan11a_half = BM1(F1_4945_4985), 1192 .chan11a_quarter = BM1(F1_4942_4987), 1193 }, 1194 1195 /* FCC1 w/ 1/2 and 1/4 width channels */ 1196 {.regDmnEnum = FCC5, 1197 .conformanceTestLimit = FCC, 1198 .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 1199 .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 1200 .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 1201 .chan11a_half = BM3(F7_5180_5240, F7_5260_5320, F9_5745_5825), 1202 .chan11a_quarter = BM3(F8_5180_5240, F8_5260_5320,F10_5745_5825), 1203 }, 1204 1205 {.regDmnEnum = MKK1, 1206 .conformanceTestLimit = MKK, 1207 .pscan = PSCAN_MKK1, 1208 .flags = DISALLOW_ADHOC_11A_TURB, 1209 .chan11a = BM1(F1_5170_5230), 1210 }, 1211 1212 {.regDmnEnum = MKK2, 1213 .conformanceTestLimit = MKK, 1214 .pscan = PSCAN_MKK2, 1215 .flags = DISALLOW_ADHOC_11A_TURB, 1216 .chan11a = BM3(F1_4920_4980, F1_5040_5080, F1_5170_5230), 1217 .chan11a_half = BM4(F1_4915_4925, 1218 F1_4935_4945, 1219 F1_5035_5040, 1220 F1_5055_5055), 1221 }, 1222 1223 /* UNI-1 even */ 1224 {.regDmnEnum = MKK3, 1225 .conformanceTestLimit = MKK, 1226 .pscan = PSCAN_MKK3, 1227 .flags = DISALLOW_ADHOC_11A_TURB, 1228 .chan11a = BM1(F4_5180_5240), 1229 }, 1230 1231 /* UNI-1 even + UNI-2 */ 1232 {.regDmnEnum = MKK4, 1233 .conformanceTestLimit = MKK, 1234 .dfsMask = DFS_MKK4, 1235 .pscan = PSCAN_MKK3, 1236 .flags = DISALLOW_ADHOC_11A_TURB, 1237 .chan11a = BM2(F4_5180_5240, F2_5260_5320), 1238 }, 1239 1240 /* UNI-1 even + UNI-2 + mid-band */ 1241 {.regDmnEnum = MKK5, 1242 .conformanceTestLimit = MKK, 1243 .dfsMask = DFS_MKK4, 1244 .pscan = PSCAN_MKK3, 1245 .flags = DISALLOW_ADHOC_11A_TURB, 1246 .chan11a = BM3(F4_5180_5240, F2_5260_5320, F4_5500_5700), 1247 }, 1248 1249 /* UNI-1 odd + even */ 1250 {.regDmnEnum = MKK6, 1251 .conformanceTestLimit = MKK, 1252 .pscan = PSCAN_MKK1, 1253 .flags = DISALLOW_ADHOC_11A_TURB, 1254 .chan11a = BM2(F2_5170_5230, F4_5180_5240), 1255 }, 1256 1257 /* UNI-1 odd + UNI-1 even + UNI-2 */ 1258 {.regDmnEnum = MKK7, 1259 .conformanceTestLimit = MKK, 1260 .dfsMask = DFS_MKK4, 1261 .pscan = PSCAN_MKK1 | PSCAN_MKK3, 1262 .flags = DISALLOW_ADHOC_11A_TURB, 1263 .chan11a = BM3(F1_5170_5230, F4_5180_5240, F2_5260_5320), 1264 }, 1265 1266 /* UNI-1 odd + UNI-1 even + UNI-2 + mid-band */ 1267 {.regDmnEnum = MKK8, 1268 .conformanceTestLimit = MKK, 1269 .dfsMask = DFS_MKK4, 1270 .pscan = PSCAN_MKK1 | PSCAN_MKK3, 1271 .flags = DISALLOW_ADHOC_11A_TURB, 1272 .chan11a = BM4(F1_5170_5230, 1273 F4_5180_5240, 1274 F2_5260_5320, 1275 F4_5500_5700), 1276 }, 1277 1278 /* UNI-1 even + 4.9 GHZ */ 1279 {.regDmnEnum = MKK9, 1280 .conformanceTestLimit = MKK, 1281 .pscan = PSCAN_MKK3, 1282 .flags = DISALLOW_ADHOC_11A_TURB, 1283 .chan11a = BM7(F1_4915_4925, 1284 F1_4935_4945, 1285 F1_4920_4980, 1286 F1_5035_5040, 1287 F1_5055_5055, 1288 F1_5040_5080, 1289 F4_5180_5240), 1290 }, 1291 1292 /* UNI-1 even + UNI-2 + 4.9 GHZ */ 1293 {.regDmnEnum = MKK10, 1294 .conformanceTestLimit = MKK, 1295 .dfsMask = DFS_MKK4, 1296 .pscan = PSCAN_MKK3, 1297 .flags = DISALLOW_ADHOC_11A_TURB, 1298 .chan11a = BM8(F1_4915_4925, 1299 F1_4935_4945, 1300 F1_4920_4980, 1301 F1_5035_5040, 1302 F1_5055_5055, 1303 F1_5040_5080, 1304 F4_5180_5240, 1305 F2_5260_5320), 1306 }, 1307 1308 /* Defined here to use when 2G channels are authorised for country K2 */ 1309 {.regDmnEnum = APLD, 1310 .conformanceTestLimit = NO_CTL, 1311 .chan11b = BM2(F2_2312_2372,F2_2412_2472), 1312 .chan11g = BM2(G2_2312_2372,G2_2412_2472), 1313 }, 1314 1315 {.regDmnEnum = ETSIA, 1316 .conformanceTestLimit = NO_CTL, 1317 .pscan = PSCAN_ETSIA, 1318 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1319 .chan11b = BM1(F1_2457_2472), 1320 .chan11g = BM1(G1_2457_2472), 1321 .chan11g_turbo = BM1(T2_2437_2437) 1322 }, 1323 1324 {.regDmnEnum = ETSIB, 1325 .conformanceTestLimit = ETSI, 1326 .pscan = PSCAN_ETSIB, 1327 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1328 .chan11b = BM1(F1_2432_2442), 1329 .chan11g = BM1(G1_2432_2442), 1330 .chan11g_turbo = BM1(T2_2437_2437) 1331 }, 1332 1333 {.regDmnEnum = ETSIC, 1334 .conformanceTestLimit = ETSI, 1335 .pscan = PSCAN_ETSIC, 1336 .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 1337 .chan11b = BM1(F3_2412_2472), 1338 .chan11g = BM1(G3_2412_2472), 1339 .chan11g_turbo = BM1(T2_2437_2437) 1340 }, 1341 1342 {.regDmnEnum = FCCA, 1343 .conformanceTestLimit = FCC, 1344 .chan11b = BM1(F1_2412_2462), 1345 .chan11g = BM1(G1_2412_2462), 1346 .chan11g_turbo = BM1(T2_2437_2437), 1347 }, 1348 1349 /* FCCA w/ 1/2 and 1/4 width channels */ 1350 {.regDmnEnum = FCCB, 1351 .conformanceTestLimit = FCC, 1352 .chan11b = BM1(F1_2412_2462), 1353 .chan11g = BM1(G1_2412_2462), 1354 .chan11g_turbo = BM1(T2_2437_2437), 1355 .chan11g_half = BM1(G3_2412_2462), 1356 .chan11g_quarter = BM1(G4_2412_2462), 1357 }, 1358 1359 {.regDmnEnum = MKKA, 1360 .conformanceTestLimit = MKK, 1361 .pscan = PSCAN_MKKA | PSCAN_MKKA_G 1362 | PSCAN_MKKA1 | PSCAN_MKKA1_G 1363 | PSCAN_MKKA2 | PSCAN_MKKA2_G, 1364 .flags = DISALLOW_ADHOC_11A_TURB, 1365 .chan11b = BM3(F2_2412_2462, F1_2467_2472, F2_2484_2484), 1366 .chan11g = BM2(G2_2412_2462, G1_2467_2472), 1367 .chan11g_turbo = BM1(T2_2437_2437) 1368 }, 1369 1370 {.regDmnEnum = MKKC, 1371 .conformanceTestLimit = MKK, 1372 .chan11b = BM1(F2_2412_2472), 1373 .chan11g = BM1(G2_2412_2472), 1374 .chan11g_turbo = BM1(T2_2437_2437) 1375 }, 1376 1377 {.regDmnEnum = WORLD, 1378 .conformanceTestLimit = ETSI, 1379 .chan11b = BM1(F2_2412_2472), 1380 .chan11g = BM1(G2_2412_2472), 1381 .chan11g_turbo = BM1(T2_2437_2437) 1382 }, 1383 1384 {.regDmnEnum = WOR0_WORLD, 1385 .conformanceTestLimit = NO_CTL, 1386 .dfsMask = DFS_FCC3 | DFS_ETSI, 1387 .pscan = PSCAN_WWR, 1388 .flags = ADHOC_PER_11D, 1389 .chan11a = BM5(W1_5260_5320, 1390 W1_5180_5240, 1391 W1_5170_5230, 1392 W1_5745_5825, 1393 W1_5500_5700), 1394 .chan11a_turbo = BM3(WT1_5210_5250, 1395 WT1_5290_5290, 1396 WT1_5760_5800), 1397 .chan11b = BM8(W1_2412_2412, 1398 W1_2437_2442, 1399 W1_2462_2462, 1400 W1_2472_2472, 1401 W1_2417_2432, 1402 W1_2447_2457, 1403 W1_2467_2467, 1404 W1_2484_2484), 1405 .chan11g = BM7(WG1_2412_2412, 1406 WG1_2437_2442, 1407 WG1_2462_2462, 1408 WG1_2472_2472, 1409 WG1_2417_2432, 1410 WG1_2447_2457, 1411 WG1_2467_2467), 1412 .chan11g_turbo = BM1(T3_2437_2437) 1413 }, 1414 1415 {.regDmnEnum = WOR01_WORLD, 1416 .conformanceTestLimit = NO_CTL, 1417 .dfsMask = DFS_FCC3 | DFS_ETSI, 1418 .pscan = PSCAN_WWR, 1419 .flags = ADHOC_PER_11D, 1420 .chan11a = BM5(W1_5260_5320, 1421 W1_5180_5240, 1422 W1_5170_5230, 1423 W1_5745_5825, 1424 W1_5500_5700), 1425 .chan11a_turbo = BM3(WT1_5210_5250, 1426 WT1_5290_5290, 1427 WT1_5760_5800), 1428 .chan11b = BM5(W1_2412_2412, 1429 W1_2437_2442, 1430 W1_2462_2462, 1431 W1_2417_2432, 1432 W1_2447_2457), 1433 .chan11g = BM5(WG1_2412_2412, 1434 WG1_2437_2442, 1435 WG1_2462_2462, 1436 WG1_2417_2432, 1437 WG1_2447_2457), 1438 .chan11g_turbo = BM1(T3_2437_2437)}, 1439 1440 {.regDmnEnum = WOR02_WORLD, 1441 .conformanceTestLimit = NO_CTL, 1442 .dfsMask = DFS_FCC3 | DFS_ETSI, 1443 .pscan = PSCAN_WWR, 1444 .flags = ADHOC_PER_11D, 1445 .chan11a = BM5(W1_5260_5320, 1446 W1_5180_5240, 1447 W1_5170_5230, 1448 W1_5745_5825, 1449 W1_5500_5700), 1450 .chan11a_turbo = BM3(WT1_5210_5250, 1451 WT1_5290_5290, 1452 WT1_5760_5800), 1453 .chan11b = BM7(W1_2412_2412, 1454 W1_2437_2442, 1455 W1_2462_2462, 1456 W1_2472_2472, 1457 W1_2417_2432, 1458 W1_2447_2457, 1459 W1_2467_2467), 1460 .chan11g = BM7(WG1_2412_2412, 1461 WG1_2437_2442, 1462 WG1_2462_2462, 1463 WG1_2472_2472, 1464 WG1_2417_2432, 1465 WG1_2447_2457, 1466 WG1_2467_2467), 1467 .chan11g_turbo = BM1(T3_2437_2437)}, 1468 1469 {.regDmnEnum = EU1_WORLD, 1470 .conformanceTestLimit = NO_CTL, 1471 .dfsMask = DFS_FCC3 | DFS_ETSI, 1472 .pscan = PSCAN_WWR, 1473 .flags = ADHOC_PER_11D, 1474 .chan11a = BM5(W1_5260_5320, 1475 W1_5180_5240, 1476 W1_5170_5230, 1477 W1_5745_5825, 1478 W1_5500_5700), 1479 .chan11a_turbo = BM3(WT1_5210_5250, 1480 WT1_5290_5290, 1481 WT1_5760_5800), 1482 .chan11b = BM7(W1_2412_2412, 1483 W1_2437_2442, 1484 W1_2462_2462, 1485 W2_2472_2472, 1486 W1_2417_2432, 1487 W1_2447_2457, 1488 W2_2467_2467), 1489 .chan11g = BM7(WG1_2412_2412, 1490 WG1_2437_2442, 1491 WG1_2462_2462, 1492 WG2_2472_2472, 1493 WG1_2417_2432, 1494 WG1_2447_2457, 1495 WG2_2467_2467), 1496 .chan11g_turbo = BM1(T3_2437_2437)}, 1497 1498 {.regDmnEnum = WOR1_WORLD, 1499 .conformanceTestLimit = NO_CTL, 1500 .dfsMask = DFS_FCC3 | DFS_ETSI, 1501 .pscan = PSCAN_WWR, 1502 .flags = DISALLOW_ADHOC_11A, 1503 .chan11a = BM5(W1_5260_5320, 1504 W1_5180_5240, 1505 W1_5170_5230, 1506 W1_5745_5825, 1507 W1_5500_5700), 1508 .chan11b = BM8(W1_2412_2412, 1509 W1_2437_2442, 1510 W1_2462_2462, 1511 W1_2472_2472, 1512 W1_2417_2432, 1513 W1_2447_2457, 1514 W1_2467_2467, 1515 W1_2484_2484), 1516 .chan11g = BM7(WG1_2412_2412, 1517 WG1_2437_2442, 1518 WG1_2462_2462, 1519 WG1_2472_2472, 1520 WG1_2417_2432, 1521 WG1_2447_2457, 1522 WG1_2467_2467), 1523 .chan11g_turbo = BM1(T3_2437_2437) 1524 }, 1525 1526 {.regDmnEnum = WOR2_WORLD, 1527 .conformanceTestLimit = NO_CTL, 1528 .dfsMask = DFS_FCC3 | DFS_ETSI, 1529 .pscan = PSCAN_WWR, 1530 .flags = DISALLOW_ADHOC_11A, 1531 .chan11a = BM5(W1_5260_5320, 1532 W1_5180_5240, 1533 W1_5170_5230, 1534 W1_5745_5825, 1535 W1_5500_5700), 1536 .chan11a_turbo = BM3(WT1_5210_5250, 1537 WT1_5290_5290, 1538 WT1_5760_5800), 1539 .chan11b = BM8(W1_2412_2412, 1540 W1_2437_2442, 1541 W1_2462_2462, 1542 W1_2472_2472, 1543 W1_2417_2432, 1544 W1_2447_2457, 1545 W1_2467_2467, 1546 W1_2484_2484), 1547 .chan11g = BM7(WG1_2412_2412, 1548 WG1_2437_2442, 1549 WG1_2462_2462, 1550 WG1_2472_2472, 1551 WG1_2417_2432, 1552 WG1_2447_2457, 1553 WG1_2467_2467), 1554 .chan11g_turbo = BM1(T3_2437_2437)}, 1555 1556 {.regDmnEnum = WOR3_WORLD, 1557 .conformanceTestLimit = NO_CTL, 1558 .dfsMask = DFS_FCC3 | DFS_ETSI, 1559 .pscan = PSCAN_WWR, 1560 .flags = ADHOC_PER_11D, 1561 .chan11a = BM4(W1_5260_5320, 1562 W1_5180_5240, 1563 W1_5170_5230, 1564 W1_5745_5825), 1565 .chan11a_turbo = BM3(WT1_5210_5250, 1566 WT1_5290_5290, 1567 WT1_5760_5800), 1568 .chan11b = BM7(W1_2412_2412, 1569 W1_2437_2442, 1570 W1_2462_2462, 1571 W1_2472_2472, 1572 W1_2417_2432, 1573 W1_2447_2457, 1574 W1_2467_2467), 1575 .chan11g = BM7(WG1_2412_2412, 1576 WG1_2437_2442, 1577 WG1_2462_2462, 1578 WG1_2472_2472, 1579 WG1_2417_2432, 1580 WG1_2447_2457, 1581 WG1_2467_2467), 1582 .chan11g_turbo = BM1(T3_2437_2437)}, 1583 1584 {.regDmnEnum = WOR4_WORLD, 1585 .conformanceTestLimit = NO_CTL, 1586 .dfsMask = DFS_FCC3 | DFS_ETSI, 1587 .pscan = PSCAN_WWR, 1588 .flags = DISALLOW_ADHOC_11A, 1589 .chan11a = BM4(W2_5260_5320, 1590 W2_5180_5240, 1591 F2_5745_5805, 1592 W2_5825_5825), 1593 .chan11a_turbo = BM3(WT1_5210_5250, 1594 WT1_5290_5290, 1595 WT1_5760_5800), 1596 .chan11b = BM5(W1_2412_2412, 1597 W1_2437_2442, 1598 W1_2462_2462, 1599 W1_2417_2432, 1600 W1_2447_2457), 1601 .chan11g = BM5(WG1_2412_2412, 1602 WG1_2437_2442, 1603 WG1_2462_2462, 1604 WG1_2417_2432, 1605 WG1_2447_2457), 1606 .chan11g_turbo = BM1(T3_2437_2437)}, 1607 1608 {.regDmnEnum = WOR5_ETSIC, 1609 .conformanceTestLimit = NO_CTL, 1610 .dfsMask = DFS_FCC3 | DFS_ETSI, 1611 .pscan = PSCAN_WWR, 1612 .flags = DISALLOW_ADHOC_11A, 1613 .chan11a = BM3(W1_5260_5320, W2_5180_5240, F6_5745_5825), 1614 .chan11b = BM7(W1_2412_2412, 1615 W1_2437_2442, 1616 W1_2462_2462, 1617 W2_2472_2472, 1618 W1_2417_2432, 1619 W1_2447_2457, 1620 W2_2467_2467), 1621 .chan11g = BM7(WG1_2412_2412, 1622 WG1_2437_2442, 1623 WG1_2462_2462, 1624 WG2_2472_2472, 1625 WG1_2417_2432, 1626 WG1_2447_2457, 1627 WG2_2467_2467), 1628 .chan11g_turbo = BM1(T3_2437_2437)}, 1629 1630 {.regDmnEnum = WOR9_WORLD, 1631 .conformanceTestLimit = NO_CTL, 1632 .dfsMask = DFS_FCC3 | DFS_ETSI, 1633 .pscan = PSCAN_WWR, 1634 .flags = DISALLOW_ADHOC_11A, 1635 .chan11a = BM4(W1_5260_5320, 1636 W1_5180_5240, 1637 W1_5745_5825, 1638 W1_5500_5700), 1639 .chan11a_turbo = BM3(WT1_5210_5250, 1640 WT1_5290_5290, 1641 WT1_5760_5800), 1642 .chan11b = BM5(W1_2412_2412, 1643 W1_2437_2442, 1644 W1_2462_2462, 1645 W1_2417_2432, 1646 W1_2447_2457), 1647 .chan11g = BM5(WG1_2412_2412, 1648 WG1_2437_2442, 1649 WG1_2462_2462, 1650 WG1_2417_2432, 1651 WG1_2447_2457), 1652 .chan11g_turbo = BM1(T3_2437_2437)}, 1653 1654 {.regDmnEnum = WORA_WORLD, 1655 .conformanceTestLimit = NO_CTL, 1656 .dfsMask = DFS_FCC3 | DFS_ETSI, 1657 .pscan = PSCAN_WWR, 1658 .flags = DISALLOW_ADHOC_11A, 1659 .chan11a = BM4(W1_5260_5320, 1660 W1_5180_5240, 1661 W1_5745_5825, 1662 W1_5500_5700), 1663 .chan11b = BM7(W1_2412_2412, 1664 W1_2437_2442, 1665 W1_2462_2462, 1666 W1_2472_2472, 1667 W1_2417_2432, 1668 W1_2447_2457, 1669 W1_2467_2467), 1670 .chan11g = BM7(WG1_2412_2412, 1671 WG1_2437_2442, 1672 WG1_2462_2462, 1673 WG1_2472_2472, 1674 WG1_2417_2432, 1675 WG1_2447_2457, 1676 WG1_2467_2467), 1677 .chan11g_turbo = BM1(T3_2437_2437)}, 1678 1679 {.regDmnEnum = NULL1, 1680 .conformanceTestLimit = NO_CTL, 1681 } 1682}; 1683 1684struct cmode { 1685 u_int mode; 1686 u_int flags; 1687}; 1688 1689static const struct cmode modes[] = { 1690 { HAL_MODE_TURBO, IEEE80211_CHAN_ST }, 1691 { HAL_MODE_11A, IEEE80211_CHAN_A }, 1692 { HAL_MODE_11B, IEEE80211_CHAN_B }, 1693 { HAL_MODE_11G, IEEE80211_CHAN_G }, 1694 { HAL_MODE_11G_TURBO, IEEE80211_CHAN_108G }, 1695 { HAL_MODE_11A_TURBO, IEEE80211_CHAN_108A }, 1696 { HAL_MODE_11A_QUARTER_RATE, 1697 IEEE80211_CHAN_A | IEEE80211_CHAN_QUARTER }, 1698 { HAL_MODE_11A_HALF_RATE, 1699 IEEE80211_CHAN_A | IEEE80211_CHAN_HALF }, 1700 { HAL_MODE_11G_QUARTER_RATE, 1701 IEEE80211_CHAN_G | IEEE80211_CHAN_QUARTER }, 1702 { HAL_MODE_11G_HALF_RATE, 1703 IEEE80211_CHAN_G | IEEE80211_CHAN_HALF }, 1704 { HAL_MODE_11NG_HT20, IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_HT20 }, 1705 { HAL_MODE_11NG_HT40PLUS, 1706 IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_HT40U }, 1707 { HAL_MODE_11NG_HT40MINUS, 1708 IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_HT40D }, 1709 { HAL_MODE_11NA_HT20, IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT20 }, 1710 { HAL_MODE_11NA_HT40PLUS, 1711 IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT40U }, 1712 { HAL_MODE_11NA_HT40MINUS, 1713 IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT40D }, 1714}; 1715 1716static OS_INLINE uint16_t 1717getEepromRD(struct ath_hal *ah) 1718{ 1719 return AH_PRIVATE(ah)->ah_currentRD &~ WORLDWIDE_ROAMING_FLAG; 1720} 1721 1722/* 1723 * Test to see if the bitmask array is all zeros 1724 */ 1725static HAL_BOOL 1726isChanBitMaskZero(const uint64_t *bitmask) 1727{ 1728#if BMLEN > 2 1729#error "add more cases" 1730#endif 1731#if BMLEN > 1 1732 if (bitmask[1] != 0) 1733 return AH_FALSE; 1734#endif 1735 return (bitmask[0] == 0); 1736} 1737 1738/* 1739 * Return whether or not the regulatory domain/country in EEPROM 1740 * is acceptable. 1741 */ 1742static HAL_BOOL 1743isEepromValid(struct ath_hal *ah) 1744{ 1745 uint16_t rd = getEepromRD(ah); 1746 int i; 1747 1748 if (rd & COUNTRY_ERD_FLAG) { 1749 uint16_t cc = rd &~ COUNTRY_ERD_FLAG; 1750 for (i = 0; i < N(allCountries); i++) 1751 if (allCountries[i].countryCode == cc) 1752 return AH_TRUE; 1753 } else { 1754 for (i = 0; i < N(regDomainPairs); i++) 1755 if (regDomainPairs[i].regDmnEnum == rd) 1756 return AH_TRUE; 1757 } 1758 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1759 "%s: invalid regulatory domain/country code 0x%x\n", __func__, rd); 1760 return AH_FALSE; 1761} 1762 1763/* 1764 * Find the pointer to the country element in the country table 1765 * corresponding to the country code 1766 */ 1767static COUNTRY_CODE_TO_ENUM_RD* 1768findCountry(HAL_CTRY_CODE countryCode) 1769{ 1770 int i; 1771 1772 for (i = 0; i < N(allCountries); i++) { 1773 if (allCountries[i].countryCode == countryCode) 1774 return &allCountries[i]; 1775 } 1776 return AH_NULL; 1777} 1778 1779static REG_DOMAIN * 1780findRegDmn(int regDmn) 1781{ 1782 int i; 1783 1784 for (i = 0; i < N(regDomains); i++) { 1785 if (regDomains[i].regDmnEnum == regDmn) 1786 return ®Domains[i]; 1787 } 1788 return AH_NULL; 1789} 1790 1791static REG_DMN_PAIR_MAPPING * 1792findRegDmnPair(int regDmnPair) 1793{ 1794 int i; 1795 1796 if (regDmnPair != NO_ENUMRD) { 1797 for (i = 0; i < N(regDomainPairs); i++) { 1798 if (regDomainPairs[i].regDmnEnum == regDmnPair) 1799 return ®DomainPairs[i]; 1800 } 1801 } 1802 return AH_NULL; 1803} 1804 1805/* 1806 * Calculate a default country based on the EEPROM setting. 1807 */ 1808static HAL_CTRY_CODE 1809getDefaultCountry(struct ath_hal *ah) 1810{ 1811 REG_DMN_PAIR_MAPPING *regpair; 1812 uint16_t rd; 1813 1814 rd = getEepromRD(ah); 1815 if (rd & COUNTRY_ERD_FLAG) { 1816 COUNTRY_CODE_TO_ENUM_RD *country; 1817 uint16_t cc = rd & ~COUNTRY_ERD_FLAG; 1818 country = findCountry(cc); 1819 if (country != AH_NULL) 1820 return cc; 1821 } 1822 /* 1823 * Check reg domains that have only one country 1824 */ 1825 regpair = findRegDmnPair(rd); 1826 return (regpair != AH_NULL) ? regpair->singleCC : CTRY_DEFAULT; 1827} 1828 1829static HAL_BOOL 1830IS_BIT_SET(int bit, const uint64_t bitmask[]) 1831{ 1832 int byteOffset, bitnum; 1833 uint64_t val; 1834 1835 byteOffset = bit/64; 1836 bitnum = bit - byteOffset*64; 1837 val = ((uint64_t) 1) << bitnum; 1838 return (bitmask[byteOffset] & val) != 0; 1839} 1840 1841static HAL_STATUS 1842getregstate(struct ath_hal *ah, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 1843 COUNTRY_CODE_TO_ENUM_RD **pcountry, 1844 REG_DOMAIN **prd2GHz, REG_DOMAIN **prd5GHz) 1845{ 1846 COUNTRY_CODE_TO_ENUM_RD *country; 1847 REG_DOMAIN *rd5GHz, *rd2GHz; 1848 1849 if (cc == CTRY_DEFAULT && regDmn == SKU_NONE) { 1850 /* 1851 * Validate the EEPROM setting and setup defaults 1852 */ 1853 if (!isEepromValid(ah)) { 1854 /* 1855 * Don't return any channels if the EEPROM has an 1856 * invalid regulatory domain/country code setting. 1857 */ 1858 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1859 "%s: invalid EEPROM contents\n",__func__); 1860 return HAL_EEBADREG; 1861 } 1862 1863 cc = getDefaultCountry(ah); 1864 country = findCountry(cc); 1865 if (country == AH_NULL) { 1866 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1867 "NULL Country!, cc %d\n", cc); 1868 return HAL_EEBADCC; 1869 } 1870 regDmn = country->regDmnEnum; 1871 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: EEPROM cc %u rd 0x%x\n", 1872 __func__, cc, regDmn); 1873 1874 if (country->countryCode == CTRY_DEFAULT) { 1875 /* 1876 * Check EEPROM; SKU may be for a country, single 1877 * domain, or multiple domains (WWR). 1878 */ 1879 uint16_t rdnum = getEepromRD(ah); 1880 if ((rdnum & COUNTRY_ERD_FLAG) == 0 && 1881 (findRegDmn(rdnum) != AH_NULL || 1882 findRegDmnPair(rdnum) != AH_NULL)) { 1883 regDmn = rdnum; 1884 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1885 "%s: EEPROM rd 0x%x\n", __func__, rdnum); 1886 } 1887 } 1888 } else { 1889 country = findCountry(cc); 1890 if (country == AH_NULL) { 1891 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1892 "unknown country, cc %d\n", cc); 1893 return HAL_EINVAL; 1894 } 1895 if (regDmn == SKU_NONE) 1896 regDmn = country->regDmnEnum; 1897 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u rd 0x%x\n", 1898 __func__, cc, regDmn); 1899 } 1900 1901 /* 1902 * Setup per-band state. 1903 */ 1904 if ((regDmn & MULTI_DOMAIN_MASK) == 0) { 1905 REG_DMN_PAIR_MAPPING *regpair = findRegDmnPair(regDmn); 1906 if (regpair == AH_NULL) { 1907 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1908 "%s: no reg domain pair %u for country %u\n", 1909 __func__, regDmn, country->countryCode); 1910 return HAL_EINVAL; 1911 } 1912 rd5GHz = findRegDmn(regpair->regDmn5GHz); 1913 if (rd5GHz == AH_NULL) { 1914 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1915 "%s: no 5GHz reg domain %u for country %u\n", 1916 __func__, regpair->regDmn5GHz, country->countryCode); 1917 return HAL_EINVAL; 1918 } 1919 rd2GHz = findRegDmn(regpair->regDmn2GHz); 1920 if (rd2GHz == AH_NULL) { 1921 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1922 "%s: no 2GHz reg domain %u for country %u\n", 1923 __func__, regpair->regDmn2GHz, country->countryCode); 1924 return HAL_EINVAL; 1925 } 1926 } else { 1927 rd5GHz = rd2GHz = findRegDmn(regDmn); 1928 if (rd2GHz == AH_NULL) { 1929 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1930 "%s: no unitary reg domain %u for country %u\n", 1931 __func__, regDmn, country->countryCode); 1932 return HAL_EINVAL; 1933 } 1934 } 1935 if (pcountry != AH_NULL) 1936 *pcountry = country; 1937 *prd2GHz = rd2GHz; 1938 *prd5GHz = rd5GHz; 1939 return HAL_OK; 1940} 1941 1942/* 1943 * Construct the channel list for the specified regulatory config. 1944 */ 1945static HAL_STATUS 1946getchannels(struct ath_hal *ah, 1947 struct ieee80211_channel chans[], u_int maxchans, int *nchans, 1948 u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 1949 HAL_BOOL enableExtendedChannels, 1950 COUNTRY_CODE_TO_ENUM_RD **pcountry, 1951 REG_DOMAIN **prd2GHz, REG_DOMAIN **prd5GHz) 1952{ 1953#define CHANNEL_HALF_BW 10 1954#define CHANNEL_QUARTER_BW 5 1955#define HAL_MODE_11A_ALL \ 1956 (HAL_MODE_11A | HAL_MODE_11A_TURBO | HAL_MODE_TURBO | \ 1957 HAL_MODE_11A_QUARTER_RATE | HAL_MODE_11A_HALF_RATE) 1958 REG_DOMAIN *rd5GHz, *rd2GHz; 1959 u_int modesAvail; 1960 const struct cmode *cm; 1961 struct ieee80211_channel *ic; 1962 int next, b; 1963 HAL_STATUS status; 1964 1965 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u regDmn 0x%x mode 0x%x%s\n", 1966 __func__, cc, regDmn, modeSelect, 1967 enableExtendedChannels ? " ecm" : ""); 1968 1969 status = getregstate(ah, cc, regDmn, pcountry, &rd2GHz, &rd5GHz); 1970 if (status != HAL_OK) 1971 return status; 1972 1973 /* get modes that HW is capable of */ 1974 modesAvail = ath_hal_getWirelessModes(ah); 1975 /* optimize work below if no 11a channels */ 1976 if (isChanBitMaskZero(rd5GHz->chan11a) && 1977 (modesAvail & HAL_MODE_11A_ALL)) { 1978 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1979 "%s: disallow all 11a\n", __func__); 1980 modesAvail &= ~HAL_MODE_11A_ALL; 1981 } 1982 1983 next = 0; 1984 ic = &chans[0]; 1985 for (cm = modes; cm < &modes[N(modes)]; cm++) { 1986 uint16_t c, c_hi, c_lo; 1987 uint64_t *channelBM = AH_NULL; 1988 REG_DMN_FREQ_BAND *fband = AH_NULL,*freqs; 1989 int low_adj, hi_adj, channelSep, lastc; 1990 uint32_t rdflags; 1991 uint64_t dfsMask; 1992 uint64_t pscan; 1993 1994 if ((cm->mode & modeSelect) == 0) { 1995 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 1996 "%s: skip mode 0x%x flags 0x%x\n", 1997 __func__, cm->mode, cm->flags); 1998 continue; 1999 } 2000 if ((cm->mode & modesAvail) == 0) { 2001 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2002 "%s: !avail mode 0x%x (0x%x) flags 0x%x\n", 2003 __func__, modesAvail, cm->mode, cm->flags); 2004 continue; 2005 } 2006 if (!ath_hal_getChannelEdges(ah, cm->flags, &c_lo, &c_hi)) { 2007 /* channel not supported by hardware, skip it */ 2008 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2009 "%s: channels 0x%x not supported by hardware\n", 2010 __func__,cm->flags); 2011 continue; 2012 } 2013 switch (cm->mode) { 2014 case HAL_MODE_TURBO: 2015 case HAL_MODE_11A_TURBO: 2016 rdflags = rd5GHz->flags; 2017 dfsMask = rd5GHz->dfsMask; 2018 pscan = rd5GHz->pscan; 2019 if (cm->mode == HAL_MODE_TURBO) 2020 channelBM = rd5GHz->chan11a_turbo; 2021 else 2022 channelBM = rd5GHz->chan11a_dyn_turbo; 2023 freqs = ®Dmn5GhzTurboFreq[0]; 2024 break; 2025 case HAL_MODE_11G_TURBO: 2026 rdflags = rd2GHz->flags; 2027 dfsMask = rd2GHz->dfsMask; 2028 pscan = rd2GHz->pscan; 2029 channelBM = rd2GHz->chan11g_turbo; 2030 freqs = ®Dmn2Ghz11gTurboFreq[0]; 2031 break; 2032 case HAL_MODE_11A: 2033 case HAL_MODE_11A_HALF_RATE: 2034 case HAL_MODE_11A_QUARTER_RATE: 2035 case HAL_MODE_11NA_HT20: 2036 case HAL_MODE_11NA_HT40PLUS: 2037 case HAL_MODE_11NA_HT40MINUS: 2038 rdflags = rd5GHz->flags; 2039 dfsMask = rd5GHz->dfsMask; 2040 pscan = rd5GHz->pscan; 2041 if (cm->mode == HAL_MODE_11A_HALF_RATE) 2042 channelBM = rd5GHz->chan11a_half; 2043 else if (cm->mode == HAL_MODE_11A_QUARTER_RATE) 2044 channelBM = rd5GHz->chan11a_quarter; 2045 else 2046 channelBM = rd5GHz->chan11a; 2047 freqs = ®Dmn5GhzFreq[0]; 2048 break; 2049 case HAL_MODE_11B: 2050 case HAL_MODE_11G: 2051 case HAL_MODE_11G_HALF_RATE: 2052 case HAL_MODE_11G_QUARTER_RATE: 2053 case HAL_MODE_11NG_HT20: 2054 case HAL_MODE_11NG_HT40PLUS: 2055 case HAL_MODE_11NG_HT40MINUS: 2056 rdflags = rd2GHz->flags; 2057 dfsMask = rd2GHz->dfsMask; 2058 pscan = rd2GHz->pscan; 2059 if (cm->mode == HAL_MODE_11G_HALF_RATE) 2060 channelBM = rd2GHz->chan11g_half; 2061 else if (cm->mode == HAL_MODE_11G_QUARTER_RATE) 2062 channelBM = rd2GHz->chan11g_quarter; 2063 else if (cm->mode == HAL_MODE_11B) 2064 channelBM = rd2GHz->chan11b; 2065 else 2066 channelBM = rd2GHz->chan11g; 2067 if (cm->mode == HAL_MODE_11B) 2068 freqs = ®Dmn2GhzFreq[0]; 2069 else 2070 freqs = ®Dmn2Ghz11gFreq[0]; 2071 break; 2072 default: 2073 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2074 "%s: Unkonwn HAL mode 0x%x\n", __func__, cm->mode); 2075 continue; 2076 } 2077 if (isChanBitMaskZero(channelBM)) 2078 continue; 2079 /* 2080 * Setup special handling for HT40 channels; e.g. 2081 * 5G HT40 channels require 40Mhz channel separation. 2082 */ 2083 hi_adj = (cm->mode == HAL_MODE_11NA_HT40PLUS || 2084 cm->mode == HAL_MODE_11NG_HT40PLUS) ? -20 : 0; 2085 low_adj = (cm->mode == HAL_MODE_11NA_HT40MINUS || 2086 cm->mode == HAL_MODE_11NG_HT40MINUS) ? 20 : 0; 2087 channelSep = (cm->mode == HAL_MODE_11NA_HT40PLUS || 2088 cm->mode == HAL_MODE_11NA_HT40MINUS) ? 40 : 0; 2089 2090 for (b = 0; b < 64*BMLEN; b++) { 2091 if (!IS_BIT_SET(b, channelBM)) 2092 continue; 2093 fband = &freqs[b]; 2094 lastc = 0; 2095 2096 for (c = fband->lowChannel + low_adj; 2097 c <= fband->highChannel + hi_adj; 2098 c += fband->channelSep) { 2099 if (!(c_lo <= c && c <= c_hi)) { 2100 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2101 "%s: c %u out of range [%u..%u]\n", 2102 __func__, c, c_lo, c_hi); 2103 continue; 2104 } 2105 if (next >= maxchans){ 2106 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2107 "%s: too many channels for channel table\n", 2108 __func__); 2109 goto done; 2110 } 2111 if ((fband->usePassScan & IS_ECM_CHAN) && 2112 !enableExtendedChannels) { 2113 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2114 "skip ecm channel\n"); 2115 continue; 2116 } 2117 if ((fband->useDfs & dfsMask) && 2118 (cm->flags & IEEE80211_CHAN_HT40)) { 2119 /* NB: DFS and HT40 don't mix */ 2120 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2121 "skip HT40 chan, DFS required\n"); 2122 continue; 2123 } 2124 /* 2125 * Make sure that channel separation 2126 * meets the requirement. 2127 */ 2128 if (lastc && channelSep && 2129 (c-lastc) < channelSep) 2130 continue; 2131 lastc = c; 2132 2133 OS_MEMZERO(ic, sizeof(*ic)); 2134 ic->ic_freq = c; 2135 ic->ic_flags = cm->flags; 2136 ic->ic_maxregpower = fband->powerDfs; 2137 ath_hal_getpowerlimits(ah, ic); 2138 ic->ic_maxantgain = fband->antennaMax; 2139 if (fband->usePassScan & pscan) 2140 ic->ic_flags |= IEEE80211_CHAN_PASSIVE; 2141 if (fband->useDfs & dfsMask) 2142 ic->ic_flags |= IEEE80211_CHAN_DFS; 2143 if (IEEE80211_IS_CHAN_5GHZ(ic) && 2144 (rdflags & DISALLOW_ADHOC_11A)) 2145 ic->ic_flags |= IEEE80211_CHAN_NOADHOC; 2146 if (IEEE80211_IS_CHAN_TURBO(ic) && 2147 (rdflags & DISALLOW_ADHOC_11A_TURB)) 2148 ic->ic_flags |= IEEE80211_CHAN_NOADHOC; 2149 if (rdflags & NO_HOSTAP) 2150 ic->ic_flags |= IEEE80211_CHAN_NOHOSTAP; 2151 if (rdflags & LIMIT_FRAME_4MS) 2152 ic->ic_flags |= IEEE80211_CHAN_4MSXMIT; 2153 if (rdflags & NEED_NFC) 2154 ic->ic_flags |= CHANNEL_NFCREQUIRED; 2155 2156 ic++, next++; 2157 } 2158 } 2159 } 2160done: 2161 *nchans = next; 2162 /* NB: pcountry set above by getregstate */ 2163 if (prd2GHz != AH_NULL) 2164 *prd2GHz = rd2GHz; 2165 if (prd5GHz != AH_NULL) 2166 *prd5GHz = rd5GHz; 2167 return HAL_OK; 2168#undef HAL_MODE_11A_ALL 2169#undef CHANNEL_HALF_BW 2170#undef CHANNEL_QUARTER_BW 2171} 2172 2173/* 2174 * Retrieve a channel list without affecting runtime state. 2175 */ 2176HAL_STATUS 2177ath_hal_getchannels(struct ath_hal *ah, 2178 struct ieee80211_channel chans[], u_int maxchans, int *nchans, 2179 u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 2180 HAL_BOOL enableExtendedChannels) 2181{ 2182 return getchannels(ah, chans, maxchans, nchans, modeSelect, 2183 cc, regDmn, enableExtendedChannels, AH_NULL, AH_NULL, AH_NULL); 2184} 2185 2186/* 2187 * Handle frequency mapping from 900Mhz range to 2.4GHz range 2188 * for GSM radios. This is done when we need the h/w frequency 2189 * and the channel is marked IEEE80211_CHAN_GSM. 2190 */ 2191static int 2192ath_hal_mapgsm(int sku, int freq) 2193{ 2194 if (sku == SKU_XR9) 2195 return 1520 + freq; 2196 if (sku == SKU_GZ901) 2197 return 1544 + freq; 2198 if (sku == SKU_SR9) 2199 return 3344 - freq; 2200 HALDEBUG(AH_NULL, HAL_DEBUG_ANY, 2201 "%s: cannot map freq %u unknown gsm sku %u\n", 2202 __func__, freq, sku); 2203 return freq; 2204} 2205 2206/* 2207 * Setup the internal/private channel state given a table of 2208 * net80211 channels. We collapse entries for the same frequency 2209 * and record the frequency for doing noise floor processing 2210 * where we don't have net80211 channel context. 2211 */ 2212static HAL_BOOL 2213assignPrivateChannels(struct ath_hal *ah, 2214 struct ieee80211_channel chans[], int nchans, int sku) 2215{ 2216 HAL_CHANNEL_INTERNAL *ic; 2217 int i, j, next, freq; 2218 2219 next = 0; 2220 for (i = 0; i < nchans; i++) { 2221 struct ieee80211_channel *c = &chans[i]; 2222 for (j = i-1; j >= 0; j--) 2223 if (chans[j].ic_freq == c->ic_freq) { 2224 c->ic_devdata = chans[j].ic_devdata; 2225 break; 2226 } 2227 if (j < 0) { 2228 /* new entry, assign a private channel entry */ 2229 if (next >= N(AH_PRIVATE(ah)->ah_channels)) { 2230 HALDEBUG(ah, HAL_DEBUG_ANY, 2231 "%s: too many channels, max %zu\n", 2232 __func__, N(AH_PRIVATE(ah)->ah_channels)); 2233 return AH_FALSE; 2234 } 2235 /* 2236 * Handle frequency mapping for 900MHz devices. 2237 * The hardware uses 2.4GHz frequencies that are 2238 * down-converted. The 802.11 layer uses the 2239 * true frequencies. 2240 */ 2241 freq = IEEE80211_IS_CHAN_GSM(c) ? 2242 ath_hal_mapgsm(sku, c->ic_freq) : c->ic_freq; 2243 2244 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 2245 "%s: private[%3u] %u/0x%x -> channel %u\n", 2246 __func__, next, c->ic_freq, c->ic_flags, freq); 2247 2248 ic = &AH_PRIVATE(ah)->ah_channels[next]; 2249 /* 2250 * NB: This clears privFlags which means ancillary 2251 * code like ANI and IQ calibration will be 2252 * restarted and re-setup any per-channel state. 2253 */ 2254 OS_MEMZERO(ic, sizeof(*ic)); 2255 ic->channel = freq; 2256 c->ic_devdata = next; 2257 next++; 2258 } 2259 } 2260 AH_PRIVATE(ah)->ah_nchan = next; 2261 HALDEBUG(ah, HAL_DEBUG_ANY, "%s: %u public, %u private channels\n", 2262 __func__, nchans, next); 2263 return AH_TRUE; 2264} 2265 2266/* 2267 * Setup the channel list based on the information in the EEPROM. 2268 */ 2269HAL_STATUS 2270ath_hal_init_channels(struct ath_hal *ah, 2271 struct ieee80211_channel chans[], u_int maxchans, int *nchans, 2272 u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 2273 HAL_BOOL enableExtendedChannels) 2274{ 2275 COUNTRY_CODE_TO_ENUM_RD *country; 2276 REG_DOMAIN *rd5GHz, *rd2GHz; 2277 HAL_STATUS status; 2278 2279 status = getchannels(ah, chans, maxchans, nchans, modeSelect, 2280 cc, regDmn, enableExtendedChannels, &country, &rd2GHz, &rd5GHz); 2281 if (status == HAL_OK && 2282 assignPrivateChannels(ah, chans, *nchans, AH_PRIVATE(ah)->ah_currentRD)) { 2283 AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz; 2284 AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz; 2285 2286 ah->ah_countryCode = country->countryCode; 2287 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n", 2288 __func__, ah->ah_countryCode); 2289 } else 2290 status = HAL_EINVAL; 2291 return status; 2292} 2293 2294/* 2295 * Set the channel list. 2296 */ 2297HAL_STATUS 2298ath_hal_set_channels(struct ath_hal *ah, 2299 struct ieee80211_channel chans[], int nchans, 2300 HAL_CTRY_CODE cc, HAL_REG_DOMAIN rd) 2301{ 2302 COUNTRY_CODE_TO_ENUM_RD *country; 2303 REG_DOMAIN *rd5GHz, *rd2GHz; 2304 HAL_STATUS status; 2305 2306 switch (rd) { 2307 case SKU_SR9: 2308 case SKU_XR9: 2309 case SKU_GZ901: 2310 /* 2311 * Map 900MHz sku's. The frequencies will be mapped 2312 * according to the sku to compensate for the down-converter. 2313 * We use the FCC for these sku's as the mapped channel 2314 * list is known compatible (will need to change if/when 2315 * vendors do different mapping in different locales). 2316 */ 2317 status = getregstate(ah, CTRY_DEFAULT, SKU_FCC, 2318 &country, &rd2GHz, &rd5GHz); 2319 break; 2320 default: 2321 status = getregstate(ah, cc, rd, 2322 &country, &rd2GHz, &rd5GHz); 2323 rd = AH_PRIVATE(ah)->ah_currentRD; 2324 break; 2325 } 2326 if (status == HAL_OK && assignPrivateChannels(ah, chans, nchans, rd)) { 2327 AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz; 2328 AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz; 2329 2330 ah->ah_countryCode = country->countryCode; 2331 HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n", 2332 __func__, ah->ah_countryCode); 2333 } else 2334 status = HAL_EINVAL; 2335 return status; 2336} 2337 2338#ifdef AH_DEBUG 2339/* 2340 * Return the internal channel corresponding to a public channel. 2341 * NB: normally this routine is inline'd (see ah_internal.h) 2342 */ 2343HAL_CHANNEL_INTERNAL * 2344ath_hal_checkchannel(struct ath_hal *ah, const struct ieee80211_channel *c) 2345{ 2346 HAL_CHANNEL_INTERNAL *cc = &AH_PRIVATE(ah)->ah_channels[c->ic_devdata]; 2347 2348 if (c->ic_devdata < AH_PRIVATE(ah)->ah_nchan && 2349 (c->ic_freq == cc->channel || IEEE80211_IS_CHAN_GSM(c))) 2350 return cc; 2351 if (c->ic_devdata >= AH_PRIVATE(ah)->ah_nchan) { 2352 HALDEBUG(ah, HAL_DEBUG_ANY, 2353 "%s: bad mapping, devdata %u nchans %u\n", 2354 __func__, c->ic_devdata, AH_PRIVATE(ah)->ah_nchan); 2355 HALASSERT(c->ic_devdata < AH_PRIVATE(ah)->ah_nchan); 2356 } else { 2357 HALDEBUG(ah, HAL_DEBUG_ANY, 2358 "%s: no match for %u/0x%x devdata %u channel %u\n", 2359 __func__, c->ic_freq, c->ic_flags, c->ic_devdata, 2360 cc->channel); 2361 HALASSERT(c->ic_freq == cc->channel || IEEE80211_IS_CHAN_GSM(c)); 2362 } 2363 return AH_NULL; 2364} 2365#endif /* AH_DEBUG */ 2366 2367#define isWwrSKU(_ah) \ 2368 ((getEepromRD((_ah)) & WORLD_SKU_MASK) == WORLD_SKU_PREFIX || \ 2369 getEepromRD(_ah) == WORLD) 2370 2371/* 2372 * Return the test group for the specific channel based on 2373 * the current regulatory setup. 2374 */ 2375u_int 2376ath_hal_getctl(struct ath_hal *ah, const struct ieee80211_channel *c) 2377{ 2378 u_int ctl; 2379 2380 if (AH_PRIVATE(ah)->ah_rd2GHz == AH_PRIVATE(ah)->ah_rd5GHz || 2381 (ah->ah_countryCode == CTRY_DEFAULT && isWwrSKU(ah))) 2382 ctl = SD_NO_CTL; 2383 else if (IEEE80211_IS_CHAN_2GHZ(c)) 2384 ctl = AH_PRIVATE(ah)->ah_rd2GHz->conformanceTestLimit; 2385 else 2386 ctl = AH_PRIVATE(ah)->ah_rd5GHz->conformanceTestLimit; 2387 if (IEEE80211_IS_CHAN_B(c)) 2388 return ctl | CTL_11B; 2389 if (IEEE80211_IS_CHAN_G(c)) 2390 return ctl | CTL_11G; 2391 if (IEEE80211_IS_CHAN_108G(c)) 2392 return ctl | CTL_108G; 2393 if (IEEE80211_IS_CHAN_TURBO(c)) 2394 return ctl | CTL_TURBO; 2395 if (IEEE80211_IS_CHAN_A(c)) 2396 return ctl | CTL_11A; 2397 return ctl; 2398} 2399 2400/* 2401 * Return the max allowed antenna gain and apply any regulatory 2402 * domain specific changes. 2403 * 2404 * NOTE: a negative reduction is possible in RD's that only 2405 * measure radiated power (e.g., ETSI) which would increase 2406 * that actual conducted output power (though never beyond 2407 * the calibrated target power). 2408 */ 2409u_int 2410ath_hal_getantennareduction(struct ath_hal *ah, 2411 const struct ieee80211_channel *chan, u_int twiceGain) 2412{ 2413 int8_t antennaMax = twiceGain - chan->ic_maxantgain*2; 2414 return (antennaMax < 0) ? 0 : antennaMax; 2415} 2416