114779705SSam Leffler /* 259efa8b5SSam Leffler * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting 314779705SSam Leffler * Copyright (c) 2005-2006 Atheros Communications, Inc. 414779705SSam Leffler * All rights reserved. 514779705SSam Leffler * 614779705SSam Leffler * Permission to use, copy, modify, and/or distribute this software for any 714779705SSam Leffler * purpose with or without fee is hereby granted, provided that the above 814779705SSam Leffler * copyright notice and this permission notice appear in all copies. 914779705SSam Leffler * 1014779705SSam Leffler * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1114779705SSam Leffler * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1214779705SSam Leffler * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1314779705SSam Leffler * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1414779705SSam Leffler * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1514779705SSam Leffler * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1614779705SSam Leffler * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1714779705SSam Leffler * 185e36f058SSam Leffler * $FreeBSD$ 1914779705SSam Leffler */ 2014779705SSam Leffler #include "opt_ah.h" 2114779705SSam Leffler 2214779705SSam Leffler #include "ah.h" 2359efa8b5SSam Leffler 2459efa8b5SSam Leffler #include <net80211/_ieee80211.h> 2559efa8b5SSam Leffler #include <net80211/ieee80211_regdomain.h> 2659efa8b5SSam Leffler 2714779705SSam Leffler #include "ah_internal.h" 2814779705SSam Leffler #include "ah_eeprom.h" 2914779705SSam Leffler #include "ah_devid.h" 3014779705SSam Leffler 3114779705SSam Leffler /* 3214779705SSam Leffler * XXX this code needs a audit+review 3314779705SSam Leffler */ 3414779705SSam Leffler 3514779705SSam Leffler /* used throughout this file... */ 3614779705SSam Leffler #define N(a) (sizeof (a) / sizeof (a[0])) 3714779705SSam Leffler 3814779705SSam Leffler #define HAL_MODE_11A_TURBO HAL_MODE_108A 3914779705SSam Leffler #define HAL_MODE_11G_TURBO HAL_MODE_108G 4014779705SSam Leffler 4114779705SSam Leffler /* 4214779705SSam Leffler * BMLEN defines the size of the bitmask used to hold frequency 4314779705SSam Leffler * band specifications. Note this must agree with the BM macro 4414779705SSam Leffler * definition that's used to setup initializers. See also further 4514779705SSam Leffler * comments below. 4614779705SSam Leffler */ 4714779705SSam Leffler #define BMLEN 2 /* 2 x 64 bits in each channel bitmask */ 4814779705SSam Leffler typedef uint64_t chanbmask_t[BMLEN]; 4914779705SSam Leffler 5014779705SSam Leffler #define W0(_a) \ 5114779705SSam Leffler (((_a) >= 0 && (_a) < 64 ? (((uint64_t) 1)<<(_a)) : (uint64_t) 0)) 5214779705SSam Leffler #define W1(_a) \ 5314779705SSam Leffler (((_a) > 63 && (_a) < 128 ? (((uint64_t) 1)<<((_a)-64)) : (uint64_t) 0)) 5414779705SSam Leffler #define BM1(_fa) { W0(_fa), W1(_fa) } 5514779705SSam Leffler #define BM2(_fa, _fb) { W0(_fa) | W0(_fb), W1(_fa) | W1(_fb) } 5614779705SSam Leffler #define BM3(_fa, _fb, _fc) \ 5714779705SSam Leffler { W0(_fa) | W0(_fb) | W0(_fc), W1(_fa) | W1(_fb) | W1(_fc) } 5814779705SSam Leffler #define BM4(_fa, _fb, _fc, _fd) \ 5914779705SSam Leffler { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd), \ 6014779705SSam Leffler W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) } 6114779705SSam Leffler #define BM5(_fa, _fb, _fc, _fd, _fe) \ 6214779705SSam Leffler { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe), \ 6314779705SSam Leffler W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) } 6414779705SSam Leffler #define BM6(_fa, _fb, _fc, _fd, _fe, _ff) \ 6514779705SSam Leffler { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff), \ 6614779705SSam Leffler W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) } 6714779705SSam Leffler #define BM7(_fa, _fb, _fc, _fd, _fe, _ff, _fg) \ 6814779705SSam Leffler { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff) | \ 6914779705SSam Leffler W0(_fg),\ 7014779705SSam Leffler W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) | \ 7114779705SSam Leffler W1(_fg) } 7214779705SSam Leffler #define BM8(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh) \ 7314779705SSam Leffler { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff) | \ 7414779705SSam Leffler W0(_fg) | W0(_fh) , \ 7514779705SSam Leffler W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) | \ 7614779705SSam Leffler W1(_fg) | W1(_fh) } 7714779705SSam Leffler 7814779705SSam Leffler /* 7914779705SSam Leffler * Mask to check whether a domain is a multidomain or a single domain 8014779705SSam Leffler */ 8114779705SSam Leffler #define MULTI_DOMAIN_MASK 0xFF00 8214779705SSam Leffler 8314779705SSam Leffler /* 8414779705SSam Leffler * Enumerated Regulatory Domain Information 8 bit values indicate that 8514779705SSam Leffler * the regdomain is really a pair of unitary regdomains. 12 bit values 8614779705SSam Leffler * are the real unitary regdomains and are the only ones which have the 8714779705SSam Leffler * frequency bitmasks and flags set. 8814779705SSam Leffler */ 8914779705SSam Leffler enum { 9014779705SSam Leffler /* 9114779705SSam Leffler * The following regulatory domain definitions are 9214779705SSam Leffler * found in the EEPROM. Each regulatory domain 9314779705SSam Leffler * can operate in either a 5GHz or 2.4GHz wireless mode or 9414779705SSam Leffler * both 5GHz and 2.4GHz wireless modes. 9514779705SSam Leffler * In general, the value holds no special 9614779705SSam Leffler * meaning and is used to decode into either specific 9714779705SSam Leffler * 2.4GHz or 5GHz wireless mode for that particular 9814779705SSam Leffler * regulatory domain. 9914779705SSam Leffler */ 10014779705SSam Leffler NO_ENUMRD = 0x00, 10114779705SSam Leffler NULL1_WORLD = 0x03, /* For 11b-only countries (no 11a allowed) */ 10214779705SSam Leffler NULL1_ETSIB = 0x07, /* Israel */ 10314779705SSam Leffler NULL1_ETSIC = 0x08, 10414779705SSam Leffler FCC1_FCCA = 0x10, /* USA */ 10514779705SSam Leffler FCC1_WORLD = 0x11, /* Hong Kong */ 10614779705SSam Leffler FCC4_FCCA = 0x12, /* USA - Public Safety */ 10714779705SSam Leffler FCC5_FCCB = 0x13, /* USA w/ 1/2 and 1/4 width channels */ 10814779705SSam Leffler 10914779705SSam Leffler FCC2_FCCA = 0x20, /* Canada */ 11014779705SSam Leffler FCC2_WORLD = 0x21, /* Australia & HK */ 11114779705SSam Leffler FCC2_ETSIC = 0x22, 11214779705SSam Leffler FRANCE_RES = 0x31, /* Legacy France for OEM */ 11314779705SSam Leffler FCC3_FCCA = 0x3A, /* USA & Canada w/5470 band, 11h, DFS enabled */ 11414779705SSam Leffler FCC3_WORLD = 0x3B, /* USA & Canada w/5470 band, 11h, DFS enabled */ 11514779705SSam Leffler 11614779705SSam Leffler ETSI1_WORLD = 0x37, 11714779705SSam Leffler ETSI3_ETSIA = 0x32, /* France (optional) */ 11814779705SSam Leffler ETSI2_WORLD = 0x35, /* Hungary & others */ 11914779705SSam Leffler ETSI3_WORLD = 0x36, /* France & others */ 12014779705SSam Leffler ETSI4_WORLD = 0x30, 12114779705SSam Leffler ETSI4_ETSIC = 0x38, 12214779705SSam Leffler ETSI5_WORLD = 0x39, 12314779705SSam Leffler ETSI6_WORLD = 0x34, /* Bulgaria */ 12414779705SSam Leffler ETSI_RESERVED = 0x33, /* Reserved (Do not used) */ 12514779705SSam Leffler 12614779705SSam Leffler MKK1_MKKA = 0x40, /* Japan (JP1) */ 12714779705SSam Leffler MKK1_MKKB = 0x41, /* Japan (JP0) */ 12814779705SSam Leffler APL4_WORLD = 0x42, /* Singapore */ 12914779705SSam Leffler MKK2_MKKA = 0x43, /* Japan with 4.9G channels */ 13014779705SSam Leffler APL_RESERVED = 0x44, /* Reserved (Do not used) */ 13114779705SSam Leffler APL2_WORLD = 0x45, /* Korea */ 13214779705SSam Leffler APL2_APLC = 0x46, 13314779705SSam Leffler APL3_WORLD = 0x47, 13414779705SSam Leffler MKK1_FCCA = 0x48, /* Japan (JP1-1) */ 13514779705SSam Leffler APL2_APLD = 0x49, /* Korea with 2.3G channels */ 13614779705SSam Leffler MKK1_MKKA1 = 0x4A, /* Japan (JE1) */ 13714779705SSam Leffler MKK1_MKKA2 = 0x4B, /* Japan (JE2) */ 13814779705SSam Leffler MKK1_MKKC = 0x4C, /* Japan (MKK1_MKKA,except Ch14) */ 13914779705SSam Leffler 14014779705SSam Leffler APL3_FCCA = 0x50, 14114779705SSam Leffler APL1_WORLD = 0x52, /* Latin America */ 14214779705SSam Leffler APL1_FCCA = 0x53, 14314779705SSam Leffler APL1_APLA = 0x54, 14414779705SSam Leffler APL1_ETSIC = 0x55, 14514779705SSam Leffler APL2_ETSIC = 0x56, /* Venezuela */ 14614779705SSam Leffler APL5_WORLD = 0x58, /* Chile */ 14714779705SSam Leffler APL6_WORLD = 0x5B, /* Singapore */ 14814779705SSam Leffler APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */ 14914779705SSam Leffler APL8_WORLD = 0x5D, /* Malaysia 5GHz */ 15014779705SSam Leffler APL9_WORLD = 0x5E, /* Korea 5GHz */ 15114779705SSam Leffler 15214779705SSam Leffler /* 15314779705SSam Leffler * World mode SKUs 15414779705SSam Leffler */ 15514779705SSam Leffler WOR0_WORLD = 0x60, /* World0 (WO0 SKU) */ 15614779705SSam Leffler WOR1_WORLD = 0x61, /* World1 (WO1 SKU) */ 15714779705SSam Leffler WOR2_WORLD = 0x62, /* World2 (WO2 SKU) */ 15814779705SSam Leffler WOR3_WORLD = 0x63, /* World3 (WO3 SKU) */ 15914779705SSam Leffler WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */ 16014779705SSam Leffler WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */ 16114779705SSam Leffler 16214779705SSam Leffler WOR01_WORLD = 0x66, /* World0-1 (WW0-1 SKU) */ 16314779705SSam Leffler WOR02_WORLD = 0x67, /* World0-2 (WW0-2 SKU) */ 16414779705SSam Leffler EU1_WORLD = 0x68, /* Same as World0-2 (WW0-2 SKU), except active scan ch1-13. No ch14 */ 16514779705SSam Leffler 16614779705SSam Leffler WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */ 16714779705SSam Leffler WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */ 16814779705SSam Leffler 16914779705SSam Leffler MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */ 17014779705SSam Leffler MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */ 17114779705SSam Leffler MKK3_MKKC = 0x82, /* Japan UNI-1 even + MKKC */ 17214779705SSam Leffler 17314779705SSam Leffler MKK4_MKKB = 0x83, /* Japan UNI-1 even + UNI-2 + MKKB */ 17414779705SSam Leffler MKK4_MKKA2 = 0x84, /* Japan UNI-1 even + UNI-2 + MKKA2 */ 17514779705SSam Leffler MKK4_MKKC = 0x85, /* Japan UNI-1 even + UNI-2 + MKKC */ 17614779705SSam Leffler 17714779705SSam Leffler MKK5_MKKB = 0x86, /* Japan UNI-1 even + UNI-2 + mid-band + MKKB */ 17814779705SSam Leffler MKK5_MKKA2 = 0x87, /* Japan UNI-1 even + UNI-2 + mid-band + MKKA2 */ 17914779705SSam Leffler MKK5_MKKC = 0x88, /* Japan UNI-1 even + UNI-2 + mid-band + MKKC */ 18014779705SSam Leffler 18114779705SSam Leffler MKK6_MKKB = 0x89, /* Japan UNI-1 even + UNI-1 odd MKKB */ 18214779705SSam Leffler MKK6_MKKA2 = 0x8A, /* Japan UNI-1 even + UNI-1 odd + MKKA2 */ 18314779705SSam Leffler MKK6_MKKC = 0x8B, /* Japan UNI-1 even + UNI-1 odd + MKKC */ 18414779705SSam Leffler 18514779705SSam Leffler MKK7_MKKB = 0x8C, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKB */ 18614779705SSam Leffler MKK7_MKKA2 = 0x8D, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA2 */ 18714779705SSam Leffler MKK7_MKKC = 0x8E, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKC */ 18814779705SSam Leffler 18914779705SSam Leffler MKK8_MKKB = 0x8F, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKB */ 19014779705SSam Leffler MKK8_MKKA2 = 0x90, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKA2 */ 19114779705SSam Leffler MKK8_MKKC = 0x91, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKC */ 19214779705SSam Leffler 19314779705SSam Leffler /* Following definitions are used only by s/w to map old 19414779705SSam Leffler * Japan SKUs. 19514779705SSam Leffler */ 19614779705SSam Leffler MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */ 19714779705SSam Leffler MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */ 19814779705SSam Leffler MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */ 19914779705SSam Leffler MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */ 20014779705SSam Leffler MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */ 20114779705SSam Leffler MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */ 20214779705SSam Leffler MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz */ 20314779705SSam Leffler MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz */ 20414779705SSam Leffler 20514779705SSam Leffler /* 20614779705SSam Leffler * Regulator domains ending in a number (e.g. APL1, 20714779705SSam Leffler * MK1, ETSI4, etc) apply to 5GHz channel and power 20814779705SSam Leffler * information. Regulator domains ending in a letter 20914779705SSam Leffler * (e.g. APLA, FCCA, etc) apply to 2.4GHz channel and 21014779705SSam Leffler * power information. 21114779705SSam Leffler */ 21214779705SSam Leffler APL1 = 0x0150, /* LAT & Asia */ 21314779705SSam Leffler APL2 = 0x0250, /* LAT & Asia */ 21414779705SSam Leffler APL3 = 0x0350, /* Taiwan */ 21514779705SSam Leffler APL4 = 0x0450, /* Jordan */ 21614779705SSam Leffler APL5 = 0x0550, /* Chile */ 21714779705SSam Leffler APL6 = 0x0650, /* Singapore */ 21814779705SSam Leffler APL8 = 0x0850, /* Malaysia */ 21914779705SSam Leffler APL9 = 0x0950, /* Korea (South) ROC 3 */ 22014779705SSam Leffler 22114779705SSam Leffler ETSI1 = 0x0130, /* Europe & others */ 22214779705SSam Leffler ETSI2 = 0x0230, /* Europe & others */ 22314779705SSam Leffler ETSI3 = 0x0330, /* Europe & others */ 22414779705SSam Leffler ETSI4 = 0x0430, /* Europe & others */ 22514779705SSam Leffler ETSI5 = 0x0530, /* Europe & others */ 22614779705SSam Leffler ETSI6 = 0x0630, /* Europe & others */ 22714779705SSam Leffler ETSIA = 0x0A30, /* France */ 22814779705SSam Leffler ETSIB = 0x0B30, /* Israel */ 22914779705SSam Leffler ETSIC = 0x0C30, /* Latin America */ 23014779705SSam Leffler 23114779705SSam Leffler FCC1 = 0x0110, /* US & others */ 23214779705SSam Leffler FCC2 = 0x0120, /* Canada, Australia & New Zealand */ 23314779705SSam Leffler FCC3 = 0x0160, /* US w/new middle band & DFS */ 23414779705SSam Leffler FCC4 = 0x0165, /* US Public Safety */ 23514779705SSam Leffler FCC5 = 0x0166, /* US w/ 1/2 and 1/4 width channels */ 23614779705SSam Leffler FCCA = 0x0A10, 23714779705SSam Leffler FCCB = 0x0A11, /* US w/ 1/2 and 1/4 width channels */ 23814779705SSam Leffler 23914779705SSam Leffler APLD = 0x0D50, /* South Korea */ 24014779705SSam Leffler 24114779705SSam Leffler MKK1 = 0x0140, /* Japan (UNI-1 odd)*/ 24214779705SSam Leffler MKK2 = 0x0240, /* Japan (4.9 GHz + UNI-1 odd) */ 24314779705SSam Leffler MKK3 = 0x0340, /* Japan (UNI-1 even) */ 24414779705SSam Leffler MKK4 = 0x0440, /* Japan (UNI-1 even + UNI-2) */ 24514779705SSam Leffler MKK5 = 0x0540, /* Japan (UNI-1 even + UNI-2 + mid-band) */ 24614779705SSam Leffler MKK6 = 0x0640, /* Japan (UNI-1 odd + UNI-1 even) */ 24714779705SSam Leffler MKK7 = 0x0740, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 */ 24814779705SSam Leffler MKK8 = 0x0840, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 + mid-band) */ 24914779705SSam Leffler MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */ 25014779705SSam Leffler MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ 25114779705SSam Leffler MKKA = 0x0A40, /* Japan */ 25214779705SSam Leffler MKKC = 0x0A50, 25314779705SSam Leffler 25414779705SSam Leffler NULL1 = 0x0198, 25514779705SSam Leffler WORLD = 0x0199, 25614779705SSam Leffler DEBUG_REG_DMN = 0x01ff, 25714779705SSam Leffler }; 25814779705SSam Leffler 25914779705SSam Leffler #define WORLD_SKU_MASK 0x00F0 26014779705SSam Leffler #define WORLD_SKU_PREFIX 0x0060 26114779705SSam Leffler 26214779705SSam Leffler enum { /* conformance test limits */ 26314779705SSam Leffler FCC = 0x10, 26414779705SSam Leffler MKK = 0x40, 26514779705SSam Leffler ETSI = 0x30, 26614779705SSam Leffler }; 26714779705SSam Leffler 26814779705SSam Leffler /* 26914779705SSam Leffler * The following are flags for different requirements per reg domain. 27014779705SSam Leffler * These requirements are either inhereted from the reg domain pair or 27114779705SSam Leffler * from the unitary reg domain if the reg domain pair flags value is 0 27214779705SSam Leffler */ 27314779705SSam Leffler enum { 27414779705SSam Leffler NO_REQ = 0x00000000, /* NB: must be zero */ 27559efa8b5SSam Leffler DISALLOW_ADHOC_11A = 0x00000001, /* adhoc not allowed in 5GHz */ 27659efa8b5SSam Leffler DISALLOW_ADHOC_11A_TURB = 0x00000002, /* not allowed w/ 5GHz turbo */ 27759efa8b5SSam Leffler NEED_NFC = 0x00000004, /* need noise floor check */ 27859efa8b5SSam Leffler ADHOC_PER_11D = 0x00000008, /* must receive 11d beacon */ 27959efa8b5SSam Leffler LIMIT_FRAME_4MS = 0x00000020, /* 4msec tx burst limit */ 28014779705SSam Leffler NO_HOSTAP = 0x00000040, /* No HOSTAP mode opereation */ 28114779705SSam Leffler }; 28214779705SSam Leffler 28314779705SSam Leffler /* 28414779705SSam Leffler * The following describe the bit masks for different passive scan 28514779705SSam Leffler * capability/requirements per regdomain. 28614779705SSam Leffler */ 28714779705SSam Leffler #define NO_PSCAN 0x0ULL /* NB: must be zero */ 28814779705SSam Leffler #define PSCAN_FCC 0x0000000000000001ULL 28914779705SSam Leffler #define PSCAN_FCC_T 0x0000000000000002ULL 29014779705SSam Leffler #define PSCAN_ETSI 0x0000000000000004ULL 29114779705SSam Leffler #define PSCAN_MKK1 0x0000000000000008ULL 29214779705SSam Leffler #define PSCAN_MKK2 0x0000000000000010ULL 29314779705SSam Leffler #define PSCAN_MKKA 0x0000000000000020ULL 29414779705SSam Leffler #define PSCAN_MKKA_G 0x0000000000000040ULL 29514779705SSam Leffler #define PSCAN_ETSIA 0x0000000000000080ULL 29614779705SSam Leffler #define PSCAN_ETSIB 0x0000000000000100ULL 29714779705SSam Leffler #define PSCAN_ETSIC 0x0000000000000200ULL 29814779705SSam Leffler #define PSCAN_WWR 0x0000000000000400ULL 29914779705SSam Leffler #define PSCAN_MKKA1 0x0000000000000800ULL 30014779705SSam Leffler #define PSCAN_MKKA1_G 0x0000000000001000ULL 30114779705SSam Leffler #define PSCAN_MKKA2 0x0000000000002000ULL 30214779705SSam Leffler #define PSCAN_MKKA2_G 0x0000000000004000ULL 30314779705SSam Leffler #define PSCAN_MKK3 0x0000000000008000ULL 30414779705SSam Leffler #define PSCAN_DEFER 0x7FFFFFFFFFFFFFFFULL 30514779705SSam Leffler #define IS_ECM_CHAN 0x8000000000000000ULL 30614779705SSam Leffler 30714779705SSam Leffler /* 30814779705SSam Leffler * THE following table is the mapping of regdomain pairs specified by 30914779705SSam Leffler * an 8 bit regdomain value to the individual unitary reg domains 31014779705SSam Leffler */ 31159efa8b5SSam Leffler typedef struct regDomainPair { 31214779705SSam Leffler HAL_REG_DOMAIN regDmnEnum; /* 16 bit reg domain pair */ 31314779705SSam Leffler HAL_REG_DOMAIN regDmn5GHz; /* 5GHz reg domain */ 31414779705SSam Leffler HAL_REG_DOMAIN regDmn2GHz; /* 2GHz reg domain */ 31514779705SSam Leffler uint32_t flags5GHz; /* Requirements flags (AdHoc 31614779705SSam Leffler disallow, noise floor cal needed, 31714779705SSam Leffler etc) */ 31814779705SSam Leffler uint32_t flags2GHz; /* Requirements flags (AdHoc 31914779705SSam Leffler disallow, noise floor cal needed, 32014779705SSam Leffler etc) */ 32114779705SSam Leffler uint64_t pscanMask; /* Passive Scan flags which 32214779705SSam Leffler can override unitary domain 32314779705SSam Leffler passive scan flags. This 32414779705SSam Leffler value is used as a mask on 32514779705SSam Leffler the unitary flags*/ 32614779705SSam Leffler uint16_t singleCC; /* Country code of single country if 32714779705SSam Leffler a one-on-one mapping exists */ 32814779705SSam Leffler } REG_DMN_PAIR_MAPPING; 32914779705SSam Leffler 33014779705SSam Leffler static REG_DMN_PAIR_MAPPING regDomainPairs[] = { 33159efa8b5SSam Leffler {NO_ENUMRD, DEBUG_REG_DMN, DEBUG_REG_DMN, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33259efa8b5SSam Leffler {NULL1_WORLD, NULL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33359efa8b5SSam Leffler {NULL1_ETSIB, NULL1, ETSIB, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33459efa8b5SSam Leffler {NULL1_ETSIC, NULL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33514779705SSam Leffler 33659efa8b5SSam Leffler {FCC2_FCCA, FCC2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33759efa8b5SSam Leffler {FCC2_WORLD, FCC2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33859efa8b5SSam Leffler {FCC2_ETSIC, FCC2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33959efa8b5SSam Leffler {FCC3_FCCA, FCC3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34059efa8b5SSam Leffler {FCC3_WORLD, FCC3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34159efa8b5SSam Leffler {FCC4_FCCA, FCC4, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34259efa8b5SSam Leffler {FCC5_FCCB, FCC5, FCCB, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34314779705SSam Leffler 34459efa8b5SSam Leffler {ETSI1_WORLD, ETSI1, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34559efa8b5SSam Leffler {ETSI2_WORLD, ETSI2, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34659efa8b5SSam Leffler {ETSI3_WORLD, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34759efa8b5SSam Leffler {ETSI4_WORLD, ETSI4, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34859efa8b5SSam Leffler {ETSI5_WORLD, ETSI5, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34959efa8b5SSam Leffler {ETSI6_WORLD, ETSI6, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35014779705SSam Leffler 35159efa8b5SSam Leffler {ETSI3_ETSIA, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35259efa8b5SSam Leffler {FRANCE_RES, ETSI3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35314779705SSam Leffler 35459efa8b5SSam Leffler {FCC1_WORLD, FCC1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35559efa8b5SSam Leffler {FCC1_FCCA, FCC1, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35659efa8b5SSam Leffler {APL1_WORLD, APL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35759efa8b5SSam Leffler {APL2_WORLD, APL2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35859efa8b5SSam Leffler {APL3_WORLD, APL3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35959efa8b5SSam Leffler {APL4_WORLD, APL4, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36059efa8b5SSam Leffler {APL5_WORLD, APL5, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36159efa8b5SSam Leffler {APL6_WORLD, APL6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36259efa8b5SSam Leffler {APL8_WORLD, APL8, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36359efa8b5SSam Leffler {APL9_WORLD, APL9, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36414779705SSam Leffler 36559efa8b5SSam Leffler {APL3_FCCA, APL3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36659efa8b5SSam Leffler {APL1_ETSIC, APL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36759efa8b5SSam Leffler {APL2_ETSIC, APL2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36859efa8b5SSam Leffler {APL2_APLD, APL2, APLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 36914779705SSam Leffler 37014779705SSam Leffler {MKK1_MKKA, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA, CTRY_JAPAN }, 37114779705SSam Leffler {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 }, 37214779705SSam Leffler {MKK1_FCCA, MKK1, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN2 }, 37314779705SSam Leffler {MKK1_MKKA1, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN4 }, 37414779705SSam Leffler {MKK1_MKKA2, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN5 }, 37514779705SSam Leffler {MKK1_MKKC, MKK1, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN6 }, 37614779705SSam Leffler 37714779705SSam Leffler /* MKK2 */ 37814779705SSam Leffler {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 }, 37914779705SSam Leffler 38014779705SSam Leffler /* MKK3 */ 38159efa8b5SSam Leffler {MKK3_MKKA, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC , PSCAN_MKKA, CTRY_DEFAULT }, 38214779705SSam Leffler {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 }, 38359efa8b5SSam Leffler {MKK3_MKKA1, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_DEFAULT }, 38414779705SSam Leffler {MKK3_MKKA2,MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN8 }, 38514779705SSam Leffler {MKK3_MKKC, MKK3, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, CTRY_JAPAN9 }, 38659efa8b5SSam Leffler {MKK3_FCCA, MKK3, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, CTRY_DEFAULT }, 38714779705SSam Leffler 38814779705SSam Leffler /* MKK4 */ 38914779705SSam Leffler {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 }, 39059efa8b5SSam Leffler {MKK4_MKKA1, MKK4, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_DEFAULT }, 39114779705SSam Leffler {MKK4_MKKA2, MKK4, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 |PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN11 }, 39214779705SSam Leffler {MKK4_MKKC, MKK4, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN12 }, 39359efa8b5SSam Leffler {MKK4_FCCA, MKK4, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_DEFAULT }, 39414779705SSam Leffler 39514779705SSam Leffler /* MKK5 */ 39614779705SSam Leffler {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 }, 39714779705SSam Leffler {MKK5_MKKA2,MKK5, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN14 }, 39814779705SSam Leffler {MKK5_MKKC, MKK5, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN15 }, 39914779705SSam Leffler 40014779705SSam Leffler /* MKK6 */ 40114779705SSam Leffler {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 }, 40214779705SSam Leffler {MKK6_MKKA2, MKK6, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN17 }, 40314779705SSam Leffler {MKK6_MKKC, MKK6, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN18 }, 40414779705SSam Leffler 40514779705SSam Leffler /* MKK7 */ 40614779705SSam Leffler {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 }, 40714779705SSam Leffler {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 }, 40814779705SSam Leffler {MKK7_MKKC, MKK7, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3, CTRY_JAPAN21 }, 40914779705SSam Leffler 41014779705SSam Leffler /* MKK8 */ 41114779705SSam Leffler {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 }, 41214779705SSam Leffler {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 }, 41314779705SSam Leffler {MKK8_MKKC, MKK8, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 , CTRY_JAPAN24 }, 41414779705SSam Leffler 41559efa8b5SSam Leffler {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 }, 41659efa8b5SSam Leffler {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 }, 41714779705SSam Leffler 41814779705SSam Leffler /* These are super domains */ 41959efa8b5SSam Leffler {WOR0_WORLD, WOR0_WORLD, WOR0_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42059efa8b5SSam Leffler {WOR1_WORLD, WOR1_WORLD, WOR1_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42159efa8b5SSam Leffler {WOR2_WORLD, WOR2_WORLD, WOR2_WORLD, DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42259efa8b5SSam Leffler {WOR3_WORLD, WOR3_WORLD, WOR3_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42359efa8b5SSam Leffler {WOR4_WORLD, WOR4_WORLD, WOR4_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42459efa8b5SSam Leffler {WOR5_ETSIC, WOR5_ETSIC, WOR5_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42559efa8b5SSam Leffler {WOR01_WORLD, WOR01_WORLD, WOR01_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42659efa8b5SSam Leffler {WOR02_WORLD, WOR02_WORLD, WOR02_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42759efa8b5SSam Leffler {EU1_WORLD, EU1_WORLD, EU1_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42859efa8b5SSam Leffler {WOR9_WORLD, WOR9_WORLD, WOR9_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 42959efa8b5SSam Leffler {WORA_WORLD, WORA_WORLD, WORA_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 43014779705SSam Leffler }; 43114779705SSam Leffler 43214779705SSam Leffler /* 43314779705SSam Leffler * The following tables are the master list for all different freqeuncy 43414779705SSam Leffler * bands with the complete matrix of all possible flags and settings 43514779705SSam Leffler * for each band if it is used in ANY reg domain. 43614779705SSam Leffler */ 43714779705SSam Leffler 43814779705SSam Leffler #define DEF_REGDMN FCC1_FCCA 43914779705SSam Leffler #define COUNTRY_ERD_FLAG 0x8000 44014779705SSam Leffler #define WORLDWIDE_ROAMING_FLAG 0x4000 44114779705SSam Leffler 44214779705SSam Leffler typedef struct { 44314779705SSam Leffler HAL_CTRY_CODE countryCode; 44414779705SSam Leffler HAL_REG_DOMAIN regDmnEnum; 44514779705SSam Leffler } COUNTRY_CODE_TO_ENUM_RD; 44614779705SSam Leffler 44714779705SSam Leffler static COUNTRY_CODE_TO_ENUM_RD allCountries[] = { 44859efa8b5SSam Leffler { CTRY_DEBUG, NO_ENUMRD }, 44959efa8b5SSam Leffler { CTRY_DEFAULT, DEF_REGDMN }, 45059efa8b5SSam Leffler { CTRY_ALBANIA, NULL1_WORLD }, 45159efa8b5SSam Leffler { CTRY_ALGERIA, NULL1_WORLD }, 45259efa8b5SSam Leffler { CTRY_ARGENTINA, APL3_WORLD }, 45359efa8b5SSam Leffler { CTRY_ARMENIA, ETSI4_WORLD }, 45459efa8b5SSam Leffler { CTRY_AUSTRALIA, FCC2_WORLD }, 45559efa8b5SSam Leffler { CTRY_AUSTRIA, ETSI1_WORLD }, 45659efa8b5SSam Leffler { CTRY_AZERBAIJAN, ETSI4_WORLD }, 45759efa8b5SSam Leffler { CTRY_BAHRAIN, APL6_WORLD }, 45859efa8b5SSam Leffler { CTRY_BELARUS, NULL1_WORLD }, 45959efa8b5SSam Leffler { CTRY_BELGIUM, ETSI1_WORLD }, 46059efa8b5SSam Leffler { CTRY_BELIZE, APL1_ETSIC }, 46159efa8b5SSam Leffler { CTRY_BOLIVIA, APL1_ETSIC }, 46259efa8b5SSam Leffler { CTRY_BRAZIL, FCC3_WORLD }, 46359efa8b5SSam Leffler { CTRY_BRUNEI_DARUSSALAM,APL1_WORLD }, 46459efa8b5SSam Leffler { CTRY_BULGARIA, ETSI6_WORLD }, 46559efa8b5SSam Leffler { CTRY_CANADA, FCC2_FCCA }, 46659efa8b5SSam Leffler { CTRY_CHILE, APL6_WORLD }, 46759efa8b5SSam Leffler { CTRY_CHINA, APL1_WORLD }, 46859efa8b5SSam Leffler { CTRY_COLOMBIA, FCC1_FCCA }, 46959efa8b5SSam Leffler { CTRY_COSTA_RICA, NULL1_WORLD }, 47059efa8b5SSam Leffler { CTRY_CROATIA, ETSI3_WORLD }, 47159efa8b5SSam Leffler { CTRY_CYPRUS, ETSI1_WORLD }, 47259efa8b5SSam Leffler { CTRY_CZECH, ETSI1_WORLD }, 47359efa8b5SSam Leffler { CTRY_DENMARK, ETSI1_WORLD }, 47459efa8b5SSam Leffler { CTRY_DOMINICAN_REPUBLIC,FCC1_FCCA }, 47559efa8b5SSam Leffler { CTRY_ECUADOR, NULL1_WORLD }, 47659efa8b5SSam Leffler { CTRY_EGYPT, ETSI3_WORLD }, 47759efa8b5SSam Leffler { CTRY_EL_SALVADOR, NULL1_WORLD }, 47859efa8b5SSam Leffler { CTRY_ESTONIA, ETSI1_WORLD }, 47959efa8b5SSam Leffler { CTRY_FINLAND, ETSI1_WORLD }, 48059efa8b5SSam Leffler { CTRY_FRANCE, ETSI1_WORLD }, 48159efa8b5SSam Leffler { CTRY_FRANCE2, ETSI3_WORLD }, 48259efa8b5SSam Leffler { CTRY_GEORGIA, ETSI4_WORLD }, 48359efa8b5SSam Leffler { CTRY_GERMANY, ETSI1_WORLD }, 48459efa8b5SSam Leffler { CTRY_GREECE, ETSI1_WORLD }, 48559efa8b5SSam Leffler { CTRY_GUATEMALA, FCC1_FCCA }, 48659efa8b5SSam Leffler { CTRY_HONDURAS, NULL1_WORLD }, 48759efa8b5SSam Leffler { CTRY_HONG_KONG, FCC2_WORLD }, 48859efa8b5SSam Leffler { CTRY_HUNGARY, ETSI1_WORLD }, 48959efa8b5SSam Leffler { CTRY_ICELAND, ETSI1_WORLD }, 49059efa8b5SSam Leffler { CTRY_INDIA, APL6_WORLD }, 49159efa8b5SSam Leffler { CTRY_INDONESIA, APL1_WORLD }, 49259efa8b5SSam Leffler { CTRY_IRAN, APL1_WORLD }, 49359efa8b5SSam Leffler { CTRY_IRELAND, ETSI1_WORLD }, 49459efa8b5SSam Leffler { CTRY_ISRAEL, NULL1_WORLD }, 49559efa8b5SSam Leffler { CTRY_ITALY, ETSI1_WORLD }, 49659efa8b5SSam Leffler { CTRY_JAPAN, MKK1_MKKA }, 49759efa8b5SSam Leffler { CTRY_JAPAN1, MKK1_MKKB }, 49859efa8b5SSam Leffler { CTRY_JAPAN2, MKK1_FCCA }, 49959efa8b5SSam Leffler { CTRY_JAPAN3, MKK2_MKKA }, 50059efa8b5SSam Leffler { CTRY_JAPAN4, MKK1_MKKA1 }, 50159efa8b5SSam Leffler { CTRY_JAPAN5, MKK1_MKKA2 }, 50259efa8b5SSam Leffler { CTRY_JAPAN6, MKK1_MKKC }, 50314779705SSam Leffler 50459efa8b5SSam Leffler { CTRY_JAPAN7, MKK3_MKKB }, 50559efa8b5SSam Leffler { CTRY_JAPAN8, MKK3_MKKA2 }, 50659efa8b5SSam Leffler { CTRY_JAPAN9, MKK3_MKKC }, 50714779705SSam Leffler 50859efa8b5SSam Leffler { CTRY_JAPAN10, MKK4_MKKB }, 50959efa8b5SSam Leffler { CTRY_JAPAN11, MKK4_MKKA2 }, 51059efa8b5SSam Leffler { CTRY_JAPAN12, MKK4_MKKC }, 51114779705SSam Leffler 51259efa8b5SSam Leffler { CTRY_JAPAN13, MKK5_MKKB }, 51359efa8b5SSam Leffler { CTRY_JAPAN14, MKK5_MKKA2 }, 51459efa8b5SSam Leffler { CTRY_JAPAN15, MKK5_MKKC }, 51514779705SSam Leffler 51659efa8b5SSam Leffler { CTRY_JAPAN16, MKK6_MKKB }, 51759efa8b5SSam Leffler { CTRY_JAPAN17, MKK6_MKKA2 }, 51859efa8b5SSam Leffler { CTRY_JAPAN18, MKK6_MKKC }, 51914779705SSam Leffler 52059efa8b5SSam Leffler { CTRY_JAPAN19, MKK7_MKKB }, 52159efa8b5SSam Leffler { CTRY_JAPAN20, MKK7_MKKA2 }, 52259efa8b5SSam Leffler { CTRY_JAPAN21, MKK7_MKKC }, 52314779705SSam Leffler 52459efa8b5SSam Leffler { CTRY_JAPAN22, MKK8_MKKB }, 52559efa8b5SSam Leffler { CTRY_JAPAN23, MKK8_MKKA2 }, 52659efa8b5SSam Leffler { CTRY_JAPAN24, MKK8_MKKC }, 52714779705SSam Leffler 52859efa8b5SSam Leffler { CTRY_JORDAN, APL4_WORLD }, 52959efa8b5SSam Leffler { CTRY_KAZAKHSTAN, NULL1_WORLD }, 53059efa8b5SSam Leffler { CTRY_KOREA_NORTH, APL2_WORLD }, 53159efa8b5SSam Leffler { CTRY_KOREA_ROC, APL2_WORLD }, 53259efa8b5SSam Leffler { CTRY_KOREA_ROC2, APL2_WORLD }, 53359efa8b5SSam Leffler { CTRY_KOREA_ROC3, APL9_WORLD }, 53459efa8b5SSam Leffler { CTRY_KUWAIT, NULL1_WORLD }, 53559efa8b5SSam Leffler { CTRY_LATVIA, ETSI1_WORLD }, 53659efa8b5SSam Leffler { CTRY_LEBANON, NULL1_WORLD }, 53759efa8b5SSam Leffler { CTRY_LIECHTENSTEIN,ETSI1_WORLD }, 53859efa8b5SSam Leffler { CTRY_LITHUANIA, ETSI1_WORLD }, 53959efa8b5SSam Leffler { CTRY_LUXEMBOURG, ETSI1_WORLD }, 54059efa8b5SSam Leffler { CTRY_MACAU, FCC2_WORLD }, 54159efa8b5SSam Leffler { CTRY_MACEDONIA, NULL1_WORLD }, 54259efa8b5SSam Leffler { CTRY_MALAYSIA, APL8_WORLD }, 54359efa8b5SSam Leffler { CTRY_MALTA, ETSI1_WORLD }, 54459efa8b5SSam Leffler { CTRY_MEXICO, FCC1_FCCA }, 54559efa8b5SSam Leffler { CTRY_MONACO, ETSI4_WORLD }, 54659efa8b5SSam Leffler { CTRY_MOROCCO, NULL1_WORLD }, 54759efa8b5SSam Leffler { CTRY_NETHERLANDS, ETSI1_WORLD }, 54859efa8b5SSam Leffler { CTRY_NEW_ZEALAND, FCC2_ETSIC }, 54959efa8b5SSam Leffler { CTRY_NORWAY, ETSI1_WORLD }, 55059efa8b5SSam Leffler { CTRY_OMAN, APL6_WORLD }, 55159efa8b5SSam Leffler { CTRY_PAKISTAN, NULL1_WORLD }, 55259efa8b5SSam Leffler { CTRY_PANAMA, FCC1_FCCA }, 55359efa8b5SSam Leffler { CTRY_PERU, APL1_WORLD }, 55459efa8b5SSam Leffler { CTRY_PHILIPPINES, FCC3_WORLD }, 55559efa8b5SSam Leffler { CTRY_POLAND, ETSI1_WORLD }, 55659efa8b5SSam Leffler { CTRY_PORTUGAL, ETSI1_WORLD }, 55759efa8b5SSam Leffler { CTRY_PUERTO_RICO, FCC1_FCCA }, 55859efa8b5SSam Leffler { CTRY_QATAR, NULL1_WORLD }, 55959efa8b5SSam Leffler { CTRY_ROMANIA, NULL1_WORLD }, 56059efa8b5SSam Leffler { CTRY_RUSSIA, NULL1_WORLD }, 56159efa8b5SSam Leffler { CTRY_SAUDI_ARABIA,FCC2_WORLD }, 56259efa8b5SSam Leffler { CTRY_SINGAPORE, APL6_WORLD }, 56359efa8b5SSam Leffler { CTRY_SLOVAKIA, ETSI1_WORLD }, 56459efa8b5SSam Leffler { CTRY_SLOVENIA, ETSI1_WORLD }, 56559efa8b5SSam Leffler { CTRY_SOUTH_AFRICA,FCC3_WORLD }, 56659efa8b5SSam Leffler { CTRY_SPAIN, ETSI1_WORLD }, 56759efa8b5SSam Leffler { CTRY_SWEDEN, ETSI1_WORLD }, 56859efa8b5SSam Leffler { CTRY_SWITZERLAND, ETSI1_WORLD }, 56959efa8b5SSam Leffler { CTRY_SYRIA, NULL1_WORLD }, 57059efa8b5SSam Leffler { CTRY_TAIWAN, APL3_FCCA }, 57159efa8b5SSam Leffler { CTRY_THAILAND, NULL1_WORLD }, 57259efa8b5SSam Leffler { CTRY_TRINIDAD_Y_TOBAGO,ETSI4_WORLD }, 57359efa8b5SSam Leffler { CTRY_TUNISIA, ETSI3_WORLD }, 57459efa8b5SSam Leffler { CTRY_TURKEY, ETSI3_WORLD }, 57559efa8b5SSam Leffler { CTRY_UKRAINE, NULL1_WORLD }, 57659efa8b5SSam Leffler { CTRY_UAE, NULL1_WORLD }, 57759efa8b5SSam Leffler { CTRY_UNITED_KINGDOM, ETSI1_WORLD }, 57859efa8b5SSam Leffler { CTRY_UNITED_STATES, FCC1_FCCA }, 57959efa8b5SSam Leffler { CTRY_UNITED_STATES_FCC49,FCC4_FCCA }, 58059efa8b5SSam Leffler { CTRY_URUGUAY, FCC1_WORLD }, 58159efa8b5SSam Leffler { CTRY_UZBEKISTAN, FCC3_FCCA }, 58259efa8b5SSam Leffler { CTRY_VENEZUELA, APL2_ETSIC }, 58359efa8b5SSam Leffler { CTRY_VIET_NAM, NULL1_WORLD }, 58459efa8b5SSam Leffler { CTRY_ZIMBABWE, NULL1_WORLD } 58514779705SSam Leffler }; 58614779705SSam Leffler 58714779705SSam Leffler /* Bit masks for DFS per regdomain */ 58814779705SSam Leffler enum { 58914779705SSam Leffler NO_DFS = 0x0000000000000000ULL, /* NB: must be zero */ 59014779705SSam Leffler DFS_FCC3 = 0x0000000000000001ULL, 59114779705SSam Leffler DFS_ETSI = 0x0000000000000002ULL, 59214779705SSam Leffler DFS_MKK4 = 0x0000000000000004ULL, 59314779705SSam Leffler }; 59414779705SSam Leffler 59514779705SSam Leffler #define AFTER(x) ((x)+1) 59614779705SSam Leffler 59714779705SSam Leffler /* 59814779705SSam Leffler * Frequency band collections are defined using bitmasks. Each bit 59914779705SSam Leffler * in a mask is the index of an entry in one of the following tables. 60014779705SSam Leffler * Bitmasks are BMLEN*64 bits so if a table grows beyond that the bit 60114779705SSam Leffler * vectors must be enlarged or the tables split somehow (e.g. split 60214779705SSam Leffler * 1/2 and 1/4 rate channels into a separate table). 60314779705SSam Leffler * 60414779705SSam Leffler * Beware of ordering; the indices are defined relative to the preceding 60514779705SSam Leffler * entry so if things get off there will be confusion. A good way to 60614779705SSam Leffler * check the indices is to collect them in a switch statement in a stub 60714779705SSam Leffler * function so the compiler checks for duplicates. 60814779705SSam Leffler */ 60914779705SSam Leffler 61014779705SSam Leffler typedef struct { 61114779705SSam Leffler uint16_t lowChannel; /* Low channel center in MHz */ 61214779705SSam Leffler uint16_t highChannel; /* High Channel center in MHz */ 61314779705SSam Leffler uint8_t powerDfs; /* Max power (dBm) for channel 61414779705SSam Leffler range when using DFS */ 61514779705SSam Leffler uint8_t antennaMax; /* Max allowed antenna gain */ 61614779705SSam Leffler uint8_t channelBW; /* Bandwidth of the channel */ 61714779705SSam Leffler uint8_t channelSep; /* Channel separation within 61814779705SSam Leffler the band */ 61914779705SSam Leffler uint64_t useDfs; /* Use DFS in the RegDomain 62014779705SSam Leffler if corresponding bit is set */ 62114779705SSam Leffler uint64_t usePassScan; /* Use Passive Scan in the RegDomain 62214779705SSam Leffler if corresponding bit is set */ 62314779705SSam Leffler } REG_DMN_FREQ_BAND; 62414779705SSam Leffler 62514779705SSam Leffler /* 62614779705SSam Leffler * 5GHz 11A channel tags 62714779705SSam Leffler */ 62814779705SSam Leffler static REG_DMN_FREQ_BAND regDmn5GhzFreq[] = { 62959efa8b5SSam Leffler { 4915, 4925, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 63014779705SSam Leffler #define F1_4915_4925 0 63159efa8b5SSam Leffler { 4935, 4945, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 63214779705SSam Leffler #define F1_4935_4945 AFTER(F1_4915_4925) 63359efa8b5SSam Leffler { 4920, 4980, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2 }, 63414779705SSam Leffler #define F1_4920_4980 AFTER(F1_4935_4945) 63559efa8b5SSam Leffler { 4942, 4987, 27, 6, 5, 5, NO_DFS, PSCAN_FCC }, 63614779705SSam Leffler #define F1_4942_4987 AFTER(F1_4920_4980) 63759efa8b5SSam Leffler { 4945, 4985, 30, 6, 10, 5, NO_DFS, PSCAN_FCC }, 63814779705SSam Leffler #define F1_4945_4985 AFTER(F1_4942_4987) 63959efa8b5SSam Leffler { 4950, 4980, 33, 6, 20, 5, NO_DFS, PSCAN_FCC }, 64014779705SSam Leffler #define F1_4950_4980 AFTER(F1_4945_4985) 64159efa8b5SSam Leffler { 5035, 5040, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 64214779705SSam Leffler #define F1_5035_5040 AFTER(F1_4950_4980) 64359efa8b5SSam Leffler { 5040, 5080, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2 }, 64414779705SSam Leffler #define F1_5040_5080 AFTER(F1_5035_5040) 64559efa8b5SSam Leffler { 5055, 5055, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 64614779705SSam Leffler #define F1_5055_5055 AFTER(F1_5040_5080) 64714779705SSam Leffler 64859efa8b5SSam Leffler { 5120, 5240, 5, 6, 20, 20, NO_DFS, NO_PSCAN }, 64914779705SSam Leffler #define F1_5120_5240 AFTER(F1_5055_5055) 65059efa8b5SSam Leffler { 5120, 5240, 5, 6, 10, 10, NO_DFS, NO_PSCAN }, 65114779705SSam Leffler #define F2_5120_5240 AFTER(F1_5120_5240) 65259efa8b5SSam Leffler { 5120, 5240, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 65314779705SSam Leffler #define F3_5120_5240 AFTER(F2_5120_5240) 65414779705SSam Leffler 65559efa8b5SSam Leffler { 5170, 5230, 23, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2 }, 65614779705SSam Leffler #define F1_5170_5230 AFTER(F3_5120_5240) 65759efa8b5SSam Leffler { 5170, 5230, 20, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2 }, 65814779705SSam Leffler #define F2_5170_5230 AFTER(F1_5170_5230) 65914779705SSam Leffler 66059efa8b5SSam Leffler { 5180, 5240, 15, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 66114779705SSam Leffler #define F1_5180_5240 AFTER(F2_5170_5230) 66259efa8b5SSam Leffler { 5180, 5240, 17, 6, 20, 20, NO_DFS, PSCAN_FCC }, 66314779705SSam Leffler #define F2_5180_5240 AFTER(F1_5180_5240) 66459efa8b5SSam Leffler { 5180, 5240, 18, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 66514779705SSam Leffler #define F3_5180_5240 AFTER(F2_5180_5240) 66659efa8b5SSam Leffler { 5180, 5240, 20, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 66714779705SSam Leffler #define F4_5180_5240 AFTER(F3_5180_5240) 66859efa8b5SSam Leffler { 5180, 5240, 23, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 66914779705SSam Leffler #define F5_5180_5240 AFTER(F4_5180_5240) 67059efa8b5SSam Leffler { 5180, 5240, 23, 6, 20, 20, NO_DFS, PSCAN_FCC }, 67114779705SSam Leffler #define F6_5180_5240 AFTER(F5_5180_5240) 67259efa8b5SSam Leffler { 5180, 5240, 17, 6, 20, 10, NO_DFS, PSCAN_FCC }, 67314779705SSam Leffler #define F7_5180_5240 AFTER(F6_5180_5240) 67459efa8b5SSam Leffler { 5180, 5240, 17, 6, 20, 5, NO_DFS, PSCAN_FCC }, 67514779705SSam Leffler #define F8_5180_5240 AFTER(F7_5180_5240) 67659efa8b5SSam Leffler { 5180, 5320, 20, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 67714779705SSam Leffler 67814779705SSam Leffler #define F1_5180_5320 AFTER(F8_5180_5240) 67959efa8b5SSam Leffler { 5240, 5280, 23, 0, 20, 20, DFS_FCC3, PSCAN_FCC | PSCAN_ETSI }, 68014779705SSam Leffler 68114779705SSam Leffler #define F1_5240_5280 AFTER(F1_5180_5320) 68259efa8b5SSam Leffler { 5260, 5280, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 68314779705SSam Leffler 68414779705SSam Leffler #define F1_5260_5280 AFTER(F1_5240_5280) 68559efa8b5SSam Leffler { 5260, 5320, 18, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 68614779705SSam Leffler 68714779705SSam Leffler #define F1_5260_5320 AFTER(F1_5260_5280) 68859efa8b5SSam Leffler { 5260, 5320, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_FCC | PSCAN_ETSI | PSCAN_MKK3 }, 68914779705SSam Leffler #define F2_5260_5320 AFTER(F1_5260_5320) 69014779705SSam Leffler 69159efa8b5SSam Leffler { 5260, 5320, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 69214779705SSam Leffler #define F3_5260_5320 AFTER(F2_5260_5320) 69359efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 69414779705SSam Leffler #define F4_5260_5320 AFTER(F3_5260_5320) 69559efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 69614779705SSam Leffler #define F5_5260_5320 AFTER(F4_5260_5320) 69759efa8b5SSam Leffler { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 69814779705SSam Leffler #define F6_5260_5320 AFTER(F5_5260_5320) 69959efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 10, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 70014779705SSam Leffler #define F7_5260_5320 AFTER(F6_5260_5320) 70159efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 5, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 70214779705SSam Leffler #define F8_5260_5320 AFTER(F7_5260_5320) 70314779705SSam Leffler 70459efa8b5SSam Leffler { 5260, 5700, 5, 6, 20, 20, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 70514779705SSam Leffler #define F1_5260_5700 AFTER(F8_5260_5320) 70659efa8b5SSam Leffler { 5260, 5700, 5, 6, 10, 10, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 70714779705SSam Leffler #define F2_5260_5700 AFTER(F1_5260_5700) 70859efa8b5SSam Leffler { 5260, 5700, 5, 6, 5, 5, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 70914779705SSam Leffler #define F3_5260_5700 AFTER(F2_5260_5700) 71014779705SSam Leffler 71159efa8b5SSam Leffler { 5280, 5320, 17, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 71214779705SSam Leffler #define F1_5280_5320 AFTER(F3_5260_5700) 71314779705SSam Leffler 71459efa8b5SSam Leffler { 5500, 5620, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 71514779705SSam Leffler #define F1_5500_5620 AFTER(F1_5280_5320) 71614779705SSam Leffler 71759efa8b5SSam Leffler { 5500, 5700, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 71814779705SSam Leffler #define F1_5500_5700 AFTER(F1_5500_5620) 71959efa8b5SSam Leffler { 5500, 5700, 27, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 72014779705SSam Leffler #define F2_5500_5700 AFTER(F1_5500_5700) 72159efa8b5SSam Leffler { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 72214779705SSam Leffler #define F3_5500_5700 AFTER(F2_5500_5700) 72359efa8b5SSam Leffler { 5500, 5700, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_MKK3 | PSCAN_FCC }, 72414779705SSam Leffler #define F4_5500_5700 AFTER(F3_5500_5700) 72514779705SSam Leffler 72659efa8b5SSam Leffler { 5745, 5805, 23, 0, 20, 20, NO_DFS, NO_PSCAN }, 72714779705SSam Leffler #define F1_5745_5805 AFTER(F4_5500_5700) 72859efa8b5SSam Leffler { 5745, 5805, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 72914779705SSam Leffler #define F2_5745_5805 AFTER(F1_5745_5805) 73059efa8b5SSam Leffler { 5745, 5805, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 73114779705SSam Leffler #define F3_5745_5805 AFTER(F2_5745_5805) 73259efa8b5SSam Leffler { 5745, 5825, 5, 6, 20, 20, NO_DFS, NO_PSCAN }, 73314779705SSam Leffler #define F1_5745_5825 AFTER(F3_5745_5805) 73459efa8b5SSam Leffler { 5745, 5825, 17, 0, 20, 20, NO_DFS, NO_PSCAN }, 73514779705SSam Leffler #define F2_5745_5825 AFTER(F1_5745_5825) 73659efa8b5SSam Leffler { 5745, 5825, 20, 0, 20, 20, NO_DFS, NO_PSCAN }, 73714779705SSam Leffler #define F3_5745_5825 AFTER(F2_5745_5825) 73859efa8b5SSam Leffler { 5745, 5825, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 73914779705SSam Leffler #define F4_5745_5825 AFTER(F3_5745_5825) 74059efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 74114779705SSam Leffler #define F5_5745_5825 AFTER(F4_5745_5825) 74259efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 74314779705SSam Leffler #define F6_5745_5825 AFTER(F5_5745_5825) 74459efa8b5SSam Leffler { 5745, 5825, 5, 6, 10, 10, NO_DFS, NO_PSCAN }, 74514779705SSam Leffler #define F7_5745_5825 AFTER(F6_5745_5825) 74659efa8b5SSam Leffler { 5745, 5825, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 74714779705SSam Leffler #define F8_5745_5825 AFTER(F7_5745_5825) 74859efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 10, NO_DFS, NO_PSCAN }, 74914779705SSam Leffler #define F9_5745_5825 AFTER(F8_5745_5825) 75059efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 5, NO_DFS, NO_PSCAN }, 75114779705SSam Leffler #define F10_5745_5825 AFTER(F9_5745_5825) 75214779705SSam Leffler 75314779705SSam Leffler /* 75414779705SSam Leffler * Below are the world roaming channels 75514779705SSam Leffler * All WWR domains have no power limit, instead use the card's CTL 75614779705SSam Leffler * or max power settings. 75714779705SSam Leffler */ 75859efa8b5SSam Leffler { 4920, 4980, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 75914779705SSam Leffler #define W1_4920_4980 AFTER(F10_5745_5825) 76059efa8b5SSam Leffler { 5040, 5080, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 76114779705SSam Leffler #define W1_5040_5080 AFTER(W1_4920_4980) 76259efa8b5SSam Leffler { 5170, 5230, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 76314779705SSam Leffler #define W1_5170_5230 AFTER(W1_5040_5080) 76459efa8b5SSam Leffler { 5180, 5240, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 76514779705SSam Leffler #define W1_5180_5240 AFTER(W1_5170_5230) 76659efa8b5SSam Leffler { 5260, 5320, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 76714779705SSam Leffler #define W1_5260_5320 AFTER(W1_5180_5240) 76859efa8b5SSam Leffler { 5745, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 76914779705SSam Leffler #define W1_5745_5825 AFTER(W1_5260_5320) 77059efa8b5SSam Leffler { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 77114779705SSam Leffler #define W1_5500_5700 AFTER(W1_5745_5825) 77259efa8b5SSam Leffler { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 77314779705SSam Leffler #define W2_5260_5320 AFTER(W1_5500_5700) 77459efa8b5SSam Leffler { 5180, 5240, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 77514779705SSam Leffler #define W2_5180_5240 AFTER(W2_5260_5320) 77659efa8b5SSam Leffler { 5825, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 77714779705SSam Leffler #define W2_5825_5825 AFTER(W2_5180_5240) 77814779705SSam Leffler }; 77914779705SSam Leffler 78014779705SSam Leffler /* 78114779705SSam Leffler * 5GHz Turbo (dynamic & static) tags 78214779705SSam Leffler */ 78314779705SSam Leffler static REG_DMN_FREQ_BAND regDmn5GhzTurboFreq[] = { 78459efa8b5SSam Leffler { 5130, 5210, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 78514779705SSam Leffler #define T1_5130_5210 0 78659efa8b5SSam Leffler { 5250, 5330, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 78714779705SSam Leffler #define T1_5250_5330 AFTER(T1_5130_5210) 78859efa8b5SSam Leffler { 5370, 5490, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 78914779705SSam Leffler #define T1_5370_5490 AFTER(T1_5250_5330) 79059efa8b5SSam Leffler { 5530, 5650, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 79114779705SSam Leffler #define T1_5530_5650 AFTER(T1_5370_5490) 79214779705SSam Leffler 79359efa8b5SSam Leffler { 5150, 5190, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 79414779705SSam Leffler #define T1_5150_5190 AFTER(T1_5530_5650) 79559efa8b5SSam Leffler { 5230, 5310, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 79614779705SSam Leffler #define T1_5230_5310 AFTER(T1_5150_5190) 79759efa8b5SSam Leffler { 5350, 5470, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 79814779705SSam Leffler #define T1_5350_5470 AFTER(T1_5230_5310) 79959efa8b5SSam Leffler { 5510, 5670, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 80014779705SSam Leffler #define T1_5510_5670 AFTER(T1_5350_5470) 80114779705SSam Leffler 80259efa8b5SSam Leffler { 5200, 5240, 17, 6, 40, 40, NO_DFS, NO_PSCAN }, 80314779705SSam Leffler #define T1_5200_5240 AFTER(T1_5510_5670) 80459efa8b5SSam Leffler { 5200, 5240, 23, 6, 40, 40, NO_DFS, NO_PSCAN }, 80514779705SSam Leffler #define T2_5200_5240 AFTER(T1_5200_5240) 80659efa8b5SSam Leffler { 5210, 5210, 17, 6, 40, 40, NO_DFS, NO_PSCAN }, 80714779705SSam Leffler #define T1_5210_5210 AFTER(T2_5200_5240) 80859efa8b5SSam Leffler { 5210, 5210, 23, 0, 40, 40, NO_DFS, NO_PSCAN }, 80914779705SSam Leffler #define T2_5210_5210 AFTER(T1_5210_5210) 81014779705SSam Leffler 81159efa8b5SSam Leffler { 5280, 5280, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 81214779705SSam Leffler #define T1_5280_5280 AFTER(T2_5210_5210) 81359efa8b5SSam Leffler { 5280, 5280, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 81414779705SSam Leffler #define T2_5280_5280 AFTER(T1_5280_5280) 81559efa8b5SSam Leffler { 5250, 5250, 17, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 81614779705SSam Leffler #define T1_5250_5250 AFTER(T2_5280_5280) 81759efa8b5SSam Leffler { 5290, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 81814779705SSam Leffler #define T1_5290_5290 AFTER(T1_5250_5250) 81959efa8b5SSam Leffler { 5250, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 82014779705SSam Leffler #define T1_5250_5290 AFTER(T1_5290_5290) 82159efa8b5SSam Leffler { 5250, 5290, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 82214779705SSam Leffler #define T2_5250_5290 AFTER(T1_5250_5290) 82314779705SSam Leffler 82459efa8b5SSam Leffler { 5540, 5660, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 82514779705SSam Leffler #define T1_5540_5660 AFTER(T2_5250_5290) 82659efa8b5SSam Leffler { 5760, 5800, 20, 0, 40, 40, NO_DFS, NO_PSCAN }, 82714779705SSam Leffler #define T1_5760_5800 AFTER(T1_5540_5660) 82859efa8b5SSam Leffler { 5760, 5800, 30, 6, 40, 40, NO_DFS, NO_PSCAN }, 82914779705SSam Leffler #define T2_5760_5800 AFTER(T1_5760_5800) 83014779705SSam Leffler 83159efa8b5SSam Leffler { 5765, 5805, 30, 6, 40, 40, NO_DFS, NO_PSCAN }, 83214779705SSam Leffler #define T1_5765_5805 AFTER(T2_5760_5800) 83314779705SSam Leffler 83414779705SSam Leffler /* 83514779705SSam Leffler * Below are the WWR frequencies 83614779705SSam Leffler */ 83759efa8b5SSam Leffler { 5210, 5250, 15, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 83814779705SSam Leffler #define WT1_5210_5250 AFTER(T1_5765_5805) 83959efa8b5SSam Leffler { 5290, 5290, 18, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 84014779705SSam Leffler #define WT1_5290_5290 AFTER(WT1_5210_5250) 84159efa8b5SSam Leffler { 5540, 5660, 20, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 84214779705SSam Leffler #define WT1_5540_5660 AFTER(WT1_5290_5290) 84359efa8b5SSam Leffler { 5760, 5800, 20, 0, 40, 40, NO_DFS, PSCAN_WWR }, 84414779705SSam Leffler #define WT1_5760_5800 AFTER(WT1_5540_5660) 84514779705SSam Leffler }; 84614779705SSam Leffler 84714779705SSam Leffler /* 84814779705SSam Leffler * 2GHz 11b channel tags 84914779705SSam Leffler */ 85014779705SSam Leffler static REG_DMN_FREQ_BAND regDmn2GhzFreq[] = { 85159efa8b5SSam Leffler { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 85214779705SSam Leffler #define F1_2312_2372 0 85359efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 85414779705SSam Leffler #define F2_2312_2372 AFTER(F1_2312_2372) 85514779705SSam Leffler 85659efa8b5SSam Leffler { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 85714779705SSam Leffler #define F1_2412_2472 AFTER(F2_2312_2372) 85859efa8b5SSam Leffler { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA }, 85914779705SSam Leffler #define F2_2412_2472 AFTER(F1_2412_2472) 86059efa8b5SSam Leffler { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN }, 86114779705SSam Leffler #define F3_2412_2472 AFTER(F2_2412_2472) 86214779705SSam Leffler 86359efa8b5SSam Leffler { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN }, 86414779705SSam Leffler #define F1_2412_2462 AFTER(F3_2412_2472) 86559efa8b5SSam Leffler { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA }, 86614779705SSam Leffler #define F2_2412_2462 AFTER(F1_2412_2462) 86714779705SSam Leffler 86859efa8b5SSam Leffler { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 86914779705SSam Leffler #define F1_2432_2442 AFTER(F2_2412_2462) 87014779705SSam Leffler 87159efa8b5SSam Leffler { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 87214779705SSam Leffler #define F1_2457_2472 AFTER(F1_2432_2442) 87314779705SSam Leffler 87459efa8b5SSam Leffler { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA }, 87514779705SSam Leffler #define F1_2467_2472 AFTER(F1_2457_2472) 87614779705SSam Leffler 87759efa8b5SSam Leffler { 2484, 2484, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 87814779705SSam Leffler #define F1_2484_2484 AFTER(F1_2467_2472) 87959efa8b5SSam Leffler { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA | PSCAN_MKKA1 | PSCAN_MKKA2 }, 88014779705SSam Leffler #define F2_2484_2484 AFTER(F1_2484_2484) 88114779705SSam Leffler 88259efa8b5SSam Leffler { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 88314779705SSam Leffler #define F1_2512_2732 AFTER(F2_2484_2484) 88414779705SSam Leffler 88514779705SSam Leffler /* 88614779705SSam Leffler * WWR have powers opened up to 20dBm. 88714779705SSam Leffler * Limits should often come from CTL/Max powers 88814779705SSam Leffler */ 88959efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 89014779705SSam Leffler #define W1_2312_2372 AFTER(F1_2512_2732) 89159efa8b5SSam Leffler { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 89214779705SSam Leffler #define W1_2412_2412 AFTER(W1_2312_2372) 89359efa8b5SSam Leffler { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 89414779705SSam Leffler #define W1_2417_2432 AFTER(W1_2412_2412) 89559efa8b5SSam Leffler { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 89614779705SSam Leffler #define W1_2437_2442 AFTER(W1_2417_2432) 89759efa8b5SSam Leffler { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 89814779705SSam Leffler #define W1_2447_2457 AFTER(W1_2437_2442) 89959efa8b5SSam Leffler { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 90014779705SSam Leffler #define W1_2462_2462 AFTER(W1_2447_2457) 90159efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 90214779705SSam Leffler #define W1_2467_2467 AFTER(W1_2462_2462) 90359efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 90414779705SSam Leffler #define W2_2467_2467 AFTER(W1_2467_2467) 90559efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 90614779705SSam Leffler #define W1_2472_2472 AFTER(W2_2467_2467) 90759efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 90814779705SSam Leffler #define W2_2472_2472 AFTER(W1_2472_2472) 90959efa8b5SSam Leffler { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 91014779705SSam Leffler #define W1_2484_2484 AFTER(W2_2472_2472) 91159efa8b5SSam Leffler { 2484, 2484, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 91214779705SSam Leffler #define W2_2484_2484 AFTER(W1_2484_2484) 91314779705SSam Leffler }; 91414779705SSam Leffler 91514779705SSam Leffler /* 91614779705SSam Leffler * 2GHz 11g channel tags 91714779705SSam Leffler */ 91814779705SSam Leffler static REG_DMN_FREQ_BAND regDmn2Ghz11gFreq[] = { 91959efa8b5SSam Leffler { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 92014779705SSam Leffler #define G1_2312_2372 0 92159efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 92214779705SSam Leffler #define G2_2312_2372 AFTER(G1_2312_2372) 92359efa8b5SSam Leffler { 2312, 2372, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 92414779705SSam Leffler #define G3_2312_2372 AFTER(G2_2312_2372) 92559efa8b5SSam Leffler { 2312, 2372, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 92614779705SSam Leffler #define G4_2312_2372 AFTER(G3_2312_2372) 92714779705SSam Leffler 92859efa8b5SSam Leffler { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 92914779705SSam Leffler #define G1_2412_2472 AFTER(G4_2312_2372) 93059efa8b5SSam Leffler { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G }, 93114779705SSam Leffler #define G2_2412_2472 AFTER(G1_2412_2472) 93259efa8b5SSam Leffler { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN }, 93314779705SSam Leffler #define G3_2412_2472 AFTER(G2_2412_2472) 93459efa8b5SSam Leffler { 2412, 2472, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 93514779705SSam Leffler #define G4_2412_2472 AFTER(G3_2412_2472) 93659efa8b5SSam Leffler { 2412, 2472, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 93714779705SSam Leffler #define G5_2412_2472 AFTER(G4_2412_2472) 93814779705SSam Leffler 93959efa8b5SSam Leffler { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN }, 94014779705SSam Leffler #define G1_2412_2462 AFTER(G5_2412_2472) 94159efa8b5SSam Leffler { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G }, 94214779705SSam Leffler #define G2_2412_2462 AFTER(G1_2412_2462) 94359efa8b5SSam Leffler { 2412, 2462, 27, 6, 10, 5, NO_DFS, NO_PSCAN }, 94414779705SSam Leffler #define G3_2412_2462 AFTER(G2_2412_2462) 94559efa8b5SSam Leffler { 2412, 2462, 27, 6, 5, 5, NO_DFS, NO_PSCAN }, 94614779705SSam Leffler #define G4_2412_2462 AFTER(G3_2412_2462) 94714779705SSam Leffler 94859efa8b5SSam Leffler { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 94914779705SSam Leffler #define G1_2432_2442 AFTER(G4_2412_2462) 95014779705SSam Leffler 95159efa8b5SSam Leffler { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 95214779705SSam Leffler #define G1_2457_2472 AFTER(G1_2432_2442) 95314779705SSam Leffler 95459efa8b5SSam Leffler { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 95514779705SSam Leffler #define G1_2512_2732 AFTER(G1_2457_2472) 95659efa8b5SSam Leffler { 2512, 2732, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 95714779705SSam Leffler #define G2_2512_2732 AFTER(G1_2512_2732) 95859efa8b5SSam Leffler { 2512, 2732, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 95914779705SSam Leffler #define G3_2512_2732 AFTER(G2_2512_2732) 96014779705SSam Leffler 96159efa8b5SSam Leffler { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA }, 96214779705SSam Leffler #define G1_2467_2472 AFTER(G3_2512_2732) 96314779705SSam Leffler 96414779705SSam Leffler /* 96514779705SSam Leffler * WWR open up the power to 20dBm 96614779705SSam Leffler */ 96759efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 96814779705SSam Leffler #define WG1_2312_2372 AFTER(G1_2467_2472) 96959efa8b5SSam Leffler { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 97014779705SSam Leffler #define WG1_2412_2412 AFTER(WG1_2312_2372) 97159efa8b5SSam Leffler { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 97214779705SSam Leffler #define WG1_2417_2432 AFTER(WG1_2412_2412) 97359efa8b5SSam Leffler { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 97414779705SSam Leffler #define WG1_2437_2442 AFTER(WG1_2417_2432) 97559efa8b5SSam Leffler { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 97614779705SSam Leffler #define WG1_2447_2457 AFTER(WG1_2437_2442) 97759efa8b5SSam Leffler { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 97814779705SSam Leffler #define WG1_2462_2462 AFTER(WG1_2447_2457) 97959efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 98014779705SSam Leffler #define WG1_2467_2467 AFTER(WG1_2462_2462) 98159efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 98214779705SSam Leffler #define WG2_2467_2467 AFTER(WG1_2467_2467) 98359efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 98414779705SSam Leffler #define WG1_2472_2472 AFTER(WG2_2467_2467) 98559efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 98614779705SSam Leffler #define WG2_2472_2472 AFTER(WG1_2472_2472) 98714779705SSam Leffler }; 98814779705SSam Leffler 98914779705SSam Leffler /* 99014779705SSam Leffler * 2GHz Dynamic turbo tags 99114779705SSam Leffler */ 99214779705SSam Leffler static REG_DMN_FREQ_BAND regDmn2Ghz11gTurboFreq[] = { 99359efa8b5SSam Leffler { 2312, 2372, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 99414779705SSam Leffler #define T1_2312_2372 0 99559efa8b5SSam Leffler { 2437, 2437, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 99614779705SSam Leffler #define T1_2437_2437 AFTER(T1_2312_2372) 99759efa8b5SSam Leffler { 2437, 2437, 20, 6, 40, 40, NO_DFS, NO_PSCAN }, 99814779705SSam Leffler #define T2_2437_2437 AFTER(T1_2437_2437) 99959efa8b5SSam Leffler { 2437, 2437, 18, 6, 40, 40, NO_DFS, PSCAN_WWR }, 100014779705SSam Leffler #define T3_2437_2437 AFTER(T2_2437_2437) 100159efa8b5SSam Leffler { 2512, 2732, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 100214779705SSam Leffler #define T1_2512_2732 AFTER(T3_2437_2437) 100314779705SSam Leffler }; 100414779705SSam Leffler 100514779705SSam Leffler typedef struct regDomain { 100614779705SSam Leffler uint16_t regDmnEnum; /* value from EnumRd table */ 100714779705SSam Leffler uint8_t conformanceTestLimit; 100814779705SSam Leffler uint32_t flags; /* Requirement flags (AdHoc disallow, 100914779705SSam Leffler noise floor cal needed, etc) */ 101014779705SSam Leffler uint64_t dfsMask; /* DFS bitmask for 5Ghz tables */ 101114779705SSam Leffler uint64_t pscan; /* Bitmask for passive scan */ 101214779705SSam Leffler chanbmask_t chan11a; /* 11a channels */ 101314779705SSam Leffler chanbmask_t chan11a_turbo; /* 11a static turbo channels */ 101414779705SSam Leffler chanbmask_t chan11a_dyn_turbo; /* 11a dynamic turbo channels */ 101514779705SSam Leffler chanbmask_t chan11a_half; /* 11a 1/2 width channels */ 101614779705SSam Leffler chanbmask_t chan11a_quarter; /* 11a 1/4 width channels */ 101714779705SSam Leffler chanbmask_t chan11b; /* 11b channels */ 101814779705SSam Leffler chanbmask_t chan11g; /* 11g channels */ 101914779705SSam Leffler chanbmask_t chan11g_turbo; /* 11g dynamic turbo channels */ 102014779705SSam Leffler chanbmask_t chan11g_half; /* 11g 1/2 width channels */ 102114779705SSam Leffler chanbmask_t chan11g_quarter; /* 11g 1/4 width channels */ 102214779705SSam Leffler } REG_DOMAIN; 102314779705SSam Leffler 102414779705SSam Leffler static REG_DOMAIN regDomains[] = { 102514779705SSam Leffler 102614779705SSam Leffler {.regDmnEnum = DEBUG_REG_DMN, 102714779705SSam Leffler .conformanceTestLimit = FCC, 102814779705SSam Leffler .dfsMask = DFS_FCC3, 102959efa8b5SSam Leffler .chan11a = BM3(F1_5120_5240, F1_5260_5700, F1_5745_5825), 103059efa8b5SSam Leffler .chan11a_half = BM3(F2_5120_5240, F2_5260_5700, F7_5745_5825), 103159efa8b5SSam Leffler .chan11a_quarter = BM3(F3_5120_5240, F3_5260_5700, F8_5745_5825), 103214779705SSam Leffler .chan11a_turbo = BM8(T1_5130_5210, 103314779705SSam Leffler T1_5250_5330, 103414779705SSam Leffler T1_5370_5490, 103514779705SSam Leffler T1_5530_5650, 103614779705SSam Leffler T1_5150_5190, 103714779705SSam Leffler T1_5230_5310, 103814779705SSam Leffler T1_5350_5470, 103914779705SSam Leffler T1_5510_5670), 104014779705SSam Leffler .chan11a_dyn_turbo = BM4(T1_5200_5240, 104114779705SSam Leffler T1_5280_5280, 104214779705SSam Leffler T1_5540_5660, 104314779705SSam Leffler T1_5765_5805), 104414779705SSam Leffler .chan11b = BM4(F1_2312_2372, 104514779705SSam Leffler F1_2412_2472, 104614779705SSam Leffler F1_2484_2484, 104714779705SSam Leffler F1_2512_2732), 104814779705SSam Leffler .chan11g = BM3(G1_2312_2372, G1_2412_2472, G1_2512_2732), 104914779705SSam Leffler .chan11g_turbo = BM3(T1_2312_2372, T1_2437_2437, T1_2512_2732), 105014779705SSam Leffler .chan11g_half = BM3(G2_2312_2372, G4_2412_2472, G2_2512_2732), 105114779705SSam Leffler .chan11g_quarter = BM3(G3_2312_2372, G5_2412_2472, G3_2512_2732), 105214779705SSam Leffler }, 105314779705SSam Leffler 105414779705SSam Leffler {.regDmnEnum = APL1, 105514779705SSam Leffler .conformanceTestLimit = FCC, 105614779705SSam Leffler .chan11a = BM1(F4_5745_5825), 105714779705SSam Leffler }, 105814779705SSam Leffler 105914779705SSam Leffler {.regDmnEnum = APL2, 106014779705SSam Leffler .conformanceTestLimit = FCC, 106114779705SSam Leffler .chan11a = BM1(F1_5745_5805), 106214779705SSam Leffler }, 106314779705SSam Leffler 106414779705SSam Leffler {.regDmnEnum = APL3, 106514779705SSam Leffler .conformanceTestLimit = FCC, 106614779705SSam Leffler .chan11a = BM2(F1_5280_5320, F2_5745_5805), 106714779705SSam Leffler }, 106814779705SSam Leffler 106914779705SSam Leffler {.regDmnEnum = APL4, 107014779705SSam Leffler .conformanceTestLimit = FCC, 107114779705SSam Leffler .chan11a = BM2(F4_5180_5240, F3_5745_5825), 107214779705SSam Leffler }, 107314779705SSam Leffler 107414779705SSam Leffler {.regDmnEnum = APL5, 107514779705SSam Leffler .conformanceTestLimit = FCC, 107614779705SSam Leffler .chan11a = BM1(F2_5745_5825), 107714779705SSam Leffler }, 107814779705SSam Leffler 107914779705SSam Leffler {.regDmnEnum = APL6, 108014779705SSam Leffler .conformanceTestLimit = ETSI, 108114779705SSam Leffler .dfsMask = DFS_ETSI, 108214779705SSam Leffler .pscan = PSCAN_FCC_T | PSCAN_FCC, 108314779705SSam Leffler .chan11a = BM3(F4_5180_5240, F2_5260_5320, F3_5745_5825), 108414779705SSam Leffler .chan11a_turbo = BM3(T2_5210_5210, T1_5250_5290, T1_5760_5800), 108514779705SSam Leffler }, 108614779705SSam Leffler 108714779705SSam Leffler {.regDmnEnum = APL8, 108814779705SSam Leffler .conformanceTestLimit = ETSI, 108914779705SSam Leffler .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 109014779705SSam Leffler .chan11a = BM2(F6_5260_5320, F4_5745_5825), 109114779705SSam Leffler }, 109214779705SSam Leffler 109314779705SSam Leffler {.regDmnEnum = APL9, 109414779705SSam Leffler .conformanceTestLimit = ETSI, 109514779705SSam Leffler .dfsMask = DFS_ETSI, 109614779705SSam Leffler .pscan = PSCAN_ETSI, 109714779705SSam Leffler .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 109814779705SSam Leffler .chan11a = BM3(F1_5180_5320, F1_5500_5620, F3_5745_5805), 109914779705SSam Leffler }, 110014779705SSam Leffler 110114779705SSam Leffler {.regDmnEnum = ETSI1, 110214779705SSam Leffler .conformanceTestLimit = ETSI, 110314779705SSam Leffler .dfsMask = DFS_ETSI, 110414779705SSam Leffler .pscan = PSCAN_ETSI, 110514779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 110614779705SSam Leffler .chan11a = BM3(W2_5180_5240, F2_5260_5320, F2_5500_5700), 110714779705SSam Leffler }, 110814779705SSam Leffler 110914779705SSam Leffler {.regDmnEnum = ETSI2, 111014779705SSam Leffler .conformanceTestLimit = ETSI, 111114779705SSam Leffler .dfsMask = DFS_ETSI, 111214779705SSam Leffler .pscan = PSCAN_ETSI, 111314779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 111414779705SSam Leffler .chan11a = BM1(F3_5180_5240), 111514779705SSam Leffler }, 111614779705SSam Leffler 111714779705SSam Leffler {.regDmnEnum = ETSI3, 111814779705SSam Leffler .conformanceTestLimit = ETSI, 111914779705SSam Leffler .dfsMask = DFS_ETSI, 112014779705SSam Leffler .pscan = PSCAN_ETSI, 112114779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 112214779705SSam Leffler .chan11a = BM2(W2_5180_5240, F2_5260_5320), 112314779705SSam Leffler }, 112414779705SSam Leffler 112514779705SSam Leffler {.regDmnEnum = ETSI4, 112614779705SSam Leffler .conformanceTestLimit = ETSI, 112714779705SSam Leffler .dfsMask = DFS_ETSI, 112814779705SSam Leffler .pscan = PSCAN_ETSI, 112914779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 113014779705SSam Leffler .chan11a = BM2(F3_5180_5240, F1_5260_5320), 113114779705SSam Leffler }, 113214779705SSam Leffler 113314779705SSam Leffler {.regDmnEnum = ETSI5, 113414779705SSam Leffler .conformanceTestLimit = ETSI, 113514779705SSam Leffler .dfsMask = DFS_ETSI, 113614779705SSam Leffler .pscan = PSCAN_ETSI, 113714779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 113814779705SSam Leffler .chan11a = BM1(F1_5180_5240), 113914779705SSam Leffler }, 114014779705SSam Leffler 114114779705SSam Leffler {.regDmnEnum = ETSI6, 114214779705SSam Leffler .conformanceTestLimit = ETSI, 114314779705SSam Leffler .dfsMask = DFS_ETSI, 114414779705SSam Leffler .pscan = PSCAN_ETSI, 114514779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 114614779705SSam Leffler .chan11a = BM3(F5_5180_5240, F1_5260_5280, F3_5500_5700), 114714779705SSam Leffler }, 114814779705SSam Leffler 114914779705SSam Leffler {.regDmnEnum = FCC1, 115014779705SSam Leffler .conformanceTestLimit = FCC, 115114779705SSam Leffler .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 115214779705SSam Leffler .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 115314779705SSam Leffler .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 115414779705SSam Leffler }, 115514779705SSam Leffler 115614779705SSam Leffler {.regDmnEnum = FCC2, 115714779705SSam Leffler .conformanceTestLimit = FCC, 115814779705SSam Leffler .chan11a = BM3(F6_5180_5240, F5_5260_5320, F6_5745_5825), 115914779705SSam Leffler .chan11a_dyn_turbo = BM3(T2_5200_5240, T1_5280_5280, T1_5765_5805), 116014779705SSam Leffler }, 116114779705SSam Leffler 116214779705SSam Leffler {.regDmnEnum = FCC3, 116314779705SSam Leffler .conformanceTestLimit = FCC, 116414779705SSam Leffler .dfsMask = DFS_FCC3, 116514779705SSam Leffler .pscan = PSCAN_FCC | PSCAN_FCC_T, 116614779705SSam Leffler .chan11a = BM4(F2_5180_5240, 116714779705SSam Leffler F3_5260_5320, 116814779705SSam Leffler F1_5500_5700, 116914779705SSam Leffler F5_5745_5825), 117014779705SSam Leffler .chan11a_turbo = BM4(T1_5210_5210, 117114779705SSam Leffler T1_5250_5250, 117214779705SSam Leffler T1_5290_5290, 117314779705SSam Leffler T2_5760_5800), 117414779705SSam Leffler .chan11a_dyn_turbo = BM3(T1_5200_5240, T2_5280_5280, T1_5540_5660), 117514779705SSam Leffler }, 117614779705SSam Leffler 117714779705SSam Leffler {.regDmnEnum = FCC4, 117814779705SSam Leffler .conformanceTestLimit = FCC, 117914779705SSam Leffler .dfsMask = DFS_FCC3, 118014779705SSam Leffler .pscan = PSCAN_FCC | PSCAN_FCC_T, 118114779705SSam Leffler .chan11a = BM1(F1_4950_4980), 118214779705SSam Leffler .chan11a_half = BM1(F1_4945_4985), 118314779705SSam Leffler .chan11a_quarter = BM1(F1_4942_4987), 118414779705SSam Leffler }, 118514779705SSam Leffler 118614779705SSam Leffler /* FCC1 w/ 1/2 and 1/4 width channels */ 118714779705SSam Leffler {.regDmnEnum = FCC5, 118814779705SSam Leffler .conformanceTestLimit = FCC, 118914779705SSam Leffler .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 119014779705SSam Leffler .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 119114779705SSam Leffler .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 119214779705SSam Leffler .chan11a_half = BM3(F7_5180_5240, F7_5260_5320, F9_5745_5825), 119314779705SSam Leffler .chan11a_quarter = BM3(F8_5180_5240, F8_5260_5320,F10_5745_5825), 119414779705SSam Leffler }, 119514779705SSam Leffler 119614779705SSam Leffler {.regDmnEnum = MKK1, 119714779705SSam Leffler .conformanceTestLimit = MKK, 119814779705SSam Leffler .pscan = PSCAN_MKK1, 119914779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 120014779705SSam Leffler .chan11a = BM1(F1_5170_5230), 120114779705SSam Leffler }, 120214779705SSam Leffler 120314779705SSam Leffler {.regDmnEnum = MKK2, 120414779705SSam Leffler .conformanceTestLimit = MKK, 120514779705SSam Leffler .pscan = PSCAN_MKK2, 120614779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 120714779705SSam Leffler .chan11a = BM3(F1_4920_4980, F1_5040_5080, F1_5170_5230), 120814779705SSam Leffler .chan11a_half = BM4(F1_4915_4925, 120914779705SSam Leffler F1_4935_4945, 121014779705SSam Leffler F1_5035_5040, 121114779705SSam Leffler F1_5055_5055), 121214779705SSam Leffler }, 121314779705SSam Leffler 121414779705SSam Leffler /* UNI-1 even */ 121514779705SSam Leffler {.regDmnEnum = MKK3, 121614779705SSam Leffler .conformanceTestLimit = MKK, 121714779705SSam Leffler .pscan = PSCAN_MKK3, 121814779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 121914779705SSam Leffler .chan11a = BM1(F4_5180_5240), 122014779705SSam Leffler }, 122114779705SSam Leffler 122214779705SSam Leffler /* UNI-1 even + UNI-2 */ 122314779705SSam Leffler {.regDmnEnum = MKK4, 122414779705SSam Leffler .conformanceTestLimit = MKK, 122514779705SSam Leffler .dfsMask = DFS_MKK4, 122614779705SSam Leffler .pscan = PSCAN_MKK3, 122714779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 122814779705SSam Leffler .chan11a = BM2(F4_5180_5240, F2_5260_5320), 122914779705SSam Leffler }, 123014779705SSam Leffler 123114779705SSam Leffler /* UNI-1 even + UNI-2 + mid-band */ 123214779705SSam Leffler {.regDmnEnum = MKK5, 123314779705SSam Leffler .conformanceTestLimit = MKK, 123414779705SSam Leffler .dfsMask = DFS_MKK4, 123514779705SSam Leffler .pscan = PSCAN_MKK3, 123614779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 123714779705SSam Leffler .chan11a = BM3(F4_5180_5240, F2_5260_5320, F4_5500_5700), 123814779705SSam Leffler }, 123914779705SSam Leffler 124014779705SSam Leffler /* UNI-1 odd + even */ 124114779705SSam Leffler {.regDmnEnum = MKK6, 124214779705SSam Leffler .conformanceTestLimit = MKK, 124314779705SSam Leffler .pscan = PSCAN_MKK1, 124414779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 124514779705SSam Leffler .chan11a = BM2(F2_5170_5230, F4_5180_5240), 124614779705SSam Leffler }, 124714779705SSam Leffler 124814779705SSam Leffler /* UNI-1 odd + UNI-1 even + UNI-2 */ 124914779705SSam Leffler {.regDmnEnum = MKK7, 125014779705SSam Leffler .conformanceTestLimit = MKK, 125114779705SSam Leffler .dfsMask = DFS_MKK4, 125214779705SSam Leffler .pscan = PSCAN_MKK1 | PSCAN_MKK3, 125314779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 125414779705SSam Leffler .chan11a = BM3(F1_5170_5230, F4_5180_5240, F2_5260_5320), 125514779705SSam Leffler }, 125614779705SSam Leffler 125714779705SSam Leffler /* UNI-1 odd + UNI-1 even + UNI-2 + mid-band */ 125814779705SSam Leffler {.regDmnEnum = MKK8, 125914779705SSam Leffler .conformanceTestLimit = MKK, 126014779705SSam Leffler .dfsMask = DFS_MKK4, 126114779705SSam Leffler .pscan = PSCAN_MKK1 | PSCAN_MKK3, 126214779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 126314779705SSam Leffler .chan11a = BM4(F1_5170_5230, 126414779705SSam Leffler F4_5180_5240, 126514779705SSam Leffler F2_5260_5320, 126614779705SSam Leffler F4_5500_5700), 126714779705SSam Leffler }, 126814779705SSam Leffler 126914779705SSam Leffler /* UNI-1 even + 4.9 GHZ */ 127014779705SSam Leffler {.regDmnEnum = MKK9, 127114779705SSam Leffler .conformanceTestLimit = MKK, 127214779705SSam Leffler .pscan = PSCAN_MKK3, 127314779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 127414779705SSam Leffler .chan11a = BM7(F1_4915_4925, 127514779705SSam Leffler F1_4935_4945, 127614779705SSam Leffler F1_4920_4980, 127714779705SSam Leffler F1_5035_5040, 127814779705SSam Leffler F1_5055_5055, 127914779705SSam Leffler F1_5040_5080, 128014779705SSam Leffler F4_5180_5240), 128114779705SSam Leffler }, 128214779705SSam Leffler 128314779705SSam Leffler /* UNI-1 even + UNI-2 + 4.9 GHZ */ 128414779705SSam Leffler {.regDmnEnum = MKK10, 128514779705SSam Leffler .conformanceTestLimit = MKK, 128614779705SSam Leffler .dfsMask = DFS_MKK4, 128714779705SSam Leffler .pscan = PSCAN_MKK3, 128814779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 128914779705SSam Leffler .chan11a = BM8(F1_4915_4925, 129014779705SSam Leffler F1_4935_4945, 129114779705SSam Leffler F1_4920_4980, 129214779705SSam Leffler F1_5035_5040, 129314779705SSam Leffler F1_5055_5055, 129414779705SSam Leffler F1_5040_5080, 129514779705SSam Leffler F4_5180_5240, 129614779705SSam Leffler F2_5260_5320), 129714779705SSam Leffler }, 129814779705SSam Leffler 129914779705SSam Leffler /* Defined here to use when 2G channels are authorised for country K2 */ 130014779705SSam Leffler {.regDmnEnum = APLD, 130114779705SSam Leffler .conformanceTestLimit = NO_CTL, 130214779705SSam Leffler .chan11b = BM2(F2_2312_2372,F2_2412_2472), 130314779705SSam Leffler .chan11g = BM2(G2_2312_2372,G2_2412_2472), 130414779705SSam Leffler }, 130514779705SSam Leffler 130614779705SSam Leffler {.regDmnEnum = ETSIA, 130714779705SSam Leffler .conformanceTestLimit = NO_CTL, 130814779705SSam Leffler .pscan = PSCAN_ETSIA, 130914779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 131014779705SSam Leffler .chan11b = BM1(F1_2457_2472), 131114779705SSam Leffler .chan11g = BM1(G1_2457_2472), 131214779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 131314779705SSam Leffler }, 131414779705SSam Leffler 131514779705SSam Leffler {.regDmnEnum = ETSIB, 131614779705SSam Leffler .conformanceTestLimit = ETSI, 131714779705SSam Leffler .pscan = PSCAN_ETSIB, 131814779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 131914779705SSam Leffler .chan11b = BM1(F1_2432_2442), 132014779705SSam Leffler .chan11g = BM1(G1_2432_2442), 132114779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 132214779705SSam Leffler }, 132314779705SSam Leffler 132414779705SSam Leffler {.regDmnEnum = ETSIC, 132514779705SSam Leffler .conformanceTestLimit = ETSI, 132614779705SSam Leffler .pscan = PSCAN_ETSIC, 132714779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 132814779705SSam Leffler .chan11b = BM1(F3_2412_2472), 132914779705SSam Leffler .chan11g = BM1(G3_2412_2472), 133014779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 133114779705SSam Leffler }, 133214779705SSam Leffler 133314779705SSam Leffler {.regDmnEnum = FCCA, 133414779705SSam Leffler .conformanceTestLimit = FCC, 133514779705SSam Leffler .chan11b = BM1(F1_2412_2462), 133614779705SSam Leffler .chan11g = BM1(G1_2412_2462), 133714779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437), 133814779705SSam Leffler }, 133914779705SSam Leffler 134014779705SSam Leffler /* FCCA w/ 1/2 and 1/4 width channels */ 134114779705SSam Leffler {.regDmnEnum = FCCB, 134214779705SSam Leffler .conformanceTestLimit = FCC, 134314779705SSam Leffler .chan11b = BM1(F1_2412_2462), 134414779705SSam Leffler .chan11g = BM1(G1_2412_2462), 134514779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437), 134614779705SSam Leffler .chan11g_half = BM1(G3_2412_2462), 134714779705SSam Leffler .chan11g_quarter = BM1(G4_2412_2462), 134814779705SSam Leffler }, 134914779705SSam Leffler 135014779705SSam Leffler {.regDmnEnum = MKKA, 135114779705SSam Leffler .conformanceTestLimit = MKK, 135214779705SSam Leffler .pscan = PSCAN_MKKA | PSCAN_MKKA_G 135314779705SSam Leffler | PSCAN_MKKA1 | PSCAN_MKKA1_G 135414779705SSam Leffler | PSCAN_MKKA2 | PSCAN_MKKA2_G, 135514779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 135614779705SSam Leffler .chan11b = BM3(F2_2412_2462, F1_2467_2472, F2_2484_2484), 135714779705SSam Leffler .chan11g = BM2(G2_2412_2462, G1_2467_2472), 135814779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 135914779705SSam Leffler }, 136014779705SSam Leffler 136114779705SSam Leffler {.regDmnEnum = MKKC, 136214779705SSam Leffler .conformanceTestLimit = MKK, 136314779705SSam Leffler .chan11b = BM1(F2_2412_2472), 136414779705SSam Leffler .chan11g = BM1(G2_2412_2472), 136514779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 136614779705SSam Leffler }, 136714779705SSam Leffler 136814779705SSam Leffler {.regDmnEnum = WORLD, 136914779705SSam Leffler .conformanceTestLimit = ETSI, 137014779705SSam Leffler .chan11b = BM1(F2_2412_2472), 137114779705SSam Leffler .chan11g = BM1(G2_2412_2472), 137214779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 137314779705SSam Leffler }, 137414779705SSam Leffler 137514779705SSam Leffler {.regDmnEnum = WOR0_WORLD, 137614779705SSam Leffler .conformanceTestLimit = NO_CTL, 137714779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 137814779705SSam Leffler .pscan = PSCAN_WWR, 137914779705SSam Leffler .flags = ADHOC_PER_11D, 138014779705SSam Leffler .chan11a = BM5(W1_5260_5320, 138114779705SSam Leffler W1_5180_5240, 138214779705SSam Leffler W1_5170_5230, 138314779705SSam Leffler W1_5745_5825, 138414779705SSam Leffler W1_5500_5700), 138514779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 138614779705SSam Leffler WT1_5290_5290, 138714779705SSam Leffler WT1_5760_5800), 138814779705SSam Leffler .chan11b = BM8(W1_2412_2412, 138914779705SSam Leffler W1_2437_2442, 139014779705SSam Leffler W1_2462_2462, 139114779705SSam Leffler W1_2472_2472, 139214779705SSam Leffler W1_2417_2432, 139314779705SSam Leffler W1_2447_2457, 139414779705SSam Leffler W1_2467_2467, 139514779705SSam Leffler W1_2484_2484), 139614779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 139714779705SSam Leffler WG1_2437_2442, 139814779705SSam Leffler WG1_2462_2462, 139914779705SSam Leffler WG1_2472_2472, 140014779705SSam Leffler WG1_2417_2432, 140114779705SSam Leffler WG1_2447_2457, 140214779705SSam Leffler WG1_2467_2467), 140314779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437) 140414779705SSam Leffler }, 140514779705SSam Leffler 140614779705SSam Leffler {.regDmnEnum = WOR01_WORLD, 140714779705SSam Leffler .conformanceTestLimit = NO_CTL, 140814779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 140914779705SSam Leffler .pscan = PSCAN_WWR, 141014779705SSam Leffler .flags = ADHOC_PER_11D, 141114779705SSam Leffler .chan11a = BM5(W1_5260_5320, 141214779705SSam Leffler W1_5180_5240, 141314779705SSam Leffler W1_5170_5230, 141414779705SSam Leffler W1_5745_5825, 141514779705SSam Leffler W1_5500_5700), 141614779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 141714779705SSam Leffler WT1_5290_5290, 141814779705SSam Leffler WT1_5760_5800), 141914779705SSam Leffler .chan11b = BM5(W1_2412_2412, 142014779705SSam Leffler W1_2437_2442, 142114779705SSam Leffler W1_2462_2462, 142214779705SSam Leffler W1_2417_2432, 142314779705SSam Leffler W1_2447_2457), 142414779705SSam Leffler .chan11g = BM5(WG1_2412_2412, 142514779705SSam Leffler WG1_2437_2442, 142614779705SSam Leffler WG1_2462_2462, 142714779705SSam Leffler WG1_2417_2432, 142814779705SSam Leffler WG1_2447_2457), 142914779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 143014779705SSam Leffler 143114779705SSam Leffler {.regDmnEnum = WOR02_WORLD, 143214779705SSam Leffler .conformanceTestLimit = NO_CTL, 143314779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 143414779705SSam Leffler .pscan = PSCAN_WWR, 143514779705SSam Leffler .flags = ADHOC_PER_11D, 143614779705SSam Leffler .chan11a = BM5(W1_5260_5320, 143714779705SSam Leffler W1_5180_5240, 143814779705SSam Leffler W1_5170_5230, 143914779705SSam Leffler W1_5745_5825, 144014779705SSam Leffler W1_5500_5700), 144114779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 144214779705SSam Leffler WT1_5290_5290, 144314779705SSam Leffler WT1_5760_5800), 144414779705SSam Leffler .chan11b = BM7(W1_2412_2412, 144514779705SSam Leffler W1_2437_2442, 144614779705SSam Leffler W1_2462_2462, 144714779705SSam Leffler W1_2472_2472, 144814779705SSam Leffler W1_2417_2432, 144914779705SSam Leffler W1_2447_2457, 145014779705SSam Leffler W1_2467_2467), 145114779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 145214779705SSam Leffler WG1_2437_2442, 145314779705SSam Leffler WG1_2462_2462, 145414779705SSam Leffler WG1_2472_2472, 145514779705SSam Leffler WG1_2417_2432, 145614779705SSam Leffler WG1_2447_2457, 145714779705SSam Leffler WG1_2467_2467), 145814779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 145914779705SSam Leffler 146014779705SSam Leffler {.regDmnEnum = EU1_WORLD, 146114779705SSam Leffler .conformanceTestLimit = NO_CTL, 146214779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 146314779705SSam Leffler .pscan = PSCAN_WWR, 146414779705SSam Leffler .flags = ADHOC_PER_11D, 146514779705SSam Leffler .chan11a = BM5(W1_5260_5320, 146614779705SSam Leffler W1_5180_5240, 146714779705SSam Leffler W1_5170_5230, 146814779705SSam Leffler W1_5745_5825, 146914779705SSam Leffler W1_5500_5700), 147014779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 147114779705SSam Leffler WT1_5290_5290, 147214779705SSam Leffler WT1_5760_5800), 147314779705SSam Leffler .chan11b = BM7(W1_2412_2412, 147414779705SSam Leffler W1_2437_2442, 147514779705SSam Leffler W1_2462_2462, 147614779705SSam Leffler W2_2472_2472, 147714779705SSam Leffler W1_2417_2432, 147814779705SSam Leffler W1_2447_2457, 147914779705SSam Leffler W2_2467_2467), 148014779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 148114779705SSam Leffler WG1_2437_2442, 148214779705SSam Leffler WG1_2462_2462, 148314779705SSam Leffler WG2_2472_2472, 148414779705SSam Leffler WG1_2417_2432, 148514779705SSam Leffler WG1_2447_2457, 148614779705SSam Leffler WG2_2467_2467), 148714779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 148814779705SSam Leffler 148914779705SSam Leffler {.regDmnEnum = WOR1_WORLD, 149014779705SSam Leffler .conformanceTestLimit = NO_CTL, 149114779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 149214779705SSam Leffler .pscan = PSCAN_WWR, 149359efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 149414779705SSam Leffler .chan11a = BM5(W1_5260_5320, 149514779705SSam Leffler W1_5180_5240, 149614779705SSam Leffler W1_5170_5230, 149714779705SSam Leffler W1_5745_5825, 149814779705SSam Leffler W1_5500_5700), 149914779705SSam Leffler .chan11b = BM8(W1_2412_2412, 150014779705SSam Leffler W1_2437_2442, 150114779705SSam Leffler W1_2462_2462, 150214779705SSam Leffler W1_2472_2472, 150314779705SSam Leffler W1_2417_2432, 150414779705SSam Leffler W1_2447_2457, 150514779705SSam Leffler W1_2467_2467, 150614779705SSam Leffler W1_2484_2484), 150714779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 150814779705SSam Leffler WG1_2437_2442, 150914779705SSam Leffler WG1_2462_2462, 151014779705SSam Leffler WG1_2472_2472, 151114779705SSam Leffler WG1_2417_2432, 151214779705SSam Leffler WG1_2447_2457, 151314779705SSam Leffler WG1_2467_2467), 151414779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437) 151514779705SSam Leffler }, 151614779705SSam Leffler 151714779705SSam Leffler {.regDmnEnum = WOR2_WORLD, 151814779705SSam Leffler .conformanceTestLimit = NO_CTL, 151914779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 152014779705SSam Leffler .pscan = PSCAN_WWR, 152159efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 152214779705SSam Leffler .chan11a = BM5(W1_5260_5320, 152314779705SSam Leffler W1_5180_5240, 152414779705SSam Leffler W1_5170_5230, 152514779705SSam Leffler W1_5745_5825, 152614779705SSam Leffler W1_5500_5700), 152714779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 152814779705SSam Leffler WT1_5290_5290, 152914779705SSam Leffler WT1_5760_5800), 153014779705SSam Leffler .chan11b = BM8(W1_2412_2412, 153114779705SSam Leffler W1_2437_2442, 153214779705SSam Leffler W1_2462_2462, 153314779705SSam Leffler W1_2472_2472, 153414779705SSam Leffler W1_2417_2432, 153514779705SSam Leffler W1_2447_2457, 153614779705SSam Leffler W1_2467_2467, 153714779705SSam Leffler W1_2484_2484), 153814779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 153914779705SSam Leffler WG1_2437_2442, 154014779705SSam Leffler WG1_2462_2462, 154114779705SSam Leffler WG1_2472_2472, 154214779705SSam Leffler WG1_2417_2432, 154314779705SSam Leffler WG1_2447_2457, 154414779705SSam Leffler WG1_2467_2467), 154514779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 154614779705SSam Leffler 154714779705SSam Leffler {.regDmnEnum = WOR3_WORLD, 154814779705SSam Leffler .conformanceTestLimit = NO_CTL, 154914779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 155014779705SSam Leffler .pscan = PSCAN_WWR, 155114779705SSam Leffler .flags = ADHOC_PER_11D, 155214779705SSam Leffler .chan11a = BM4(W1_5260_5320, 155314779705SSam Leffler W1_5180_5240, 155414779705SSam Leffler W1_5170_5230, 155514779705SSam Leffler W1_5745_5825), 155614779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 155714779705SSam Leffler WT1_5290_5290, 155814779705SSam Leffler WT1_5760_5800), 155914779705SSam Leffler .chan11b = BM7(W1_2412_2412, 156014779705SSam Leffler W1_2437_2442, 156114779705SSam Leffler W1_2462_2462, 156214779705SSam Leffler W1_2472_2472, 156314779705SSam Leffler W1_2417_2432, 156414779705SSam Leffler W1_2447_2457, 156514779705SSam Leffler W1_2467_2467), 156614779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 156714779705SSam Leffler WG1_2437_2442, 156814779705SSam Leffler WG1_2462_2462, 156914779705SSam Leffler WG1_2472_2472, 157014779705SSam Leffler WG1_2417_2432, 157114779705SSam Leffler WG1_2447_2457, 157214779705SSam Leffler WG1_2467_2467), 157314779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 157414779705SSam Leffler 157514779705SSam Leffler {.regDmnEnum = WOR4_WORLD, 157614779705SSam Leffler .conformanceTestLimit = NO_CTL, 157714779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 157814779705SSam Leffler .pscan = PSCAN_WWR, 157959efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 158014779705SSam Leffler .chan11a = BM4(W2_5260_5320, 158114779705SSam Leffler W2_5180_5240, 158214779705SSam Leffler F2_5745_5805, 158314779705SSam Leffler W2_5825_5825), 158414779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 158514779705SSam Leffler WT1_5290_5290, 158614779705SSam Leffler WT1_5760_5800), 158714779705SSam Leffler .chan11b = BM5(W1_2412_2412, 158814779705SSam Leffler W1_2437_2442, 158914779705SSam Leffler W1_2462_2462, 159014779705SSam Leffler W1_2417_2432, 159114779705SSam Leffler W1_2447_2457), 159214779705SSam Leffler .chan11g = BM5(WG1_2412_2412, 159314779705SSam Leffler WG1_2437_2442, 159414779705SSam Leffler WG1_2462_2462, 159514779705SSam Leffler WG1_2417_2432, 159614779705SSam Leffler WG1_2447_2457), 159714779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 159814779705SSam Leffler 159914779705SSam Leffler {.regDmnEnum = WOR5_ETSIC, 160014779705SSam Leffler .conformanceTestLimit = NO_CTL, 160114779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 160214779705SSam Leffler .pscan = PSCAN_WWR, 160359efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 160414779705SSam Leffler .chan11a = BM3(W1_5260_5320, W2_5180_5240, F6_5745_5825), 160514779705SSam Leffler .chan11b = BM7(W1_2412_2412, 160614779705SSam Leffler W1_2437_2442, 160714779705SSam Leffler W1_2462_2462, 160814779705SSam Leffler W2_2472_2472, 160914779705SSam Leffler W1_2417_2432, 161014779705SSam Leffler W1_2447_2457, 161114779705SSam Leffler W2_2467_2467), 161214779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 161314779705SSam Leffler WG1_2437_2442, 161414779705SSam Leffler WG1_2462_2462, 161514779705SSam Leffler WG2_2472_2472, 161614779705SSam Leffler WG1_2417_2432, 161714779705SSam Leffler WG1_2447_2457, 161814779705SSam Leffler WG2_2467_2467), 161914779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 162014779705SSam Leffler 162114779705SSam Leffler {.regDmnEnum = WOR9_WORLD, 162214779705SSam Leffler .conformanceTestLimit = NO_CTL, 162314779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 162414779705SSam Leffler .pscan = PSCAN_WWR, 162559efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 162614779705SSam Leffler .chan11a = BM4(W1_5260_5320, 162714779705SSam Leffler W1_5180_5240, 162814779705SSam Leffler W1_5745_5825, 162914779705SSam Leffler W1_5500_5700), 163014779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 163114779705SSam Leffler WT1_5290_5290, 163214779705SSam Leffler WT1_5760_5800), 163314779705SSam Leffler .chan11b = BM5(W1_2412_2412, 163414779705SSam Leffler W1_2437_2442, 163514779705SSam Leffler W1_2462_2462, 163614779705SSam Leffler W1_2417_2432, 163714779705SSam Leffler W1_2447_2457), 163814779705SSam Leffler .chan11g = BM5(WG1_2412_2412, 163914779705SSam Leffler WG1_2437_2442, 164014779705SSam Leffler WG1_2462_2462, 164114779705SSam Leffler WG1_2417_2432, 164214779705SSam Leffler WG1_2447_2457), 164314779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 164414779705SSam Leffler 164514779705SSam Leffler {.regDmnEnum = WORA_WORLD, 164614779705SSam Leffler .conformanceTestLimit = NO_CTL, 164714779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 164814779705SSam Leffler .pscan = PSCAN_WWR, 164959efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 165014779705SSam Leffler .chan11a = BM4(W1_5260_5320, 165114779705SSam Leffler W1_5180_5240, 165214779705SSam Leffler W1_5745_5825, 165314779705SSam Leffler W1_5500_5700), 165414779705SSam Leffler .chan11b = BM7(W1_2412_2412, 165514779705SSam Leffler W1_2437_2442, 165614779705SSam Leffler W1_2462_2462, 165714779705SSam Leffler W1_2472_2472, 165814779705SSam Leffler W1_2417_2432, 165914779705SSam Leffler W1_2447_2457, 166014779705SSam Leffler W1_2467_2467), 166114779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 166214779705SSam Leffler WG1_2437_2442, 166314779705SSam Leffler WG1_2462_2462, 166414779705SSam Leffler WG1_2472_2472, 166514779705SSam Leffler WG1_2417_2432, 166614779705SSam Leffler WG1_2447_2457, 166714779705SSam Leffler WG1_2467_2467), 166814779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 166914779705SSam Leffler 167014779705SSam Leffler {.regDmnEnum = NULL1, 167114779705SSam Leffler .conformanceTestLimit = NO_CTL, 167214779705SSam Leffler } 167314779705SSam Leffler }; 167414779705SSam Leffler 167514779705SSam Leffler struct cmode { 167614779705SSam Leffler u_int mode; 167714779705SSam Leffler u_int flags; 167814779705SSam Leffler }; 167914779705SSam Leffler 168014779705SSam Leffler static const struct cmode modes[] = { 168159efa8b5SSam Leffler { HAL_MODE_TURBO, IEEE80211_CHAN_ST }, 168259efa8b5SSam Leffler { HAL_MODE_11A, IEEE80211_CHAN_A }, 168359efa8b5SSam Leffler { HAL_MODE_11B, IEEE80211_CHAN_B }, 168459efa8b5SSam Leffler { HAL_MODE_11G, IEEE80211_CHAN_G }, 168559efa8b5SSam Leffler { HAL_MODE_11G_TURBO, IEEE80211_CHAN_108G }, 168659efa8b5SSam Leffler { HAL_MODE_11A_TURBO, IEEE80211_CHAN_108A }, 168759efa8b5SSam Leffler { HAL_MODE_11A_QUARTER_RATE, 168859efa8b5SSam Leffler IEEE80211_CHAN_A | IEEE80211_CHAN_QUARTER }, 168959efa8b5SSam Leffler { HAL_MODE_11A_HALF_RATE, 169059efa8b5SSam Leffler IEEE80211_CHAN_A | IEEE80211_CHAN_HALF }, 169159efa8b5SSam Leffler { HAL_MODE_11G_QUARTER_RATE, 169259efa8b5SSam Leffler IEEE80211_CHAN_G | IEEE80211_CHAN_QUARTER }, 169359efa8b5SSam Leffler { HAL_MODE_11G_HALF_RATE, 169459efa8b5SSam Leffler IEEE80211_CHAN_G | IEEE80211_CHAN_HALF }, 169559efa8b5SSam Leffler { HAL_MODE_11NG_HT20, IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_HT20 }, 169659efa8b5SSam Leffler { HAL_MODE_11NG_HT40PLUS, 169759efa8b5SSam Leffler IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_HT40U }, 169859efa8b5SSam Leffler { HAL_MODE_11NG_HT40MINUS, 169959efa8b5SSam Leffler IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_HT40D }, 170059efa8b5SSam Leffler { HAL_MODE_11NA_HT20, IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT20 }, 170159efa8b5SSam Leffler { HAL_MODE_11NA_HT40PLUS, 170259efa8b5SSam Leffler IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT40U }, 170359efa8b5SSam Leffler { HAL_MODE_11NA_HT40MINUS, 170459efa8b5SSam Leffler IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT40D }, 170514779705SSam Leffler }; 170614779705SSam Leffler 170759efa8b5SSam Leffler static OS_INLINE uint16_t 170814779705SSam Leffler getEepromRD(struct ath_hal *ah) 170914779705SSam Leffler { 171014779705SSam Leffler return AH_PRIVATE(ah)->ah_currentRD &~ WORLDWIDE_ROAMING_FLAG; 171114779705SSam Leffler } 171214779705SSam Leffler 171314779705SSam Leffler /* 171414779705SSam Leffler * Test to see if the bitmask array is all zeros 171514779705SSam Leffler */ 171614779705SSam Leffler static HAL_BOOL 171714779705SSam Leffler isChanBitMaskZero(const uint64_t *bitmask) 171814779705SSam Leffler { 171914779705SSam Leffler #if BMLEN > 2 172014779705SSam Leffler #error "add more cases" 172114779705SSam Leffler #endif 172214779705SSam Leffler #if BMLEN > 1 172314779705SSam Leffler if (bitmask[1] != 0) 172414779705SSam Leffler return AH_FALSE; 172514779705SSam Leffler #endif 172614779705SSam Leffler return (bitmask[0] == 0); 172714779705SSam Leffler } 172814779705SSam Leffler 172914779705SSam Leffler /* 173014779705SSam Leffler * Return whether or not the regulatory domain/country in EEPROM 173114779705SSam Leffler * is acceptable. 173214779705SSam Leffler */ 173314779705SSam Leffler static HAL_BOOL 173414779705SSam Leffler isEepromValid(struct ath_hal *ah) 173514779705SSam Leffler { 173614779705SSam Leffler uint16_t rd = getEepromRD(ah); 173714779705SSam Leffler int i; 173814779705SSam Leffler 173914779705SSam Leffler if (rd & COUNTRY_ERD_FLAG) { 174014779705SSam Leffler uint16_t cc = rd &~ COUNTRY_ERD_FLAG; 174114779705SSam Leffler for (i = 0; i < N(allCountries); i++) 174214779705SSam Leffler if (allCountries[i].countryCode == cc) 174314779705SSam Leffler return AH_TRUE; 174414779705SSam Leffler } else { 174514779705SSam Leffler for (i = 0; i < N(regDomainPairs); i++) 174614779705SSam Leffler if (regDomainPairs[i].regDmnEnum == rd) 174714779705SSam Leffler return AH_TRUE; 174814779705SSam Leffler } 174914779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 175014779705SSam Leffler "%s: invalid regulatory domain/country code 0x%x\n", __func__, rd); 175114779705SSam Leffler return AH_FALSE; 175214779705SSam Leffler } 175314779705SSam Leffler 175414779705SSam Leffler /* 175514779705SSam Leffler * Find the pointer to the country element in the country table 175614779705SSam Leffler * corresponding to the country code 175714779705SSam Leffler */ 175814779705SSam Leffler static COUNTRY_CODE_TO_ENUM_RD* 175914779705SSam Leffler findCountry(HAL_CTRY_CODE countryCode) 176014779705SSam Leffler { 176114779705SSam Leffler int i; 176214779705SSam Leffler 176314779705SSam Leffler for (i = 0; i < N(allCountries); i++) { 176414779705SSam Leffler if (allCountries[i].countryCode == countryCode) 176514779705SSam Leffler return &allCountries[i]; 176614779705SSam Leffler } 176759efa8b5SSam Leffler return AH_NULL; 176859efa8b5SSam Leffler } 176959efa8b5SSam Leffler 177059efa8b5SSam Leffler static REG_DOMAIN * 177159efa8b5SSam Leffler findRegDmn(int regDmn) 177259efa8b5SSam Leffler { 177359efa8b5SSam Leffler int i; 177459efa8b5SSam Leffler 177559efa8b5SSam Leffler for (i = 0; i < N(regDomains); i++) { 177659efa8b5SSam Leffler if (regDomains[i].regDmnEnum == regDmn) 177759efa8b5SSam Leffler return ®Domains[i]; 177859efa8b5SSam Leffler } 177959efa8b5SSam Leffler return AH_NULL; 178059efa8b5SSam Leffler } 178159efa8b5SSam Leffler 178259efa8b5SSam Leffler static REG_DMN_PAIR_MAPPING * 178359efa8b5SSam Leffler findRegDmnPair(int regDmnPair) 178459efa8b5SSam Leffler { 178559efa8b5SSam Leffler int i; 178659efa8b5SSam Leffler 178759efa8b5SSam Leffler if (regDmnPair != NO_ENUMRD) { 178859efa8b5SSam Leffler for (i = 0; i < N(regDomainPairs); i++) { 178959efa8b5SSam Leffler if (regDomainPairs[i].regDmnEnum == regDmnPair) 179059efa8b5SSam Leffler return ®DomainPairs[i]; 179159efa8b5SSam Leffler } 179259efa8b5SSam Leffler } 179359efa8b5SSam Leffler return AH_NULL; 179414779705SSam Leffler } 179514779705SSam Leffler 179614779705SSam Leffler /* 179714779705SSam Leffler * Calculate a default country based on the EEPROM setting. 179814779705SSam Leffler */ 179914779705SSam Leffler static HAL_CTRY_CODE 180014779705SSam Leffler getDefaultCountry(struct ath_hal *ah) 180114779705SSam Leffler { 180259efa8b5SSam Leffler REG_DMN_PAIR_MAPPING *regpair; 180314779705SSam Leffler uint16_t rd; 180414779705SSam Leffler 180514779705SSam Leffler rd = getEepromRD(ah); 180614779705SSam Leffler if (rd & COUNTRY_ERD_FLAG) { 180759efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 180814779705SSam Leffler uint16_t cc = rd & ~COUNTRY_ERD_FLAG; 180914779705SSam Leffler country = findCountry(cc); 181014779705SSam Leffler if (country != AH_NULL) 181114779705SSam Leffler return cc; 181214779705SSam Leffler } 181314779705SSam Leffler /* 181414779705SSam Leffler * Check reg domains that have only one country 181514779705SSam Leffler */ 181659efa8b5SSam Leffler regpair = findRegDmnPair(rd); 181759efa8b5SSam Leffler return (regpair != AH_NULL) ? regpair->singleCC : CTRY_DEFAULT; 181814779705SSam Leffler } 181914779705SSam Leffler 182014779705SSam Leffler static HAL_BOOL 182114779705SSam Leffler IS_BIT_SET(int bit, const uint64_t bitmask[]) 182214779705SSam Leffler { 182314779705SSam Leffler int byteOffset, bitnum; 182414779705SSam Leffler uint64_t val; 182514779705SSam Leffler 182614779705SSam Leffler byteOffset = bit/64; 182714779705SSam Leffler bitnum = bit - byteOffset*64; 182814779705SSam Leffler val = ((uint64_t) 1) << bitnum; 182914779705SSam Leffler return (bitmask[byteOffset] & val) != 0; 183014779705SSam Leffler } 183114779705SSam Leffler 183259efa8b5SSam Leffler static HAL_STATUS 183359efa8b5SSam Leffler getregstate(struct ath_hal *ah, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 183459efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD **pcountry, 183559efa8b5SSam Leffler REG_DOMAIN **prd2GHz, REG_DOMAIN **prd5GHz) 183614779705SSam Leffler { 183759efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 183859efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 183914779705SSam Leffler 184059efa8b5SSam Leffler if (cc == CTRY_DEFAULT && regDmn == SKU_NONE) { 184114779705SSam Leffler /* 184214779705SSam Leffler * Validate the EEPROM setting and setup defaults 184314779705SSam Leffler */ 184414779705SSam Leffler if (!isEepromValid(ah)) { 184514779705SSam Leffler /* 184614779705SSam Leffler * Don't return any channels if the EEPROM has an 184714779705SSam Leffler * invalid regulatory domain/country code setting. 184814779705SSam Leffler */ 184914779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 185014779705SSam Leffler "%s: invalid EEPROM contents\n",__func__); 185159efa8b5SSam Leffler return HAL_EEBADREG; 185214779705SSam Leffler } 185314779705SSam Leffler 185459efa8b5SSam Leffler cc = getDefaultCountry(ah); 185559efa8b5SSam Leffler country = findCountry(cc); 185614779705SSam Leffler if (country == AH_NULL) { 185714779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 185859efa8b5SSam Leffler "NULL Country!, cc %d\n", cc); 185959efa8b5SSam Leffler return HAL_EEBADCC; 186014779705SSam Leffler } 186159efa8b5SSam Leffler regDmn = country->regDmnEnum; 186259efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: EEPROM cc %u rd 0x%x\n", 186359efa8b5SSam Leffler __func__, cc, regDmn); 186459efa8b5SSam Leffler 186559efa8b5SSam Leffler if (country->countryCode == CTRY_DEFAULT) { 186659efa8b5SSam Leffler /* 186759efa8b5SSam Leffler * Check EEPROM; SKU may be for a country, single 186859efa8b5SSam Leffler * domain, or multiple domains (WWR). 186959efa8b5SSam Leffler */ 187059efa8b5SSam Leffler uint16_t rdnum = getEepromRD(ah); 187159efa8b5SSam Leffler if ((rdnum & COUNTRY_ERD_FLAG) == 0 && 187259efa8b5SSam Leffler (findRegDmn(rdnum) != AH_NULL || 187359efa8b5SSam Leffler findRegDmnPair(rdnum) != AH_NULL)) { 187459efa8b5SSam Leffler regDmn = rdnum; 187514779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 187659efa8b5SSam Leffler "%s: EEPROM rd 0x%x\n", __func__, rdnum); 187759efa8b5SSam Leffler } 187859efa8b5SSam Leffler } 187959efa8b5SSam Leffler } else { 188059efa8b5SSam Leffler country = findCountry(cc); 188159efa8b5SSam Leffler if (country == AH_NULL) { 188259efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 188359efa8b5SSam Leffler "unknown country, cc %d\n", cc); 188459efa8b5SSam Leffler return HAL_EINVAL; 188559efa8b5SSam Leffler } 188659efa8b5SSam Leffler if (regDmn == SKU_NONE) 188759efa8b5SSam Leffler regDmn = country->regDmnEnum; 188859efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u rd 0x%x\n", 188959efa8b5SSam Leffler __func__, cc, regDmn); 189014779705SSam Leffler } 189114779705SSam Leffler 189259efa8b5SSam Leffler /* 189359efa8b5SSam Leffler * Setup per-band state. 189459efa8b5SSam Leffler */ 189559efa8b5SSam Leffler if ((regDmn & MULTI_DOMAIN_MASK) == 0) { 189659efa8b5SSam Leffler REG_DMN_PAIR_MAPPING *regpair = findRegDmnPair(regDmn); 189759efa8b5SSam Leffler if (regpair == AH_NULL) { 189859efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 189959efa8b5SSam Leffler "%s: no reg domain pair %u for country %u\n", 190059efa8b5SSam Leffler __func__, regDmn, country->countryCode); 190159efa8b5SSam Leffler return HAL_EINVAL; 190259efa8b5SSam Leffler } 190359efa8b5SSam Leffler rd5GHz = findRegDmn(regpair->regDmn5GHz); 190459efa8b5SSam Leffler if (rd5GHz == AH_NULL) { 190559efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 190659efa8b5SSam Leffler "%s: no 5GHz reg domain %u for country %u\n", 190759efa8b5SSam Leffler __func__, regpair->regDmn5GHz, country->countryCode); 190859efa8b5SSam Leffler return HAL_EINVAL; 190959efa8b5SSam Leffler } 191059efa8b5SSam Leffler rd2GHz = findRegDmn(regpair->regDmn2GHz); 191159efa8b5SSam Leffler if (rd2GHz == AH_NULL) { 191259efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 191359efa8b5SSam Leffler "%s: no 2GHz reg domain %u for country %u\n", 191459efa8b5SSam Leffler __func__, regpair->regDmn2GHz, country->countryCode); 191559efa8b5SSam Leffler return HAL_EINVAL; 191659efa8b5SSam Leffler } 191759efa8b5SSam Leffler } else { 191859efa8b5SSam Leffler rd5GHz = rd2GHz = findRegDmn(regDmn); 191959efa8b5SSam Leffler if (rd2GHz == AH_NULL) { 192059efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 192159efa8b5SSam Leffler "%s: no unitary reg domain %u for country %u\n", 192259efa8b5SSam Leffler __func__, regDmn, country->countryCode); 192359efa8b5SSam Leffler return HAL_EINVAL; 192459efa8b5SSam Leffler } 192559efa8b5SSam Leffler } 192659efa8b5SSam Leffler if (pcountry != AH_NULL) 192759efa8b5SSam Leffler *pcountry = country; 192859efa8b5SSam Leffler *prd2GHz = rd2GHz; 192959efa8b5SSam Leffler *prd5GHz = rd5GHz; 193059efa8b5SSam Leffler return HAL_OK; 193159efa8b5SSam Leffler } 193214779705SSam Leffler 193359efa8b5SSam Leffler /* 193459efa8b5SSam Leffler * Construct the channel list for the specified regulatory config. 193559efa8b5SSam Leffler */ 193659efa8b5SSam Leffler static HAL_STATUS 193759efa8b5SSam Leffler getchannels(struct ath_hal *ah, 193859efa8b5SSam Leffler struct ieee80211_channel chans[], u_int maxchans, int *nchans, 193959efa8b5SSam Leffler u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 194059efa8b5SSam Leffler HAL_BOOL enableExtendedChannels, 194159efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD **pcountry, 194259efa8b5SSam Leffler REG_DOMAIN **prd2GHz, REG_DOMAIN **prd5GHz) 194359efa8b5SSam Leffler { 194459efa8b5SSam Leffler #define CHANNEL_HALF_BW 10 194559efa8b5SSam Leffler #define CHANNEL_QUARTER_BW 5 194659efa8b5SSam Leffler #define HAL_MODE_11A_ALL \ 194759efa8b5SSam Leffler (HAL_MODE_11A | HAL_MODE_11A_TURBO | HAL_MODE_TURBO | \ 194859efa8b5SSam Leffler HAL_MODE_11A_QUARTER_RATE | HAL_MODE_11A_HALF_RATE) 194959efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 195059efa8b5SSam Leffler u_int modesAvail; 195159efa8b5SSam Leffler const struct cmode *cm; 195259efa8b5SSam Leffler struct ieee80211_channel *ic; 195359efa8b5SSam Leffler int next, b; 195459efa8b5SSam Leffler HAL_STATUS status; 195559efa8b5SSam Leffler 195659efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u regDmn 0x%x mode 0x%x%s\n", 195759efa8b5SSam Leffler __func__, cc, regDmn, modeSelect, 195859efa8b5SSam Leffler enableExtendedChannels ? " ecm" : ""); 195959efa8b5SSam Leffler 196059efa8b5SSam Leffler status = getregstate(ah, cc, regDmn, pcountry, &rd2GHz, &rd5GHz); 196159efa8b5SSam Leffler if (status != HAL_OK) 196259efa8b5SSam Leffler return status; 196359efa8b5SSam Leffler 196459efa8b5SSam Leffler /* get modes that HW is capable of */ 196559efa8b5SSam Leffler modesAvail = ath_hal_getWirelessModes(ah); 196659efa8b5SSam Leffler /* optimize work below if no 11a channels */ 196759efa8b5SSam Leffler if (isChanBitMaskZero(rd5GHz->chan11a) && 196859efa8b5SSam Leffler (modesAvail & HAL_MODE_11A_ALL)) { 196959efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 197059efa8b5SSam Leffler "%s: disallow all 11a\n", __func__); 197159efa8b5SSam Leffler modesAvail &= ~HAL_MODE_11A_ALL; 197259efa8b5SSam Leffler } 197359efa8b5SSam Leffler 197414779705SSam Leffler next = 0; 197559efa8b5SSam Leffler ic = &chans[0]; 197614779705SSam Leffler for (cm = modes; cm < &modes[N(modes)]; cm++) { 197714779705SSam Leffler uint16_t c, c_hi, c_lo; 197814779705SSam Leffler uint64_t *channelBM = AH_NULL; 197914779705SSam Leffler REG_DMN_FREQ_BAND *fband = AH_NULL,*freqs; 198014779705SSam Leffler int low_adj, hi_adj, channelSep, lastc; 198159efa8b5SSam Leffler uint32_t rdflags; 198259efa8b5SSam Leffler uint64_t dfsMask; 198359efa8b5SSam Leffler uint64_t pscan; 198414779705SSam Leffler 198514779705SSam Leffler if ((cm->mode & modeSelect) == 0) { 198614779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 198714779705SSam Leffler "%s: skip mode 0x%x flags 0x%x\n", 198814779705SSam Leffler __func__, cm->mode, cm->flags); 198914779705SSam Leffler continue; 199014779705SSam Leffler } 199114779705SSam Leffler if ((cm->mode & modesAvail) == 0) { 199214779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 199314779705SSam Leffler "%s: !avail mode 0x%x (0x%x) flags 0x%x\n", 199414779705SSam Leffler __func__, modesAvail, cm->mode, cm->flags); 199514779705SSam Leffler continue; 199614779705SSam Leffler } 199714779705SSam Leffler if (!ath_hal_getChannelEdges(ah, cm->flags, &c_lo, &c_hi)) { 199814779705SSam Leffler /* channel not supported by hardware, skip it */ 199914779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 200014779705SSam Leffler "%s: channels 0x%x not supported by hardware\n", 200114779705SSam Leffler __func__,cm->flags); 200214779705SSam Leffler continue; 200314779705SSam Leffler } 200414779705SSam Leffler switch (cm->mode) { 200514779705SSam Leffler case HAL_MODE_TURBO: 200659efa8b5SSam Leffler case HAL_MODE_11A_TURBO: 200759efa8b5SSam Leffler rdflags = rd5GHz->flags; 200859efa8b5SSam Leffler dfsMask = rd5GHz->dfsMask; 200959efa8b5SSam Leffler pscan = rd5GHz->pscan; 201059efa8b5SSam Leffler if (cm->mode == HAL_MODE_TURBO) 201159efa8b5SSam Leffler channelBM = rd5GHz->chan11a_turbo; 201259efa8b5SSam Leffler else 201359efa8b5SSam Leffler channelBM = rd5GHz->chan11a_dyn_turbo; 201414779705SSam Leffler freqs = ®Dmn5GhzTurboFreq[0]; 201559efa8b5SSam Leffler break; 201659efa8b5SSam Leffler case HAL_MODE_11G_TURBO: 201759efa8b5SSam Leffler rdflags = rd2GHz->flags; 201859efa8b5SSam Leffler dfsMask = rd2GHz->dfsMask; 201959efa8b5SSam Leffler pscan = rd2GHz->pscan; 202059efa8b5SSam Leffler channelBM = rd2GHz->chan11g_turbo; 202159efa8b5SSam Leffler freqs = ®Dmn2Ghz11gTurboFreq[0]; 202214779705SSam Leffler break; 202314779705SSam Leffler case HAL_MODE_11A: 202414779705SSam Leffler case HAL_MODE_11A_HALF_RATE: 202514779705SSam Leffler case HAL_MODE_11A_QUARTER_RATE: 202614779705SSam Leffler case HAL_MODE_11NA_HT20: 202714779705SSam Leffler case HAL_MODE_11NA_HT40PLUS: 202814779705SSam Leffler case HAL_MODE_11NA_HT40MINUS: 202959efa8b5SSam Leffler rdflags = rd5GHz->flags; 203059efa8b5SSam Leffler dfsMask = rd5GHz->dfsMask; 203159efa8b5SSam Leffler pscan = rd5GHz->pscan; 203214779705SSam Leffler if (cm->mode == HAL_MODE_11A_HALF_RATE) 203359efa8b5SSam Leffler channelBM = rd5GHz->chan11a_half; 203414779705SSam Leffler else if (cm->mode == HAL_MODE_11A_QUARTER_RATE) 203559efa8b5SSam Leffler channelBM = rd5GHz->chan11a_quarter; 203614779705SSam Leffler else 203759efa8b5SSam Leffler channelBM = rd5GHz->chan11a; 203814779705SSam Leffler freqs = ®Dmn5GhzFreq[0]; 203914779705SSam Leffler break; 204014779705SSam Leffler case HAL_MODE_11B: 204114779705SSam Leffler case HAL_MODE_11G: 204214779705SSam Leffler case HAL_MODE_11G_HALF_RATE: 204314779705SSam Leffler case HAL_MODE_11G_QUARTER_RATE: 204414779705SSam Leffler case HAL_MODE_11NG_HT20: 204514779705SSam Leffler case HAL_MODE_11NG_HT40PLUS: 204614779705SSam Leffler case HAL_MODE_11NG_HT40MINUS: 204759efa8b5SSam Leffler rdflags = rd2GHz->flags; 204859efa8b5SSam Leffler dfsMask = rd2GHz->dfsMask; 204959efa8b5SSam Leffler pscan = rd2GHz->pscan; 205014779705SSam Leffler if (cm->mode == HAL_MODE_11G_HALF_RATE) 205159efa8b5SSam Leffler channelBM = rd2GHz->chan11g_half; 205214779705SSam Leffler else if (cm->mode == HAL_MODE_11G_QUARTER_RATE) 205359efa8b5SSam Leffler channelBM = rd2GHz->chan11g_quarter; 205459efa8b5SSam Leffler else if (cm->mode == HAL_MODE_11B) 205559efa8b5SSam Leffler channelBM = rd2GHz->chan11b; 205614779705SSam Leffler else 205759efa8b5SSam Leffler channelBM = rd2GHz->chan11g; 205859efa8b5SSam Leffler if (cm->mode == HAL_MODE_11B) 205959efa8b5SSam Leffler freqs = ®Dmn2GhzFreq[0]; 206059efa8b5SSam Leffler else 206114779705SSam Leffler freqs = ®Dmn2Ghz11gFreq[0]; 206214779705SSam Leffler break; 206314779705SSam Leffler default: 206414779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 206514779705SSam Leffler "%s: Unkonwn HAL mode 0x%x\n", __func__, cm->mode); 206614779705SSam Leffler continue; 206714779705SSam Leffler } 206814779705SSam Leffler if (isChanBitMaskZero(channelBM)) 206914779705SSam Leffler continue; 207014779705SSam Leffler /* 207114779705SSam Leffler * Setup special handling for HT40 channels; e.g. 207214779705SSam Leffler * 5G HT40 channels require 40Mhz channel separation. 207314779705SSam Leffler */ 207414779705SSam Leffler hi_adj = (cm->mode == HAL_MODE_11NA_HT40PLUS || 207514779705SSam Leffler cm->mode == HAL_MODE_11NG_HT40PLUS) ? -20 : 0; 207614779705SSam Leffler low_adj = (cm->mode == HAL_MODE_11NA_HT40MINUS || 207714779705SSam Leffler cm->mode == HAL_MODE_11NG_HT40MINUS) ? 20 : 0; 207814779705SSam Leffler channelSep = (cm->mode == HAL_MODE_11NA_HT40PLUS || 207914779705SSam Leffler cm->mode == HAL_MODE_11NA_HT40MINUS) ? 40 : 0; 208014779705SSam Leffler 208114779705SSam Leffler for (b = 0; b < 64*BMLEN; b++) { 208214779705SSam Leffler if (!IS_BIT_SET(b, channelBM)) 208314779705SSam Leffler continue; 208414779705SSam Leffler fband = &freqs[b]; 208514779705SSam Leffler lastc = 0; 208614779705SSam Leffler 208714779705SSam Leffler for (c = fband->lowChannel + low_adj; 208814779705SSam Leffler c <= fband->highChannel + hi_adj; 208914779705SSam Leffler c += fband->channelSep) { 209014779705SSam Leffler if (!(c_lo <= c && c <= c_hi)) { 209114779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 209214779705SSam Leffler "%s: c %u out of range [%u..%u]\n", 209314779705SSam Leffler __func__, c, c_lo, c_hi); 209414779705SSam Leffler continue; 209514779705SSam Leffler } 209614779705SSam Leffler if (next >= maxchans){ 209714779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 209814779705SSam Leffler "%s: too many channels for channel table\n", 209914779705SSam Leffler __func__); 210014779705SSam Leffler goto done; 210114779705SSam Leffler } 210214779705SSam Leffler if ((fband->usePassScan & IS_ECM_CHAN) && 210314779705SSam Leffler !enableExtendedChannels) { 210414779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 210559efa8b5SSam Leffler "skip ecm channel\n"); 210614779705SSam Leffler continue; 210714779705SSam Leffler } 210859efa8b5SSam Leffler if ((fband->useDfs & dfsMask) && 210959efa8b5SSam Leffler (cm->flags & IEEE80211_CHAN_HT40)) { 211059efa8b5SSam Leffler /* NB: DFS and HT40 don't mix */ 211114779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 211259efa8b5SSam Leffler "skip HT40 chan, DFS required\n"); 211314779705SSam Leffler continue; 211414779705SSam Leffler } 211514779705SSam Leffler /* 211614779705SSam Leffler * Make sure that channel separation 211714779705SSam Leffler * meets the requirement. 211814779705SSam Leffler */ 211914779705SSam Leffler if (lastc && channelSep && 212014779705SSam Leffler (c-lastc) < channelSep) 212114779705SSam Leffler continue; 212214779705SSam Leffler lastc = c; 212314779705SSam Leffler 212459efa8b5SSam Leffler OS_MEMZERO(ic, sizeof(*ic)); 212559efa8b5SSam Leffler ic->ic_freq = c; 212659efa8b5SSam Leffler ic->ic_flags = cm->flags; 212759efa8b5SSam Leffler ic->ic_maxregpower = fband->powerDfs; 212859efa8b5SSam Leffler ath_hal_getpowerlimits(ah, ic); 212959efa8b5SSam Leffler ic->ic_maxantgain = fband->antennaMax; 213059efa8b5SSam Leffler if (fband->usePassScan & pscan) 213159efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_PASSIVE; 213259efa8b5SSam Leffler if (fband->useDfs & dfsMask) 213359efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_DFS; 213459efa8b5SSam Leffler if (IEEE80211_IS_CHAN_5GHZ(ic) && 213559efa8b5SSam Leffler (rdflags & DISALLOW_ADHOC_11A)) 213659efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_NOADHOC; 213759efa8b5SSam Leffler if (IEEE80211_IS_CHAN_TURBO(ic) && 213859efa8b5SSam Leffler (rdflags & DISALLOW_ADHOC_11A_TURB)) 213959efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_NOADHOC; 214059efa8b5SSam Leffler if (rdflags & NO_HOSTAP) 214159efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_NOHOSTAP; 214259efa8b5SSam Leffler if (rdflags & LIMIT_FRAME_4MS) 214359efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_4MSXMIT; 214459efa8b5SSam Leffler if (rdflags & NEED_NFC) 214559efa8b5SSam Leffler ic->ic_flags |= CHANNEL_NFCREQUIRED; 214659efa8b5SSam Leffler 214759efa8b5SSam Leffler ic++, next++; 214814779705SSam Leffler } 214914779705SSam Leffler } 215014779705SSam Leffler } 215114779705SSam Leffler done: 215214779705SSam Leffler *nchans = next; 215359efa8b5SSam Leffler /* NB: pcountry set above by getregstate */ 215459efa8b5SSam Leffler if (prd2GHz != AH_NULL) 215559efa8b5SSam Leffler *prd2GHz = rd2GHz; 215659efa8b5SSam Leffler if (prd5GHz != AH_NULL) 215759efa8b5SSam Leffler *prd5GHz = rd5GHz; 215859efa8b5SSam Leffler return HAL_OK; 215959efa8b5SSam Leffler #undef HAL_MODE_11A_ALL 216014779705SSam Leffler #undef CHANNEL_HALF_BW 216114779705SSam Leffler #undef CHANNEL_QUARTER_BW 216214779705SSam Leffler } 216314779705SSam Leffler 216414779705SSam Leffler /* 216559efa8b5SSam Leffler * Retrieve a channel list without affecting runtime state. 216614779705SSam Leffler */ 216759efa8b5SSam Leffler HAL_STATUS 216859efa8b5SSam Leffler ath_hal_getchannels(struct ath_hal *ah, 216959efa8b5SSam Leffler struct ieee80211_channel chans[], u_int maxchans, int *nchans, 217059efa8b5SSam Leffler u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 217159efa8b5SSam Leffler HAL_BOOL enableExtendedChannels) 217214779705SSam Leffler { 217359efa8b5SSam Leffler return getchannels(ah, chans, maxchans, nchans, modeSelect, 217459efa8b5SSam Leffler cc, regDmn, enableExtendedChannels, AH_NULL, AH_NULL, AH_NULL); 217559efa8b5SSam Leffler } 217614779705SSam Leffler 217714779705SSam Leffler /* 217859efa8b5SSam Leffler * Handle frequency mapping from 900Mhz range to 2.4GHz range 217959efa8b5SSam Leffler * for GSM radios. This is done when we need the h/w frequency 218059efa8b5SSam Leffler * and the channel is marked IEEE80211_CHAN_GSM. 218114779705SSam Leffler */ 218259efa8b5SSam Leffler static int 218359efa8b5SSam Leffler ath_hal_mapgsm(int sku, int freq) 218459efa8b5SSam Leffler { 218559efa8b5SSam Leffler if (sku == SKU_XR9) 218659efa8b5SSam Leffler return 1520 + freq; 218759efa8b5SSam Leffler if (sku == SKU_GZ901) 218859efa8b5SSam Leffler return 1544 + freq; 218959efa8b5SSam Leffler if (sku == SKU_SR9) 219059efa8b5SSam Leffler return 3344 - freq; 219159efa8b5SSam Leffler HALDEBUG(AH_NULL, HAL_DEBUG_ANY, 219259efa8b5SSam Leffler "%s: cannot map freq %u unknown gsm sku %u\n", 219359efa8b5SSam Leffler __func__, freq, sku); 219459efa8b5SSam Leffler return freq; 219514779705SSam Leffler } 219614779705SSam Leffler 219759efa8b5SSam Leffler /* 219859efa8b5SSam Leffler * Setup the internal/private channel state given a table of 219959efa8b5SSam Leffler * net80211 channels. We collapse entries for the same frequency 220059efa8b5SSam Leffler * and record the frequency for doing noise floor processing 220159efa8b5SSam Leffler * where we don't have net80211 channel context. 220259efa8b5SSam Leffler */ 220359efa8b5SSam Leffler static HAL_BOOL 220459efa8b5SSam Leffler assignPrivateChannels(struct ath_hal *ah, 220559efa8b5SSam Leffler struct ieee80211_channel chans[], int nchans, int sku) 220659efa8b5SSam Leffler { 220759efa8b5SSam Leffler HAL_CHANNEL_INTERNAL *ic; 220859efa8b5SSam Leffler int i, j, next, freq; 220959efa8b5SSam Leffler 221059efa8b5SSam Leffler next = 0; 221159efa8b5SSam Leffler for (i = 0; i < nchans; i++) { 221259efa8b5SSam Leffler struct ieee80211_channel *c = &chans[i]; 221359efa8b5SSam Leffler for (j = i-1; j >= 0; j--) 221459efa8b5SSam Leffler if (chans[j].ic_freq == c->ic_freq) { 221559efa8b5SSam Leffler c->ic_devdata = chans[j].ic_devdata; 221659efa8b5SSam Leffler break; 221759efa8b5SSam Leffler } 221859efa8b5SSam Leffler if (j < 0) { 221959efa8b5SSam Leffler /* new entry, assign a private channel entry */ 222059efa8b5SSam Leffler if (next >= N(AH_PRIVATE(ah)->ah_channels)) { 222159efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, 222259efa8b5SSam Leffler "%s: too many channels, max %u\n", 222359efa8b5SSam Leffler __func__, N(AH_PRIVATE(ah)->ah_channels)); 222459efa8b5SSam Leffler return AH_FALSE; 222559efa8b5SSam Leffler } 222659efa8b5SSam Leffler /* 222759efa8b5SSam Leffler * Handle frequency mapping for 900MHz devices. 222859efa8b5SSam Leffler * The hardware uses 2.4GHz frequencies that are 222959efa8b5SSam Leffler * down-converted. The 802.11 layer uses the 223059efa8b5SSam Leffler * true frequencies. 223159efa8b5SSam Leffler */ 223259efa8b5SSam Leffler freq = IEEE80211_IS_CHAN_GSM(c) ? 223359efa8b5SSam Leffler ath_hal_mapgsm(sku, c->ic_freq) : c->ic_freq; 223459efa8b5SSam Leffler 223559efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 223659efa8b5SSam Leffler "%s: private[%3u] %u/0x%x -> channel %u\n", 223759efa8b5SSam Leffler __func__, next, c->ic_freq, c->ic_flags, freq); 223859efa8b5SSam Leffler 223959efa8b5SSam Leffler ic = &AH_PRIVATE(ah)->ah_channels[next]; 224059efa8b5SSam Leffler /* 224159efa8b5SSam Leffler * NB: This clears privFlags which means ancillary 224259efa8b5SSam Leffler * code like ANI and IQ calibration will be 224359efa8b5SSam Leffler * restarted and re-setup any per-channel state. 224459efa8b5SSam Leffler */ 224559efa8b5SSam Leffler OS_MEMZERO(ic, sizeof(*ic)); 224659efa8b5SSam Leffler ic->channel = freq; 224759efa8b5SSam Leffler c->ic_devdata = next; 224859efa8b5SSam Leffler next++; 224959efa8b5SSam Leffler } 225059efa8b5SSam Leffler } 225159efa8b5SSam Leffler AH_PRIVATE(ah)->ah_nchan = next; 225259efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, "%s: %u public, %u private channels\n", 225359efa8b5SSam Leffler __func__, nchans, next); 225459efa8b5SSam Leffler return AH_TRUE; 225559efa8b5SSam Leffler } 225659efa8b5SSam Leffler 225759efa8b5SSam Leffler /* 225859efa8b5SSam Leffler * Setup the channel list based on the information in the EEPROM. 225959efa8b5SSam Leffler */ 226059efa8b5SSam Leffler HAL_STATUS 226159efa8b5SSam Leffler ath_hal_init_channels(struct ath_hal *ah, 226259efa8b5SSam Leffler struct ieee80211_channel chans[], u_int maxchans, int *nchans, 226359efa8b5SSam Leffler u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 226459efa8b5SSam Leffler HAL_BOOL enableExtendedChannels) 226559efa8b5SSam Leffler { 226659efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 226759efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 226859efa8b5SSam Leffler HAL_STATUS status; 226959efa8b5SSam Leffler 227059efa8b5SSam Leffler status = getchannels(ah, chans, maxchans, nchans, modeSelect, 227159efa8b5SSam Leffler cc, regDmn, enableExtendedChannels, &country, &rd2GHz, &rd5GHz); 227259efa8b5SSam Leffler if (status == HAL_OK && 227359efa8b5SSam Leffler assignPrivateChannels(ah, chans, *nchans, AH_PRIVATE(ah)->ah_currentRD)) { 227459efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz; 227559efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz; 227659efa8b5SSam Leffler 227759efa8b5SSam Leffler ah->ah_countryCode = country->countryCode; 227859efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n", 227959efa8b5SSam Leffler __func__, ah->ah_countryCode); 228059efa8b5SSam Leffler } else 228159efa8b5SSam Leffler status = HAL_EINVAL; 228259efa8b5SSam Leffler return status; 228359efa8b5SSam Leffler } 228459efa8b5SSam Leffler 228559efa8b5SSam Leffler /* 228659efa8b5SSam Leffler * Set the channel list. 228759efa8b5SSam Leffler */ 228859efa8b5SSam Leffler HAL_STATUS 228959efa8b5SSam Leffler ath_hal_set_channels(struct ath_hal *ah, 229059efa8b5SSam Leffler struct ieee80211_channel chans[], int nchans, 229159efa8b5SSam Leffler HAL_CTRY_CODE cc, HAL_REG_DOMAIN rd) 229259efa8b5SSam Leffler { 229359efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 229459efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 229559efa8b5SSam Leffler HAL_STATUS status; 229659efa8b5SSam Leffler 229759efa8b5SSam Leffler switch (rd) { 229859efa8b5SSam Leffler case SKU_SR9: 229959efa8b5SSam Leffler case SKU_XR9: 230059efa8b5SSam Leffler case SKU_GZ901: 230159efa8b5SSam Leffler /* 230259efa8b5SSam Leffler * Map 900MHz sku's. The frequencies will be mapped 230359efa8b5SSam Leffler * according to the sku to compensate for the down-converter. 230459efa8b5SSam Leffler * We use the FCC for these sku's as the mapped channel 230559efa8b5SSam Leffler * list is known compatible (will need to change if/when 230659efa8b5SSam Leffler * vendors do different mapping in different locales). 230759efa8b5SSam Leffler */ 230859efa8b5SSam Leffler status = getregstate(ah, CTRY_DEFAULT, SKU_FCC, 230959efa8b5SSam Leffler &country, &rd2GHz, &rd5GHz); 231059efa8b5SSam Leffler break; 231159efa8b5SSam Leffler default: 231259efa8b5SSam Leffler status = getregstate(ah, cc, rd, 231359efa8b5SSam Leffler &country, &rd2GHz, &rd5GHz); 231459efa8b5SSam Leffler rd = AH_PRIVATE(ah)->ah_currentRD; 231559efa8b5SSam Leffler break; 231659efa8b5SSam Leffler } 231759efa8b5SSam Leffler if (status == HAL_OK && assignPrivateChannels(ah, chans, nchans, rd)) { 231859efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz; 231959efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz; 232059efa8b5SSam Leffler 232159efa8b5SSam Leffler ah->ah_countryCode = country->countryCode; 232259efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n", 232359efa8b5SSam Leffler __func__, ah->ah_countryCode); 232459efa8b5SSam Leffler } else 232559efa8b5SSam Leffler status = HAL_EINVAL; 232659efa8b5SSam Leffler return status; 232759efa8b5SSam Leffler } 232859efa8b5SSam Leffler 232959efa8b5SSam Leffler #ifdef AH_DEBUG 233059efa8b5SSam Leffler /* 233159efa8b5SSam Leffler * Return the internal channel corresponding to a public channel. 233259efa8b5SSam Leffler * NB: normally this routine is inline'd (see ah_internal.h) 233359efa8b5SSam Leffler */ 233459efa8b5SSam Leffler HAL_CHANNEL_INTERNAL * 233559efa8b5SSam Leffler ath_hal_checkchannel(struct ath_hal *ah, const struct ieee80211_channel *c) 233659efa8b5SSam Leffler { 233759efa8b5SSam Leffler HAL_CHANNEL_INTERNAL *cc = &AH_PRIVATE(ah)->ah_channels[c->ic_devdata]; 233859efa8b5SSam Leffler 233959efa8b5SSam Leffler if (c->ic_devdata < AH_PRIVATE(ah)->ah_nchan && 234059efa8b5SSam Leffler (c->ic_freq == cc->channel || IEEE80211_IS_CHAN_GSM(c))) 234114779705SSam Leffler return cc; 234259efa8b5SSam Leffler if (c->ic_devdata >= AH_PRIVATE(ah)->ah_nchan) { 234359efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, 234459efa8b5SSam Leffler "%s: bad mapping, devdata %u nchans %u\n", 234559efa8b5SSam Leffler __func__, c->ic_devdata, AH_PRIVATE(ah)->ah_nchan); 234659efa8b5SSam Leffler HALASSERT(c->ic_devdata < AH_PRIVATE(ah)->ah_nchan); 234759efa8b5SSam Leffler } else { 234859efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, 234959efa8b5SSam Leffler "%s: no match for %u/0x%x devdata %u channel %u\n", 235059efa8b5SSam Leffler __func__, c->ic_freq, c->ic_flags, c->ic_devdata, 235159efa8b5SSam Leffler cc->channel); 235259efa8b5SSam Leffler HALASSERT(c->ic_freq == cc->channel || IEEE80211_IS_CHAN_GSM(c)); 235314779705SSam Leffler } 235414779705SSam Leffler return AH_NULL; 235559efa8b5SSam Leffler } 235659efa8b5SSam Leffler #endif /* AH_DEBUG */ 235759efa8b5SSam Leffler 235859efa8b5SSam Leffler #define isWwrSKU(_ah) \ 235959efa8b5SSam Leffler ((getEepromRD((_ah)) & WORLD_SKU_MASK) == WORLD_SKU_PREFIX || \ 236059efa8b5SSam Leffler getEepromRD(_ah) == WORLD) 236159efa8b5SSam Leffler 236259efa8b5SSam Leffler /* 236359efa8b5SSam Leffler * Return the test group for the specific channel based on 236459efa8b5SSam Leffler * the current regulatory setup. 236559efa8b5SSam Leffler */ 236659efa8b5SSam Leffler u_int 236759efa8b5SSam Leffler ath_hal_getctl(struct ath_hal *ah, const struct ieee80211_channel *c) 236859efa8b5SSam Leffler { 236959efa8b5SSam Leffler u_int ctl; 237059efa8b5SSam Leffler 237159efa8b5SSam Leffler if (AH_PRIVATE(ah)->ah_rd2GHz == AH_PRIVATE(ah)->ah_rd5GHz || 237259efa8b5SSam Leffler (ah->ah_countryCode == CTRY_DEFAULT && isWwrSKU(ah))) 237359efa8b5SSam Leffler ctl = SD_NO_CTL; 237459efa8b5SSam Leffler else if (IEEE80211_IS_CHAN_2GHZ(c)) 237559efa8b5SSam Leffler ctl = AH_PRIVATE(ah)->ah_rd2GHz->conformanceTestLimit; 237659efa8b5SSam Leffler else 237759efa8b5SSam Leffler ctl = AH_PRIVATE(ah)->ah_rd5GHz->conformanceTestLimit; 237859efa8b5SSam Leffler if (IEEE80211_IS_CHAN_B(c)) 237959efa8b5SSam Leffler return ctl | CTL_11B; 238059efa8b5SSam Leffler if (IEEE80211_IS_CHAN_G(c)) 238159efa8b5SSam Leffler return ctl | CTL_11G; 238259efa8b5SSam Leffler if (IEEE80211_IS_CHAN_108G(c)) 238359efa8b5SSam Leffler return ctl | CTL_108G; 238459efa8b5SSam Leffler if (IEEE80211_IS_CHAN_TURBO(c)) 238559efa8b5SSam Leffler return ctl | CTL_TURBO; 238659efa8b5SSam Leffler if (IEEE80211_IS_CHAN_A(c)) 238759efa8b5SSam Leffler return ctl | CTL_11A; 238859efa8b5SSam Leffler return ctl; 238914779705SSam Leffler } 239014779705SSam Leffler 239114779705SSam Leffler /* 239214779705SSam Leffler * Return the max allowed antenna gain and apply any regulatory 239314779705SSam Leffler * domain specific changes. 239414779705SSam Leffler * 239514779705SSam Leffler * NOTE: a negative reduction is possible in RD's that only 239614779705SSam Leffler * measure radiated power (e.g., ETSI) which would increase 239714779705SSam Leffler * that actual conducted output power (though never beyond 239814779705SSam Leffler * the calibrated target power). 239914779705SSam Leffler */ 240014779705SSam Leffler u_int 240159efa8b5SSam Leffler ath_hal_getantennareduction(struct ath_hal *ah, 240259efa8b5SSam Leffler const struct ieee80211_channel *chan, u_int twiceGain) 240314779705SSam Leffler { 240459efa8b5SSam Leffler int8_t antennaMax = twiceGain - chan->ic_maxantgain*2; 240514779705SSam Leffler return (antennaMax < 0) ? 0 : antennaMax; 240614779705SSam Leffler } 2407