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 31*2836e2aeSAdrian Chadd #include "ah_regdomain.h" 32*2836e2aeSAdrian Chadd 3314779705SSam Leffler /* 3414779705SSam Leffler * XXX this code needs a audit+review 3514779705SSam Leffler */ 3614779705SSam Leffler 3714779705SSam Leffler /* used throughout this file... */ 3814779705SSam Leffler #define N(a) (sizeof (a) / sizeof (a[0])) 3914779705SSam Leffler 4014779705SSam Leffler #define HAL_MODE_11A_TURBO HAL_MODE_108A 4114779705SSam Leffler #define HAL_MODE_11G_TURBO HAL_MODE_108G 4214779705SSam Leffler 4314779705SSam Leffler /* 4414779705SSam Leffler * BMLEN defines the size of the bitmask used to hold frequency 4514779705SSam Leffler * band specifications. Note this must agree with the BM macro 4614779705SSam Leffler * definition that's used to setup initializers. See also further 4714779705SSam Leffler * comments below. 4814779705SSam Leffler */ 49*2836e2aeSAdrian Chadd /* BMLEN is now defined in ah_regdomain.h */ 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) } 7758ae7016SSam Leffler #define BM9(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh, _fi) \ 7858ae7016SSam Leffler { W0(_fa) | W0(_fb) | W0(_fc) | W0(_fd) | W0(_fe) | W0(_ff) | \ 7958ae7016SSam Leffler W0(_fg) | W0(_fh) | W0(_fi) , \ 8058ae7016SSam Leffler W1(_fa) | W1(_fb) | W1(_fc) | W1(_fd) | W1(_fe) | W1(_ff) | \ 8158ae7016SSam Leffler W1(_fg) | W1(_fh) | W1(_fi) } 8214779705SSam Leffler 8314779705SSam Leffler /* 8414779705SSam Leffler * Mask to check whether a domain is a multidomain or a single domain 8514779705SSam Leffler */ 8614779705SSam Leffler #define MULTI_DOMAIN_MASK 0xFF00 8714779705SSam Leffler 8814779705SSam Leffler /* 8914779705SSam Leffler * Enumerated Regulatory Domain Information 8 bit values indicate that 9014779705SSam Leffler * the regdomain is really a pair of unitary regdomains. 12 bit values 9114779705SSam Leffler * are the real unitary regdomains and are the only ones which have the 9214779705SSam Leffler * frequency bitmasks and flags set. 9314779705SSam Leffler */ 9414779705SSam Leffler enum { 9514779705SSam Leffler /* 9614779705SSam Leffler * The following regulatory domain definitions are 9714779705SSam Leffler * found in the EEPROM. Each regulatory domain 9814779705SSam Leffler * can operate in either a 5GHz or 2.4GHz wireless mode or 9914779705SSam Leffler * both 5GHz and 2.4GHz wireless modes. 10014779705SSam Leffler * In general, the value holds no special 10114779705SSam Leffler * meaning and is used to decode into either specific 10214779705SSam Leffler * 2.4GHz or 5GHz wireless mode for that particular 10314779705SSam Leffler * regulatory domain. 10414779705SSam Leffler */ 10514779705SSam Leffler NO_ENUMRD = 0x00, 10614779705SSam Leffler NULL1_WORLD = 0x03, /* For 11b-only countries (no 11a allowed) */ 10714779705SSam Leffler NULL1_ETSIB = 0x07, /* Israel */ 10814779705SSam Leffler NULL1_ETSIC = 0x08, 10914779705SSam Leffler FCC1_FCCA = 0x10, /* USA */ 11014779705SSam Leffler FCC1_WORLD = 0x11, /* Hong Kong */ 11114779705SSam Leffler FCC4_FCCA = 0x12, /* USA - Public Safety */ 11214779705SSam Leffler FCC5_FCCB = 0x13, /* USA w/ 1/2 and 1/4 width channels */ 11314779705SSam Leffler 11414779705SSam Leffler FCC2_FCCA = 0x20, /* Canada */ 11514779705SSam Leffler FCC2_WORLD = 0x21, /* Australia & HK */ 11614779705SSam Leffler FCC2_ETSIC = 0x22, 11714779705SSam Leffler FRANCE_RES = 0x31, /* Legacy France for OEM */ 11814779705SSam Leffler FCC3_FCCA = 0x3A, /* USA & Canada w/5470 band, 11h, DFS enabled */ 11914779705SSam Leffler FCC3_WORLD = 0x3B, /* USA & Canada w/5470 band, 11h, DFS enabled */ 12014779705SSam Leffler 12114779705SSam Leffler ETSI1_WORLD = 0x37, 12214779705SSam Leffler ETSI3_ETSIA = 0x32, /* France (optional) */ 12314779705SSam Leffler ETSI2_WORLD = 0x35, /* Hungary & others */ 12414779705SSam Leffler ETSI3_WORLD = 0x36, /* France & others */ 12514779705SSam Leffler ETSI4_WORLD = 0x30, 12614779705SSam Leffler ETSI4_ETSIC = 0x38, 12714779705SSam Leffler ETSI5_WORLD = 0x39, 12814779705SSam Leffler ETSI6_WORLD = 0x34, /* Bulgaria */ 12914779705SSam Leffler ETSI_RESERVED = 0x33, /* Reserved (Do not used) */ 13014779705SSam Leffler 13114779705SSam Leffler MKK1_MKKA = 0x40, /* Japan (JP1) */ 13214779705SSam Leffler MKK1_MKKB = 0x41, /* Japan (JP0) */ 13314779705SSam Leffler APL4_WORLD = 0x42, /* Singapore */ 13414779705SSam Leffler MKK2_MKKA = 0x43, /* Japan with 4.9G channels */ 13514779705SSam Leffler APL_RESERVED = 0x44, /* Reserved (Do not used) */ 13614779705SSam Leffler APL2_WORLD = 0x45, /* Korea */ 13714779705SSam Leffler APL2_APLC = 0x46, 13814779705SSam Leffler APL3_WORLD = 0x47, 13914779705SSam Leffler MKK1_FCCA = 0x48, /* Japan (JP1-1) */ 14014779705SSam Leffler APL2_APLD = 0x49, /* Korea with 2.3G channels */ 14114779705SSam Leffler MKK1_MKKA1 = 0x4A, /* Japan (JE1) */ 14214779705SSam Leffler MKK1_MKKA2 = 0x4B, /* Japan (JE2) */ 14314779705SSam Leffler MKK1_MKKC = 0x4C, /* Japan (MKK1_MKKA,except Ch14) */ 14414779705SSam Leffler 14514779705SSam Leffler APL3_FCCA = 0x50, 14614779705SSam Leffler APL1_WORLD = 0x52, /* Latin America */ 14714779705SSam Leffler APL1_FCCA = 0x53, 14814779705SSam Leffler APL1_APLA = 0x54, 14914779705SSam Leffler APL1_ETSIC = 0x55, 15014779705SSam Leffler APL2_ETSIC = 0x56, /* Venezuela */ 15114779705SSam Leffler APL5_WORLD = 0x58, /* Chile */ 15214779705SSam Leffler APL6_WORLD = 0x5B, /* Singapore */ 15314779705SSam Leffler APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */ 15414779705SSam Leffler APL8_WORLD = 0x5D, /* Malaysia 5GHz */ 15514779705SSam Leffler APL9_WORLD = 0x5E, /* Korea 5GHz */ 15614779705SSam Leffler 15714779705SSam Leffler /* 15814779705SSam Leffler * World mode SKUs 15914779705SSam Leffler */ 16014779705SSam Leffler WOR0_WORLD = 0x60, /* World0 (WO0 SKU) */ 16114779705SSam Leffler WOR1_WORLD = 0x61, /* World1 (WO1 SKU) */ 16214779705SSam Leffler WOR2_WORLD = 0x62, /* World2 (WO2 SKU) */ 16314779705SSam Leffler WOR3_WORLD = 0x63, /* World3 (WO3 SKU) */ 16414779705SSam Leffler WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */ 16514779705SSam Leffler WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */ 16614779705SSam Leffler 16714779705SSam Leffler WOR01_WORLD = 0x66, /* World0-1 (WW0-1 SKU) */ 16814779705SSam Leffler WOR02_WORLD = 0x67, /* World0-2 (WW0-2 SKU) */ 16914779705SSam Leffler EU1_WORLD = 0x68, /* Same as World0-2 (WW0-2 SKU), except active scan ch1-13. No ch14 */ 17014779705SSam Leffler 17114779705SSam Leffler WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */ 17214779705SSam Leffler WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */ 1739c9dad53SRui Paulo WORB_WORLD = 0x6B, /* WorldB (WOB SKU) */ 17414779705SSam Leffler 17514779705SSam Leffler MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */ 17614779705SSam Leffler MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */ 17714779705SSam Leffler MKK3_MKKC = 0x82, /* Japan UNI-1 even + MKKC */ 17814779705SSam Leffler 17914779705SSam Leffler MKK4_MKKB = 0x83, /* Japan UNI-1 even + UNI-2 + MKKB */ 18014779705SSam Leffler MKK4_MKKA2 = 0x84, /* Japan UNI-1 even + UNI-2 + MKKA2 */ 18114779705SSam Leffler MKK4_MKKC = 0x85, /* Japan UNI-1 even + UNI-2 + MKKC */ 18214779705SSam Leffler 18314779705SSam Leffler MKK5_MKKB = 0x86, /* Japan UNI-1 even + UNI-2 + mid-band + MKKB */ 18414779705SSam Leffler MKK5_MKKA2 = 0x87, /* Japan UNI-1 even + UNI-2 + mid-band + MKKA2 */ 18514779705SSam Leffler MKK5_MKKC = 0x88, /* Japan UNI-1 even + UNI-2 + mid-band + MKKC */ 18614779705SSam Leffler 18714779705SSam Leffler MKK6_MKKB = 0x89, /* Japan UNI-1 even + UNI-1 odd MKKB */ 18814779705SSam Leffler MKK6_MKKA2 = 0x8A, /* Japan UNI-1 even + UNI-1 odd + MKKA2 */ 18914779705SSam Leffler MKK6_MKKC = 0x8B, /* Japan UNI-1 even + UNI-1 odd + MKKC */ 19014779705SSam Leffler 19114779705SSam Leffler MKK7_MKKB = 0x8C, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKB */ 19214779705SSam Leffler MKK7_MKKA2 = 0x8D, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA2 */ 19314779705SSam Leffler MKK7_MKKC = 0x8E, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKC */ 19414779705SSam Leffler 19514779705SSam Leffler MKK8_MKKB = 0x8F, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKB */ 19614779705SSam Leffler MKK8_MKKA2 = 0x90, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKA2 */ 19714779705SSam Leffler MKK8_MKKC = 0x91, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKC */ 19814779705SSam Leffler 19914779705SSam Leffler /* Following definitions are used only by s/w to map old 20014779705SSam Leffler * Japan SKUs. 20114779705SSam Leffler */ 20214779705SSam Leffler MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */ 20314779705SSam Leffler MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */ 20414779705SSam Leffler MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */ 20514779705SSam Leffler MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */ 20614779705SSam Leffler MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */ 20714779705SSam Leffler MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */ 20814779705SSam Leffler MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz */ 20914779705SSam Leffler MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz */ 21014779705SSam Leffler 21114779705SSam Leffler /* 21214779705SSam Leffler * Regulator domains ending in a number (e.g. APL1, 21314779705SSam Leffler * MK1, ETSI4, etc) apply to 5GHz channel and power 21414779705SSam Leffler * information. Regulator domains ending in a letter 21514779705SSam Leffler * (e.g. APLA, FCCA, etc) apply to 2.4GHz channel and 21614779705SSam Leffler * power information. 21714779705SSam Leffler */ 21814779705SSam Leffler APL1 = 0x0150, /* LAT & Asia */ 21914779705SSam Leffler APL2 = 0x0250, /* LAT & Asia */ 22014779705SSam Leffler APL3 = 0x0350, /* Taiwan */ 22114779705SSam Leffler APL4 = 0x0450, /* Jordan */ 22214779705SSam Leffler APL5 = 0x0550, /* Chile */ 22314779705SSam Leffler APL6 = 0x0650, /* Singapore */ 22414779705SSam Leffler APL8 = 0x0850, /* Malaysia */ 22514779705SSam Leffler APL9 = 0x0950, /* Korea (South) ROC 3 */ 22614779705SSam Leffler 22714779705SSam Leffler ETSI1 = 0x0130, /* Europe & others */ 22814779705SSam Leffler ETSI2 = 0x0230, /* Europe & others */ 22914779705SSam Leffler ETSI3 = 0x0330, /* Europe & others */ 23014779705SSam Leffler ETSI4 = 0x0430, /* Europe & others */ 23114779705SSam Leffler ETSI5 = 0x0530, /* Europe & others */ 23214779705SSam Leffler ETSI6 = 0x0630, /* Europe & others */ 23314779705SSam Leffler ETSIA = 0x0A30, /* France */ 23414779705SSam Leffler ETSIB = 0x0B30, /* Israel */ 23514779705SSam Leffler ETSIC = 0x0C30, /* Latin America */ 23614779705SSam Leffler 23714779705SSam Leffler FCC1 = 0x0110, /* US & others */ 23814779705SSam Leffler FCC2 = 0x0120, /* Canada, Australia & New Zealand */ 23914779705SSam Leffler FCC3 = 0x0160, /* US w/new middle band & DFS */ 24014779705SSam Leffler FCC4 = 0x0165, /* US Public Safety */ 24114779705SSam Leffler FCC5 = 0x0166, /* US w/ 1/2 and 1/4 width channels */ 24214779705SSam Leffler FCCA = 0x0A10, 24314779705SSam Leffler FCCB = 0x0A11, /* US w/ 1/2 and 1/4 width channels */ 24414779705SSam Leffler 24514779705SSam Leffler APLD = 0x0D50, /* South Korea */ 24614779705SSam Leffler 24714779705SSam Leffler MKK1 = 0x0140, /* Japan (UNI-1 odd)*/ 24814779705SSam Leffler MKK2 = 0x0240, /* Japan (4.9 GHz + UNI-1 odd) */ 24914779705SSam Leffler MKK3 = 0x0340, /* Japan (UNI-1 even) */ 25014779705SSam Leffler MKK4 = 0x0440, /* Japan (UNI-1 even + UNI-2) */ 25114779705SSam Leffler MKK5 = 0x0540, /* Japan (UNI-1 even + UNI-2 + mid-band) */ 25214779705SSam Leffler MKK6 = 0x0640, /* Japan (UNI-1 odd + UNI-1 even) */ 25314779705SSam Leffler MKK7 = 0x0740, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 */ 25414779705SSam Leffler MKK8 = 0x0840, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 + mid-band) */ 25514779705SSam Leffler MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */ 25614779705SSam Leffler MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ 25714779705SSam Leffler MKKA = 0x0A40, /* Japan */ 25814779705SSam Leffler MKKC = 0x0A50, 25914779705SSam Leffler 26014779705SSam Leffler NULL1 = 0x0198, 26114779705SSam Leffler WORLD = 0x0199, 26214779705SSam Leffler DEBUG_REG_DMN = 0x01ff, 26314779705SSam Leffler }; 26414779705SSam Leffler 26514779705SSam Leffler #define WORLD_SKU_MASK 0x00F0 26614779705SSam Leffler #define WORLD_SKU_PREFIX 0x0060 26714779705SSam Leffler 26814779705SSam Leffler enum { /* conformance test limits */ 26914779705SSam Leffler FCC = 0x10, 27014779705SSam Leffler MKK = 0x40, 27114779705SSam Leffler ETSI = 0x30, 27214779705SSam Leffler }; 27314779705SSam Leffler 27414779705SSam Leffler /* 27514779705SSam Leffler * The following are flags for different requirements per reg domain. 27614779705SSam Leffler * These requirements are either inhereted from the reg domain pair or 27714779705SSam Leffler * from the unitary reg domain if the reg domain pair flags value is 0 27814779705SSam Leffler */ 27914779705SSam Leffler enum { 28014779705SSam Leffler NO_REQ = 0x00000000, /* NB: must be zero */ 28159efa8b5SSam Leffler DISALLOW_ADHOC_11A = 0x00000001, /* adhoc not allowed in 5GHz */ 28259efa8b5SSam Leffler DISALLOW_ADHOC_11A_TURB = 0x00000002, /* not allowed w/ 5GHz turbo */ 28359efa8b5SSam Leffler NEED_NFC = 0x00000004, /* need noise floor check */ 28459efa8b5SSam Leffler ADHOC_PER_11D = 0x00000008, /* must receive 11d beacon */ 28559efa8b5SSam Leffler LIMIT_FRAME_4MS = 0x00000020, /* 4msec tx burst limit */ 28614779705SSam Leffler NO_HOSTAP = 0x00000040, /* No HOSTAP mode opereation */ 28714779705SSam Leffler }; 28814779705SSam Leffler 28914779705SSam Leffler /* 29014779705SSam Leffler * The following describe the bit masks for different passive scan 29114779705SSam Leffler * capability/requirements per regdomain. 29214779705SSam Leffler */ 29314779705SSam Leffler #define NO_PSCAN 0x0ULL /* NB: must be zero */ 29414779705SSam Leffler #define PSCAN_FCC 0x0000000000000001ULL 29514779705SSam Leffler #define PSCAN_FCC_T 0x0000000000000002ULL 29614779705SSam Leffler #define PSCAN_ETSI 0x0000000000000004ULL 29714779705SSam Leffler #define PSCAN_MKK1 0x0000000000000008ULL 29814779705SSam Leffler #define PSCAN_MKK2 0x0000000000000010ULL 29914779705SSam Leffler #define PSCAN_MKKA 0x0000000000000020ULL 30014779705SSam Leffler #define PSCAN_MKKA_G 0x0000000000000040ULL 30114779705SSam Leffler #define PSCAN_ETSIA 0x0000000000000080ULL 30214779705SSam Leffler #define PSCAN_ETSIB 0x0000000000000100ULL 30314779705SSam Leffler #define PSCAN_ETSIC 0x0000000000000200ULL 30414779705SSam Leffler #define PSCAN_WWR 0x0000000000000400ULL 30514779705SSam Leffler #define PSCAN_MKKA1 0x0000000000000800ULL 30614779705SSam Leffler #define PSCAN_MKKA1_G 0x0000000000001000ULL 30714779705SSam Leffler #define PSCAN_MKKA2 0x0000000000002000ULL 30814779705SSam Leffler #define PSCAN_MKKA2_G 0x0000000000004000ULL 30914779705SSam Leffler #define PSCAN_MKK3 0x0000000000008000ULL 31014779705SSam Leffler #define PSCAN_DEFER 0x7FFFFFFFFFFFFFFFULL 31114779705SSam Leffler #define IS_ECM_CHAN 0x8000000000000000ULL 31214779705SSam Leffler 31314779705SSam Leffler /* 31414779705SSam Leffler * THE following table is the mapping of regdomain pairs specified by 31514779705SSam Leffler * an 8 bit regdomain value to the individual unitary reg domains 31614779705SSam Leffler */ 31714779705SSam Leffler static REG_DMN_PAIR_MAPPING regDomainPairs[] = { 31859efa8b5SSam Leffler {NO_ENUMRD, DEBUG_REG_DMN, DEBUG_REG_DMN, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 31959efa8b5SSam Leffler {NULL1_WORLD, NULL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32059efa8b5SSam Leffler {NULL1_ETSIB, NULL1, ETSIB, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32159efa8b5SSam Leffler {NULL1_ETSIC, NULL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32214779705SSam Leffler 32359efa8b5SSam Leffler {FCC2_FCCA, FCC2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32459efa8b5SSam Leffler {FCC2_WORLD, FCC2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32559efa8b5SSam Leffler {FCC2_ETSIC, FCC2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32659efa8b5SSam Leffler {FCC3_FCCA, FCC3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32759efa8b5SSam Leffler {FCC3_WORLD, FCC3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32859efa8b5SSam Leffler {FCC4_FCCA, FCC4, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 32959efa8b5SSam Leffler {FCC5_FCCB, FCC5, FCCB, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33014779705SSam Leffler 33159efa8b5SSam Leffler {ETSI1_WORLD, ETSI1, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33259efa8b5SSam Leffler {ETSI2_WORLD, ETSI2, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33359efa8b5SSam Leffler {ETSI3_WORLD, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33459efa8b5SSam Leffler {ETSI4_WORLD, ETSI4, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33559efa8b5SSam Leffler {ETSI5_WORLD, ETSI5, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33659efa8b5SSam Leffler {ETSI6_WORLD, ETSI6, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33714779705SSam Leffler 33859efa8b5SSam Leffler {ETSI3_ETSIA, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 33959efa8b5SSam Leffler {FRANCE_RES, ETSI3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34014779705SSam Leffler 34159efa8b5SSam Leffler {FCC1_WORLD, FCC1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34259efa8b5SSam Leffler {FCC1_FCCA, FCC1, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34359efa8b5SSam Leffler {APL1_WORLD, APL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34459efa8b5SSam Leffler {APL2_WORLD, APL2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34559efa8b5SSam Leffler {APL3_WORLD, APL3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34659efa8b5SSam Leffler {APL4_WORLD, APL4, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34759efa8b5SSam Leffler {APL5_WORLD, APL5, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34859efa8b5SSam Leffler {APL6_WORLD, APL6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 34959efa8b5SSam Leffler {APL8_WORLD, APL8, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35059efa8b5SSam Leffler {APL9_WORLD, APL9, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35114779705SSam Leffler 35259efa8b5SSam Leffler {APL3_FCCA, APL3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35359efa8b5SSam Leffler {APL1_ETSIC, APL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35459efa8b5SSam Leffler {APL2_ETSIC, APL2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35559efa8b5SSam Leffler {APL2_APLD, APL2, APLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 35614779705SSam Leffler 35714779705SSam Leffler {MKK1_MKKA, MKK1, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA, CTRY_JAPAN }, 35814779705SSam 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 }, 35914779705SSam Leffler {MKK1_FCCA, MKK1, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN2 }, 36014779705SSam 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 }, 36114779705SSam 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 }, 36214779705SSam Leffler {MKK1_MKKC, MKK1, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN6 }, 36314779705SSam Leffler 36414779705SSam Leffler /* MKK2 */ 36514779705SSam 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 }, 36614779705SSam Leffler 36714779705SSam Leffler /* MKK3 */ 36859efa8b5SSam Leffler {MKK3_MKKA, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC , PSCAN_MKKA, CTRY_DEFAULT }, 36914779705SSam 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 }, 37059efa8b5SSam Leffler {MKK3_MKKA1, MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_DEFAULT }, 37114779705SSam Leffler {MKK3_MKKA2,MKK3, MKKA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN8 }, 37214779705SSam Leffler {MKK3_MKKC, MKK3, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, CTRY_JAPAN9 }, 37359efa8b5SSam Leffler {MKK3_FCCA, MKK3, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, NO_PSCAN, CTRY_DEFAULT }, 37414779705SSam Leffler 37514779705SSam Leffler /* MKK4 */ 37614779705SSam 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 }, 37759efa8b5SSam 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 }, 37814779705SSam 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 }, 37914779705SSam Leffler {MKK4_MKKC, MKK4, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN12 }, 38059efa8b5SSam Leffler {MKK4_FCCA, MKK4, FCCA, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_DEFAULT }, 38114779705SSam Leffler 38214779705SSam Leffler /* MKK5 */ 38314779705SSam 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 }, 38414779705SSam 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 }, 38514779705SSam Leffler {MKK5_MKKC, MKK5, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN15 }, 38614779705SSam Leffler 38714779705SSam Leffler /* MKK6 */ 38814779705SSam 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 }, 38914779705SSam 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 }, 39014779705SSam Leffler {MKK6_MKKC, MKK6, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN18 }, 39114779705SSam Leffler 39214779705SSam Leffler /* MKK7 */ 39314779705SSam 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 }, 39414779705SSam 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 }, 39514779705SSam Leffler {MKK7_MKKC, MKK7, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3, CTRY_JAPAN21 }, 39614779705SSam Leffler 39714779705SSam Leffler /* MKK8 */ 39814779705SSam 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 }, 39914779705SSam 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 }, 40014779705SSam Leffler {MKK8_MKKC, MKK8, MKKC, DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 , CTRY_JAPAN24 }, 40114779705SSam Leffler 40259efa8b5SSam 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 }, 40359efa8b5SSam 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 }, 40414779705SSam Leffler 40514779705SSam Leffler /* These are super domains */ 40659efa8b5SSam Leffler {WOR0_WORLD, WOR0_WORLD, WOR0_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 40759efa8b5SSam Leffler {WOR1_WORLD, WOR1_WORLD, WOR1_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 40859efa8b5SSam Leffler {WOR2_WORLD, WOR2_WORLD, WOR2_WORLD, DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 40959efa8b5SSam Leffler {WOR3_WORLD, WOR3_WORLD, WOR3_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41059efa8b5SSam Leffler {WOR4_WORLD, WOR4_WORLD, WOR4_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41159efa8b5SSam Leffler {WOR5_ETSIC, WOR5_ETSIC, WOR5_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41259efa8b5SSam Leffler {WOR01_WORLD, WOR01_WORLD, WOR01_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41359efa8b5SSam Leffler {WOR02_WORLD, WOR02_WORLD, WOR02_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41459efa8b5SSam Leffler {EU1_WORLD, EU1_WORLD, EU1_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41559efa8b5SSam Leffler {WOR9_WORLD, WOR9_WORLD, WOR9_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41659efa8b5SSam Leffler {WORA_WORLD, WORA_WORLD, WORA_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 4179c9dad53SRui Paulo {WORB_WORLD, WORB_WORLD, WORB_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, 41814779705SSam Leffler }; 41914779705SSam Leffler 42014779705SSam Leffler /* 42114779705SSam Leffler * The following tables are the master list for all different freqeuncy 42214779705SSam Leffler * bands with the complete matrix of all possible flags and settings 42314779705SSam Leffler * for each band if it is used in ANY reg domain. 42414779705SSam Leffler */ 42514779705SSam Leffler 42614779705SSam Leffler #define DEF_REGDMN FCC1_FCCA 42714779705SSam Leffler #define COUNTRY_ERD_FLAG 0x8000 42814779705SSam Leffler #define WORLDWIDE_ROAMING_FLAG 0x4000 42914779705SSam Leffler 43014779705SSam Leffler static COUNTRY_CODE_TO_ENUM_RD allCountries[] = { 43159efa8b5SSam Leffler { CTRY_DEBUG, NO_ENUMRD }, 43259efa8b5SSam Leffler { CTRY_DEFAULT, DEF_REGDMN }, 43359efa8b5SSam Leffler { CTRY_ALBANIA, NULL1_WORLD }, 43459efa8b5SSam Leffler { CTRY_ALGERIA, NULL1_WORLD }, 43559efa8b5SSam Leffler { CTRY_ARGENTINA, APL3_WORLD }, 43659efa8b5SSam Leffler { CTRY_ARMENIA, ETSI4_WORLD }, 43759efa8b5SSam Leffler { CTRY_AUSTRALIA, FCC2_WORLD }, 43859efa8b5SSam Leffler { CTRY_AUSTRIA, ETSI1_WORLD }, 43959efa8b5SSam Leffler { CTRY_AZERBAIJAN, ETSI4_WORLD }, 44059efa8b5SSam Leffler { CTRY_BAHRAIN, APL6_WORLD }, 44159efa8b5SSam Leffler { CTRY_BELARUS, NULL1_WORLD }, 44259efa8b5SSam Leffler { CTRY_BELGIUM, ETSI1_WORLD }, 44359efa8b5SSam Leffler { CTRY_BELIZE, APL1_ETSIC }, 44459efa8b5SSam Leffler { CTRY_BOLIVIA, APL1_ETSIC }, 44559efa8b5SSam Leffler { CTRY_BRAZIL, FCC3_WORLD }, 44659efa8b5SSam Leffler { CTRY_BRUNEI_DARUSSALAM,APL1_WORLD }, 44759efa8b5SSam Leffler { CTRY_BULGARIA, ETSI6_WORLD }, 44859efa8b5SSam Leffler { CTRY_CANADA, FCC2_FCCA }, 44959efa8b5SSam Leffler { CTRY_CHILE, APL6_WORLD }, 45059efa8b5SSam Leffler { CTRY_CHINA, APL1_WORLD }, 45159efa8b5SSam Leffler { CTRY_COLOMBIA, FCC1_FCCA }, 45259efa8b5SSam Leffler { CTRY_COSTA_RICA, NULL1_WORLD }, 45359efa8b5SSam Leffler { CTRY_CROATIA, ETSI3_WORLD }, 45459efa8b5SSam Leffler { CTRY_CYPRUS, ETSI1_WORLD }, 45559efa8b5SSam Leffler { CTRY_CZECH, ETSI1_WORLD }, 45659efa8b5SSam Leffler { CTRY_DENMARK, ETSI1_WORLD }, 45759efa8b5SSam Leffler { CTRY_DOMINICAN_REPUBLIC,FCC1_FCCA }, 45859efa8b5SSam Leffler { CTRY_ECUADOR, NULL1_WORLD }, 45959efa8b5SSam Leffler { CTRY_EGYPT, ETSI3_WORLD }, 46059efa8b5SSam Leffler { CTRY_EL_SALVADOR, NULL1_WORLD }, 46159efa8b5SSam Leffler { CTRY_ESTONIA, ETSI1_WORLD }, 46259efa8b5SSam Leffler { CTRY_FINLAND, ETSI1_WORLD }, 46359efa8b5SSam Leffler { CTRY_FRANCE, ETSI1_WORLD }, 46459efa8b5SSam Leffler { CTRY_FRANCE2, ETSI3_WORLD }, 46559efa8b5SSam Leffler { CTRY_GEORGIA, ETSI4_WORLD }, 46659efa8b5SSam Leffler { CTRY_GERMANY, ETSI1_WORLD }, 46759efa8b5SSam Leffler { CTRY_GREECE, ETSI1_WORLD }, 46859efa8b5SSam Leffler { CTRY_GUATEMALA, FCC1_FCCA }, 46959efa8b5SSam Leffler { CTRY_HONDURAS, NULL1_WORLD }, 47059efa8b5SSam Leffler { CTRY_HONG_KONG, FCC2_WORLD }, 47159efa8b5SSam Leffler { CTRY_HUNGARY, ETSI1_WORLD }, 47259efa8b5SSam Leffler { CTRY_ICELAND, ETSI1_WORLD }, 47359efa8b5SSam Leffler { CTRY_INDIA, APL6_WORLD }, 47459efa8b5SSam Leffler { CTRY_INDONESIA, APL1_WORLD }, 47559efa8b5SSam Leffler { CTRY_IRAN, APL1_WORLD }, 47659efa8b5SSam Leffler { CTRY_IRELAND, ETSI1_WORLD }, 47759efa8b5SSam Leffler { CTRY_ISRAEL, NULL1_WORLD }, 47859efa8b5SSam Leffler { CTRY_ITALY, ETSI1_WORLD }, 47959efa8b5SSam Leffler { CTRY_JAPAN, MKK1_MKKA }, 48059efa8b5SSam Leffler { CTRY_JAPAN1, MKK1_MKKB }, 48159efa8b5SSam Leffler { CTRY_JAPAN2, MKK1_FCCA }, 48259efa8b5SSam Leffler { CTRY_JAPAN3, MKK2_MKKA }, 48359efa8b5SSam Leffler { CTRY_JAPAN4, MKK1_MKKA1 }, 48459efa8b5SSam Leffler { CTRY_JAPAN5, MKK1_MKKA2 }, 48559efa8b5SSam Leffler { CTRY_JAPAN6, MKK1_MKKC }, 48614779705SSam Leffler 48759efa8b5SSam Leffler { CTRY_JAPAN7, MKK3_MKKB }, 48859efa8b5SSam Leffler { CTRY_JAPAN8, MKK3_MKKA2 }, 48959efa8b5SSam Leffler { CTRY_JAPAN9, MKK3_MKKC }, 49014779705SSam Leffler 49159efa8b5SSam Leffler { CTRY_JAPAN10, MKK4_MKKB }, 49259efa8b5SSam Leffler { CTRY_JAPAN11, MKK4_MKKA2 }, 49359efa8b5SSam Leffler { CTRY_JAPAN12, MKK4_MKKC }, 49414779705SSam Leffler 49559efa8b5SSam Leffler { CTRY_JAPAN13, MKK5_MKKB }, 49659efa8b5SSam Leffler { CTRY_JAPAN14, MKK5_MKKA2 }, 49759efa8b5SSam Leffler { CTRY_JAPAN15, MKK5_MKKC }, 49814779705SSam Leffler 49959efa8b5SSam Leffler { CTRY_JAPAN16, MKK6_MKKB }, 50059efa8b5SSam Leffler { CTRY_JAPAN17, MKK6_MKKA2 }, 50159efa8b5SSam Leffler { CTRY_JAPAN18, MKK6_MKKC }, 50214779705SSam Leffler 50359efa8b5SSam Leffler { CTRY_JAPAN19, MKK7_MKKB }, 50459efa8b5SSam Leffler { CTRY_JAPAN20, MKK7_MKKA2 }, 50559efa8b5SSam Leffler { CTRY_JAPAN21, MKK7_MKKC }, 50614779705SSam Leffler 50759efa8b5SSam Leffler { CTRY_JAPAN22, MKK8_MKKB }, 50859efa8b5SSam Leffler { CTRY_JAPAN23, MKK8_MKKA2 }, 50959efa8b5SSam Leffler { CTRY_JAPAN24, MKK8_MKKC }, 51014779705SSam Leffler 51159efa8b5SSam Leffler { CTRY_JORDAN, APL4_WORLD }, 51259efa8b5SSam Leffler { CTRY_KAZAKHSTAN, NULL1_WORLD }, 51359efa8b5SSam Leffler { CTRY_KOREA_NORTH, APL2_WORLD }, 51459efa8b5SSam Leffler { CTRY_KOREA_ROC, APL2_WORLD }, 51559efa8b5SSam Leffler { CTRY_KOREA_ROC2, APL2_WORLD }, 51659efa8b5SSam Leffler { CTRY_KOREA_ROC3, APL9_WORLD }, 51759efa8b5SSam Leffler { CTRY_KUWAIT, NULL1_WORLD }, 51859efa8b5SSam Leffler { CTRY_LATVIA, ETSI1_WORLD }, 51959efa8b5SSam Leffler { CTRY_LEBANON, NULL1_WORLD }, 52059efa8b5SSam Leffler { CTRY_LIECHTENSTEIN,ETSI1_WORLD }, 52159efa8b5SSam Leffler { CTRY_LITHUANIA, ETSI1_WORLD }, 52259efa8b5SSam Leffler { CTRY_LUXEMBOURG, ETSI1_WORLD }, 52359efa8b5SSam Leffler { CTRY_MACAU, FCC2_WORLD }, 52459efa8b5SSam Leffler { CTRY_MACEDONIA, NULL1_WORLD }, 52559efa8b5SSam Leffler { CTRY_MALAYSIA, APL8_WORLD }, 52659efa8b5SSam Leffler { CTRY_MALTA, ETSI1_WORLD }, 52759efa8b5SSam Leffler { CTRY_MEXICO, FCC1_FCCA }, 52859efa8b5SSam Leffler { CTRY_MONACO, ETSI4_WORLD }, 52959efa8b5SSam Leffler { CTRY_MOROCCO, NULL1_WORLD }, 53059efa8b5SSam Leffler { CTRY_NETHERLANDS, ETSI1_WORLD }, 53159efa8b5SSam Leffler { CTRY_NEW_ZEALAND, FCC2_ETSIC }, 53259efa8b5SSam Leffler { CTRY_NORWAY, ETSI1_WORLD }, 53359efa8b5SSam Leffler { CTRY_OMAN, APL6_WORLD }, 53459efa8b5SSam Leffler { CTRY_PAKISTAN, NULL1_WORLD }, 53559efa8b5SSam Leffler { CTRY_PANAMA, FCC1_FCCA }, 53659efa8b5SSam Leffler { CTRY_PERU, APL1_WORLD }, 53759efa8b5SSam Leffler { CTRY_PHILIPPINES, FCC3_WORLD }, 53859efa8b5SSam Leffler { CTRY_POLAND, ETSI1_WORLD }, 53959efa8b5SSam Leffler { CTRY_PORTUGAL, ETSI1_WORLD }, 54059efa8b5SSam Leffler { CTRY_PUERTO_RICO, FCC1_FCCA }, 54159efa8b5SSam Leffler { CTRY_QATAR, NULL1_WORLD }, 54259efa8b5SSam Leffler { CTRY_ROMANIA, NULL1_WORLD }, 54359efa8b5SSam Leffler { CTRY_RUSSIA, NULL1_WORLD }, 54459efa8b5SSam Leffler { CTRY_SAUDI_ARABIA,FCC2_WORLD }, 54559efa8b5SSam Leffler { CTRY_SINGAPORE, APL6_WORLD }, 54659efa8b5SSam Leffler { CTRY_SLOVAKIA, ETSI1_WORLD }, 54759efa8b5SSam Leffler { CTRY_SLOVENIA, ETSI1_WORLD }, 54859efa8b5SSam Leffler { CTRY_SOUTH_AFRICA,FCC3_WORLD }, 54959efa8b5SSam Leffler { CTRY_SPAIN, ETSI1_WORLD }, 55059efa8b5SSam Leffler { CTRY_SWEDEN, ETSI1_WORLD }, 55159efa8b5SSam Leffler { CTRY_SWITZERLAND, ETSI1_WORLD }, 55259efa8b5SSam Leffler { CTRY_SYRIA, NULL1_WORLD }, 55359efa8b5SSam Leffler { CTRY_TAIWAN, APL3_FCCA }, 554c1d8b5aaSSam Leffler { CTRY_THAILAND, FCC3_WORLD }, 55559efa8b5SSam Leffler { CTRY_TRINIDAD_Y_TOBAGO,ETSI4_WORLD }, 55659efa8b5SSam Leffler { CTRY_TUNISIA, ETSI3_WORLD }, 55759efa8b5SSam Leffler { CTRY_TURKEY, ETSI3_WORLD }, 55859efa8b5SSam Leffler { CTRY_UKRAINE, NULL1_WORLD }, 55959efa8b5SSam Leffler { CTRY_UAE, NULL1_WORLD }, 56059efa8b5SSam Leffler { CTRY_UNITED_KINGDOM, ETSI1_WORLD }, 56159efa8b5SSam Leffler { CTRY_UNITED_STATES, FCC1_FCCA }, 56259efa8b5SSam Leffler { CTRY_UNITED_STATES_FCC49,FCC4_FCCA }, 56359efa8b5SSam Leffler { CTRY_URUGUAY, FCC1_WORLD }, 56459efa8b5SSam Leffler { CTRY_UZBEKISTAN, FCC3_FCCA }, 56559efa8b5SSam Leffler { CTRY_VENEZUELA, APL2_ETSIC }, 56659efa8b5SSam Leffler { CTRY_VIET_NAM, NULL1_WORLD }, 56759efa8b5SSam Leffler { CTRY_ZIMBABWE, NULL1_WORLD } 56814779705SSam Leffler }; 56914779705SSam Leffler 57014779705SSam Leffler /* Bit masks for DFS per regdomain */ 57114779705SSam Leffler enum { 57214779705SSam Leffler NO_DFS = 0x0000000000000000ULL, /* NB: must be zero */ 57314779705SSam Leffler DFS_FCC3 = 0x0000000000000001ULL, 57414779705SSam Leffler DFS_ETSI = 0x0000000000000002ULL, 57514779705SSam Leffler DFS_MKK4 = 0x0000000000000004ULL, 57614779705SSam Leffler }; 57714779705SSam Leffler 57814779705SSam Leffler #define AFTER(x) ((x)+1) 57914779705SSam Leffler 58014779705SSam Leffler /* 58114779705SSam Leffler * Frequency band collections are defined using bitmasks. Each bit 58214779705SSam Leffler * in a mask is the index of an entry in one of the following tables. 58314779705SSam Leffler * Bitmasks are BMLEN*64 bits so if a table grows beyond that the bit 58414779705SSam Leffler * vectors must be enlarged or the tables split somehow (e.g. split 58514779705SSam Leffler * 1/2 and 1/4 rate channels into a separate table). 58614779705SSam Leffler * 58714779705SSam Leffler * Beware of ordering; the indices are defined relative to the preceding 58814779705SSam Leffler * entry so if things get off there will be confusion. A good way to 58914779705SSam Leffler * check the indices is to collect them in a switch statement in a stub 59014779705SSam Leffler * function so the compiler checks for duplicates. 59114779705SSam Leffler */ 59214779705SSam Leffler 59314779705SSam Leffler /* 59414779705SSam Leffler * 5GHz 11A channel tags 59514779705SSam Leffler */ 59614779705SSam Leffler static REG_DMN_FREQ_BAND regDmn5GhzFreq[] = { 59759efa8b5SSam Leffler { 4915, 4925, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 59814779705SSam Leffler #define F1_4915_4925 0 59959efa8b5SSam Leffler { 4935, 4945, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 60014779705SSam Leffler #define F1_4935_4945 AFTER(F1_4915_4925) 60159efa8b5SSam Leffler { 4920, 4980, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2 }, 60214779705SSam Leffler #define F1_4920_4980 AFTER(F1_4935_4945) 60359efa8b5SSam Leffler { 4942, 4987, 27, 6, 5, 5, NO_DFS, PSCAN_FCC }, 60414779705SSam Leffler #define F1_4942_4987 AFTER(F1_4920_4980) 60559efa8b5SSam Leffler { 4945, 4985, 30, 6, 10, 5, NO_DFS, PSCAN_FCC }, 60614779705SSam Leffler #define F1_4945_4985 AFTER(F1_4942_4987) 60759efa8b5SSam Leffler { 4950, 4980, 33, 6, 20, 5, NO_DFS, PSCAN_FCC }, 60814779705SSam Leffler #define F1_4950_4980 AFTER(F1_4945_4985) 60959efa8b5SSam Leffler { 5035, 5040, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 61014779705SSam Leffler #define F1_5035_5040 AFTER(F1_4950_4980) 61159efa8b5SSam Leffler { 5040, 5080, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2 }, 61214779705SSam Leffler #define F1_5040_5080 AFTER(F1_5035_5040) 61359efa8b5SSam Leffler { 5055, 5055, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2 }, 61414779705SSam Leffler #define F1_5055_5055 AFTER(F1_5040_5080) 61514779705SSam Leffler 61659efa8b5SSam Leffler { 5120, 5240, 5, 6, 20, 20, NO_DFS, NO_PSCAN }, 61714779705SSam Leffler #define F1_5120_5240 AFTER(F1_5055_5055) 61859efa8b5SSam Leffler { 5120, 5240, 5, 6, 10, 10, NO_DFS, NO_PSCAN }, 61914779705SSam Leffler #define F2_5120_5240 AFTER(F1_5120_5240) 62059efa8b5SSam Leffler { 5120, 5240, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 62114779705SSam Leffler #define F3_5120_5240 AFTER(F2_5120_5240) 62214779705SSam Leffler 62359efa8b5SSam Leffler { 5170, 5230, 23, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2 }, 62414779705SSam Leffler #define F1_5170_5230 AFTER(F3_5120_5240) 62559efa8b5SSam Leffler { 5170, 5230, 20, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2 }, 62614779705SSam Leffler #define F2_5170_5230 AFTER(F1_5170_5230) 62714779705SSam Leffler 62859efa8b5SSam Leffler { 5180, 5240, 15, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 62914779705SSam Leffler #define F1_5180_5240 AFTER(F2_5170_5230) 63059efa8b5SSam Leffler { 5180, 5240, 17, 6, 20, 20, NO_DFS, PSCAN_FCC }, 63114779705SSam Leffler #define F2_5180_5240 AFTER(F1_5180_5240) 63259efa8b5SSam Leffler { 5180, 5240, 18, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 63314779705SSam Leffler #define F3_5180_5240 AFTER(F2_5180_5240) 63459efa8b5SSam Leffler { 5180, 5240, 20, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 63514779705SSam Leffler #define F4_5180_5240 AFTER(F3_5180_5240) 63659efa8b5SSam Leffler { 5180, 5240, 23, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI }, 63714779705SSam Leffler #define F5_5180_5240 AFTER(F4_5180_5240) 63859efa8b5SSam Leffler { 5180, 5240, 23, 6, 20, 20, NO_DFS, PSCAN_FCC }, 63914779705SSam Leffler #define F6_5180_5240 AFTER(F5_5180_5240) 64059efa8b5SSam Leffler { 5180, 5240, 17, 6, 20, 10, NO_DFS, PSCAN_FCC }, 64114779705SSam Leffler #define F7_5180_5240 AFTER(F6_5180_5240) 64259efa8b5SSam Leffler { 5180, 5240, 17, 6, 20, 5, NO_DFS, PSCAN_FCC }, 64314779705SSam Leffler #define F8_5180_5240 AFTER(F7_5180_5240) 64459efa8b5SSam Leffler { 5180, 5320, 20, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 64514779705SSam Leffler 64614779705SSam Leffler #define F1_5180_5320 AFTER(F8_5180_5240) 64759efa8b5SSam Leffler { 5240, 5280, 23, 0, 20, 20, DFS_FCC3, PSCAN_FCC | PSCAN_ETSI }, 64814779705SSam Leffler 64914779705SSam Leffler #define F1_5240_5280 AFTER(F1_5180_5320) 65059efa8b5SSam Leffler { 5260, 5280, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 65114779705SSam Leffler 65214779705SSam Leffler #define F1_5260_5280 AFTER(F1_5240_5280) 65359efa8b5SSam Leffler { 5260, 5320, 18, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 65414779705SSam Leffler 65514779705SSam Leffler #define F1_5260_5320 AFTER(F1_5260_5280) 65659efa8b5SSam Leffler { 5260, 5320, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_FCC | PSCAN_ETSI | PSCAN_MKK3 }, 65714779705SSam Leffler #define F2_5260_5320 AFTER(F1_5260_5320) 65814779705SSam Leffler 65959efa8b5SSam Leffler { 5260, 5320, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 66014779705SSam Leffler #define F3_5260_5320 AFTER(F2_5260_5320) 66159efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 66214779705SSam Leffler #define F4_5260_5320 AFTER(F3_5260_5320) 66359efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 66414779705SSam Leffler #define F5_5260_5320 AFTER(F4_5260_5320) 66559efa8b5SSam Leffler { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 66614779705SSam Leffler #define F6_5260_5320 AFTER(F5_5260_5320) 66759efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 10, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 66814779705SSam Leffler #define F7_5260_5320 AFTER(F6_5260_5320) 66959efa8b5SSam Leffler { 5260, 5320, 23, 6, 20, 5, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 67014779705SSam Leffler #define F8_5260_5320 AFTER(F7_5260_5320) 67114779705SSam Leffler 67259efa8b5SSam Leffler { 5260, 5700, 5, 6, 20, 20, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 67314779705SSam Leffler #define F1_5260_5700 AFTER(F8_5260_5320) 67459efa8b5SSam Leffler { 5260, 5700, 5, 6, 10, 10, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 67514779705SSam Leffler #define F2_5260_5700 AFTER(F1_5260_5700) 67659efa8b5SSam Leffler { 5260, 5700, 5, 6, 5, 5, DFS_FCC3 | DFS_ETSI, NO_PSCAN }, 67714779705SSam Leffler #define F3_5260_5700 AFTER(F2_5260_5700) 67814779705SSam Leffler 67959efa8b5SSam Leffler { 5280, 5320, 17, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 68014779705SSam Leffler #define F1_5280_5320 AFTER(F3_5260_5700) 68114779705SSam Leffler 68259efa8b5SSam Leffler { 5500, 5620, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 68314779705SSam Leffler #define F1_5500_5620 AFTER(F1_5280_5320) 68414779705SSam Leffler 68559efa8b5SSam Leffler { 5500, 5700, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC }, 68614779705SSam Leffler #define F1_5500_5700 AFTER(F1_5500_5620) 68759efa8b5SSam Leffler { 5500, 5700, 27, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 68814779705SSam Leffler #define F2_5500_5700 AFTER(F1_5500_5700) 68959efa8b5SSam Leffler { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI }, 69014779705SSam Leffler #define F3_5500_5700 AFTER(F2_5500_5700) 69159efa8b5SSam Leffler { 5500, 5700, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_MKK3 | PSCAN_FCC }, 69214779705SSam Leffler #define F4_5500_5700 AFTER(F3_5500_5700) 69314779705SSam Leffler 69459efa8b5SSam Leffler { 5745, 5805, 23, 0, 20, 20, NO_DFS, NO_PSCAN }, 69514779705SSam Leffler #define F1_5745_5805 AFTER(F4_5500_5700) 69659efa8b5SSam Leffler { 5745, 5805, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 69714779705SSam Leffler #define F2_5745_5805 AFTER(F1_5745_5805) 69859efa8b5SSam Leffler { 5745, 5805, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI }, 69914779705SSam Leffler #define F3_5745_5805 AFTER(F2_5745_5805) 70059efa8b5SSam Leffler { 5745, 5825, 5, 6, 20, 20, NO_DFS, NO_PSCAN }, 70114779705SSam Leffler #define F1_5745_5825 AFTER(F3_5745_5805) 70259efa8b5SSam Leffler { 5745, 5825, 17, 0, 20, 20, NO_DFS, NO_PSCAN }, 70314779705SSam Leffler #define F2_5745_5825 AFTER(F1_5745_5825) 70459efa8b5SSam Leffler { 5745, 5825, 20, 0, 20, 20, NO_DFS, NO_PSCAN }, 70514779705SSam Leffler #define F3_5745_5825 AFTER(F2_5745_5825) 70659efa8b5SSam Leffler { 5745, 5825, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 70714779705SSam Leffler #define F4_5745_5825 AFTER(F3_5745_5825) 70859efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 70914779705SSam Leffler #define F5_5745_5825 AFTER(F4_5745_5825) 71059efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN }, 71114779705SSam Leffler #define F6_5745_5825 AFTER(F5_5745_5825) 71259efa8b5SSam Leffler { 5745, 5825, 5, 6, 10, 10, NO_DFS, NO_PSCAN }, 71314779705SSam Leffler #define F7_5745_5825 AFTER(F6_5745_5825) 71459efa8b5SSam Leffler { 5745, 5825, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 71514779705SSam Leffler #define F8_5745_5825 AFTER(F7_5745_5825) 71659efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 10, NO_DFS, NO_PSCAN }, 71714779705SSam Leffler #define F9_5745_5825 AFTER(F8_5745_5825) 71859efa8b5SSam Leffler { 5745, 5825, 30, 6, 20, 5, NO_DFS, NO_PSCAN }, 71914779705SSam Leffler #define F10_5745_5825 AFTER(F9_5745_5825) 72014779705SSam Leffler 72114779705SSam Leffler /* 72214779705SSam Leffler * Below are the world roaming channels 72314779705SSam Leffler * All WWR domains have no power limit, instead use the card's CTL 72414779705SSam Leffler * or max power settings. 72514779705SSam Leffler */ 72659efa8b5SSam Leffler { 4920, 4980, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 72714779705SSam Leffler #define W1_4920_4980 AFTER(F10_5745_5825) 72859efa8b5SSam Leffler { 5040, 5080, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 72914779705SSam Leffler #define W1_5040_5080 AFTER(W1_4920_4980) 73059efa8b5SSam Leffler { 5170, 5230, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 73114779705SSam Leffler #define W1_5170_5230 AFTER(W1_5040_5080) 73259efa8b5SSam Leffler { 5180, 5240, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 73314779705SSam Leffler #define W1_5180_5240 AFTER(W1_5170_5230) 73459efa8b5SSam Leffler { 5260, 5320, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 73514779705SSam Leffler #define W1_5260_5320 AFTER(W1_5180_5240) 73659efa8b5SSam Leffler { 5745, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 73714779705SSam Leffler #define W1_5745_5825 AFTER(W1_5260_5320) 73859efa8b5SSam Leffler { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 73914779705SSam Leffler #define W1_5500_5700 AFTER(W1_5745_5825) 74059efa8b5SSam Leffler { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 74114779705SSam Leffler #define W2_5260_5320 AFTER(W1_5500_5700) 74259efa8b5SSam Leffler { 5180, 5240, 30, 0, 20, 20, NO_DFS, NO_PSCAN }, 74314779705SSam Leffler #define W2_5180_5240 AFTER(W2_5260_5320) 74459efa8b5SSam Leffler { 5825, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR }, 74514779705SSam Leffler #define W2_5825_5825 AFTER(W2_5180_5240) 74614779705SSam Leffler }; 74714779705SSam Leffler 74814779705SSam Leffler /* 74914779705SSam Leffler * 5GHz Turbo (dynamic & static) tags 75014779705SSam Leffler */ 75114779705SSam Leffler static REG_DMN_FREQ_BAND regDmn5GhzTurboFreq[] = { 75259efa8b5SSam Leffler { 5130, 5210, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 75314779705SSam Leffler #define T1_5130_5210 0 75459efa8b5SSam Leffler { 5250, 5330, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 75514779705SSam Leffler #define T1_5250_5330 AFTER(T1_5130_5210) 75659efa8b5SSam Leffler { 5370, 5490, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 75714779705SSam Leffler #define T1_5370_5490 AFTER(T1_5250_5330) 75859efa8b5SSam Leffler { 5530, 5650, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 75914779705SSam Leffler #define T1_5530_5650 AFTER(T1_5370_5490) 76014779705SSam Leffler 76159efa8b5SSam Leffler { 5150, 5190, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 76214779705SSam Leffler #define T1_5150_5190 AFTER(T1_5530_5650) 76359efa8b5SSam Leffler { 5230, 5310, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 76414779705SSam Leffler #define T1_5230_5310 AFTER(T1_5150_5190) 76559efa8b5SSam Leffler { 5350, 5470, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 76614779705SSam Leffler #define T1_5350_5470 AFTER(T1_5230_5310) 76759efa8b5SSam Leffler { 5510, 5670, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN }, 76814779705SSam Leffler #define T1_5510_5670 AFTER(T1_5350_5470) 76914779705SSam Leffler 77059efa8b5SSam Leffler { 5200, 5240, 17, 6, 40, 40, NO_DFS, NO_PSCAN }, 77114779705SSam Leffler #define T1_5200_5240 AFTER(T1_5510_5670) 77259efa8b5SSam Leffler { 5200, 5240, 23, 6, 40, 40, NO_DFS, NO_PSCAN }, 77314779705SSam Leffler #define T2_5200_5240 AFTER(T1_5200_5240) 77459efa8b5SSam Leffler { 5210, 5210, 17, 6, 40, 40, NO_DFS, NO_PSCAN }, 77514779705SSam Leffler #define T1_5210_5210 AFTER(T2_5200_5240) 77659efa8b5SSam Leffler { 5210, 5210, 23, 0, 40, 40, NO_DFS, NO_PSCAN }, 77714779705SSam Leffler #define T2_5210_5210 AFTER(T1_5210_5210) 77814779705SSam Leffler 77959efa8b5SSam Leffler { 5280, 5280, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 78014779705SSam Leffler #define T1_5280_5280 AFTER(T2_5210_5210) 78159efa8b5SSam Leffler { 5280, 5280, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 78214779705SSam Leffler #define T2_5280_5280 AFTER(T1_5280_5280) 78359efa8b5SSam Leffler { 5250, 5250, 17, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 78414779705SSam Leffler #define T1_5250_5250 AFTER(T2_5280_5280) 78559efa8b5SSam Leffler { 5290, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 78614779705SSam Leffler #define T1_5290_5290 AFTER(T1_5250_5250) 78759efa8b5SSam Leffler { 5250, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 78814779705SSam Leffler #define T1_5250_5290 AFTER(T1_5290_5290) 78959efa8b5SSam Leffler { 5250, 5290, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 79014779705SSam Leffler #define T2_5250_5290 AFTER(T1_5250_5290) 79114779705SSam Leffler 79259efa8b5SSam Leffler { 5540, 5660, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T }, 79314779705SSam Leffler #define T1_5540_5660 AFTER(T2_5250_5290) 79459efa8b5SSam Leffler { 5760, 5800, 20, 0, 40, 40, NO_DFS, NO_PSCAN }, 79514779705SSam Leffler #define T1_5760_5800 AFTER(T1_5540_5660) 79659efa8b5SSam Leffler { 5760, 5800, 30, 6, 40, 40, NO_DFS, NO_PSCAN }, 79714779705SSam Leffler #define T2_5760_5800 AFTER(T1_5760_5800) 79814779705SSam Leffler 79959efa8b5SSam Leffler { 5765, 5805, 30, 6, 40, 40, NO_DFS, NO_PSCAN }, 80014779705SSam Leffler #define T1_5765_5805 AFTER(T2_5760_5800) 80114779705SSam Leffler 80214779705SSam Leffler /* 80314779705SSam Leffler * Below are the WWR frequencies 80414779705SSam Leffler */ 80559efa8b5SSam Leffler { 5210, 5250, 15, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 80614779705SSam Leffler #define WT1_5210_5250 AFTER(T1_5765_5805) 80759efa8b5SSam Leffler { 5290, 5290, 18, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 80814779705SSam Leffler #define WT1_5290_5290 AFTER(WT1_5210_5250) 80959efa8b5SSam Leffler { 5540, 5660, 20, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR }, 81014779705SSam Leffler #define WT1_5540_5660 AFTER(WT1_5290_5290) 81159efa8b5SSam Leffler { 5760, 5800, 20, 0, 40, 40, NO_DFS, PSCAN_WWR }, 81214779705SSam Leffler #define WT1_5760_5800 AFTER(WT1_5540_5660) 81314779705SSam Leffler }; 81414779705SSam Leffler 81514779705SSam Leffler /* 81614779705SSam Leffler * 2GHz 11b channel tags 81714779705SSam Leffler */ 81814779705SSam Leffler static REG_DMN_FREQ_BAND regDmn2GhzFreq[] = { 81959efa8b5SSam Leffler { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 82014779705SSam Leffler #define F1_2312_2372 0 82159efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 82214779705SSam Leffler #define F2_2312_2372 AFTER(F1_2312_2372) 82314779705SSam Leffler 82459efa8b5SSam Leffler { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 82514779705SSam Leffler #define F1_2412_2472 AFTER(F2_2312_2372) 82659efa8b5SSam Leffler { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA }, 82714779705SSam Leffler #define F2_2412_2472 AFTER(F1_2412_2472) 82859efa8b5SSam Leffler { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN }, 82914779705SSam Leffler #define F3_2412_2472 AFTER(F2_2412_2472) 83014779705SSam Leffler 83159efa8b5SSam Leffler { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN }, 83214779705SSam Leffler #define F1_2412_2462 AFTER(F3_2412_2472) 83359efa8b5SSam Leffler { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA }, 83414779705SSam Leffler #define F2_2412_2462 AFTER(F1_2412_2462) 83514779705SSam Leffler 83659efa8b5SSam Leffler { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 83714779705SSam Leffler #define F1_2432_2442 AFTER(F2_2412_2462) 83814779705SSam Leffler 83959efa8b5SSam Leffler { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 84014779705SSam Leffler #define F1_2457_2472 AFTER(F1_2432_2442) 84114779705SSam Leffler 84259efa8b5SSam Leffler { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA }, 84314779705SSam Leffler #define F1_2467_2472 AFTER(F1_2457_2472) 84414779705SSam Leffler 84559efa8b5SSam Leffler { 2484, 2484, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 84614779705SSam Leffler #define F1_2484_2484 AFTER(F1_2467_2472) 84759efa8b5SSam Leffler { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA | PSCAN_MKKA1 | PSCAN_MKKA2 }, 84814779705SSam Leffler #define F2_2484_2484 AFTER(F1_2484_2484) 84914779705SSam Leffler 85059efa8b5SSam Leffler { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 85114779705SSam Leffler #define F1_2512_2732 AFTER(F2_2484_2484) 85214779705SSam Leffler 85314779705SSam Leffler /* 85414779705SSam Leffler * WWR have powers opened up to 20dBm. 85514779705SSam Leffler * Limits should often come from CTL/Max powers 85614779705SSam Leffler */ 85759efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 85814779705SSam Leffler #define W1_2312_2372 AFTER(F1_2512_2732) 85959efa8b5SSam Leffler { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 86014779705SSam Leffler #define W1_2412_2412 AFTER(W1_2312_2372) 86159efa8b5SSam Leffler { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 86214779705SSam Leffler #define W1_2417_2432 AFTER(W1_2412_2412) 86359efa8b5SSam Leffler { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 86414779705SSam Leffler #define W1_2437_2442 AFTER(W1_2417_2432) 86559efa8b5SSam Leffler { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 86614779705SSam Leffler #define W1_2447_2457 AFTER(W1_2437_2442) 86759efa8b5SSam Leffler { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 86814779705SSam Leffler #define W1_2462_2462 AFTER(W1_2447_2457) 86959efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 87014779705SSam Leffler #define W1_2467_2467 AFTER(W1_2462_2462) 87159efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 87214779705SSam Leffler #define W2_2467_2467 AFTER(W1_2467_2467) 87359efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 87414779705SSam Leffler #define W1_2472_2472 AFTER(W2_2467_2467) 87559efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 87614779705SSam Leffler #define W2_2472_2472 AFTER(W1_2472_2472) 87759efa8b5SSam Leffler { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 87814779705SSam Leffler #define W1_2484_2484 AFTER(W2_2472_2472) 87959efa8b5SSam Leffler { 2484, 2484, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 88014779705SSam Leffler #define W2_2484_2484 AFTER(W1_2484_2484) 88114779705SSam Leffler }; 88214779705SSam Leffler 88314779705SSam Leffler /* 88414779705SSam Leffler * 2GHz 11g channel tags 88514779705SSam Leffler */ 88614779705SSam Leffler static REG_DMN_FREQ_BAND regDmn2Ghz11gFreq[] = { 88759efa8b5SSam Leffler { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 88814779705SSam Leffler #define G1_2312_2372 0 88959efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 89014779705SSam Leffler #define G2_2312_2372 AFTER(G1_2312_2372) 89159efa8b5SSam Leffler { 2312, 2372, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 89214779705SSam Leffler #define G3_2312_2372 AFTER(G2_2312_2372) 89359efa8b5SSam Leffler { 2312, 2372, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 89414779705SSam Leffler #define G4_2312_2372 AFTER(G3_2312_2372) 89514779705SSam Leffler 89659efa8b5SSam Leffler { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 89714779705SSam Leffler #define G1_2412_2472 AFTER(G4_2312_2372) 89859efa8b5SSam Leffler { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G }, 89914779705SSam Leffler #define G2_2412_2472 AFTER(G1_2412_2472) 90059efa8b5SSam Leffler { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN }, 90114779705SSam Leffler #define G3_2412_2472 AFTER(G2_2412_2472) 90259efa8b5SSam Leffler { 2412, 2472, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 90314779705SSam Leffler #define G4_2412_2472 AFTER(G3_2412_2472) 90459efa8b5SSam Leffler { 2412, 2472, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 90514779705SSam Leffler #define G5_2412_2472 AFTER(G4_2412_2472) 90614779705SSam Leffler 90759efa8b5SSam Leffler { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN }, 90814779705SSam Leffler #define G1_2412_2462 AFTER(G5_2412_2472) 90959efa8b5SSam Leffler { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G }, 91014779705SSam Leffler #define G2_2412_2462 AFTER(G1_2412_2462) 91159efa8b5SSam Leffler { 2412, 2462, 27, 6, 10, 5, NO_DFS, NO_PSCAN }, 91214779705SSam Leffler #define G3_2412_2462 AFTER(G2_2412_2462) 91359efa8b5SSam Leffler { 2412, 2462, 27, 6, 5, 5, NO_DFS, NO_PSCAN }, 91414779705SSam Leffler #define G4_2412_2462 AFTER(G3_2412_2462) 91514779705SSam Leffler 91659efa8b5SSam Leffler { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 91714779705SSam Leffler #define G1_2432_2442 AFTER(G4_2412_2462) 91814779705SSam Leffler 91959efa8b5SSam Leffler { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 92014779705SSam Leffler #define G1_2457_2472 AFTER(G1_2432_2442) 92114779705SSam Leffler 92259efa8b5SSam Leffler { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN }, 92314779705SSam Leffler #define G1_2512_2732 AFTER(G1_2457_2472) 92459efa8b5SSam Leffler { 2512, 2732, 5, 6, 10, 5, NO_DFS, NO_PSCAN }, 92514779705SSam Leffler #define G2_2512_2732 AFTER(G1_2512_2732) 92659efa8b5SSam Leffler { 2512, 2732, 5, 6, 5, 5, NO_DFS, NO_PSCAN }, 92714779705SSam Leffler #define G3_2512_2732 AFTER(G2_2512_2732) 92814779705SSam Leffler 92959efa8b5SSam Leffler { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA }, 93014779705SSam Leffler #define G1_2467_2472 AFTER(G3_2512_2732) 93114779705SSam Leffler 93214779705SSam Leffler /* 93314779705SSam Leffler * WWR open up the power to 20dBm 93414779705SSam Leffler */ 93559efa8b5SSam Leffler { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 93614779705SSam Leffler #define WG1_2312_2372 AFTER(G1_2467_2472) 93759efa8b5SSam Leffler { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 93814779705SSam Leffler #define WG1_2412_2412 AFTER(WG1_2312_2372) 93959efa8b5SSam Leffler { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 94014779705SSam Leffler #define WG1_2417_2432 AFTER(WG1_2412_2412) 94159efa8b5SSam Leffler { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 94214779705SSam Leffler #define WG1_2437_2442 AFTER(WG1_2417_2432) 94359efa8b5SSam Leffler { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 94414779705SSam Leffler #define WG1_2447_2457 AFTER(WG1_2437_2442) 94559efa8b5SSam Leffler { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN }, 94614779705SSam Leffler #define WG1_2462_2462 AFTER(WG1_2447_2457) 94759efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 94814779705SSam Leffler #define WG1_2467_2467 AFTER(WG1_2462_2462) 94959efa8b5SSam Leffler { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 95014779705SSam Leffler #define WG2_2467_2467 AFTER(WG1_2467_2467) 95159efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN }, 95214779705SSam Leffler #define WG1_2472_2472 AFTER(WG2_2467_2467) 95359efa8b5SSam Leffler { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN }, 95414779705SSam Leffler #define WG2_2472_2472 AFTER(WG1_2472_2472) 95514779705SSam Leffler }; 95614779705SSam Leffler 95714779705SSam Leffler /* 95814779705SSam Leffler * 2GHz Dynamic turbo tags 95914779705SSam Leffler */ 96014779705SSam Leffler static REG_DMN_FREQ_BAND regDmn2Ghz11gTurboFreq[] = { 96159efa8b5SSam Leffler { 2312, 2372, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 96214779705SSam Leffler #define T1_2312_2372 0 96359efa8b5SSam Leffler { 2437, 2437, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 96414779705SSam Leffler #define T1_2437_2437 AFTER(T1_2312_2372) 96559efa8b5SSam Leffler { 2437, 2437, 20, 6, 40, 40, NO_DFS, NO_PSCAN }, 96614779705SSam Leffler #define T2_2437_2437 AFTER(T1_2437_2437) 96759efa8b5SSam Leffler { 2437, 2437, 18, 6, 40, 40, NO_DFS, PSCAN_WWR }, 96814779705SSam Leffler #define T3_2437_2437 AFTER(T2_2437_2437) 96959efa8b5SSam Leffler { 2512, 2732, 5, 6, 40, 40, NO_DFS, NO_PSCAN }, 97014779705SSam Leffler #define T1_2512_2732 AFTER(T3_2437_2437) 97114779705SSam Leffler }; 97214779705SSam Leffler 97314779705SSam Leffler static REG_DOMAIN regDomains[] = { 97414779705SSam Leffler 97514779705SSam Leffler {.regDmnEnum = DEBUG_REG_DMN, 97614779705SSam Leffler .conformanceTestLimit = FCC, 97714779705SSam Leffler .dfsMask = DFS_FCC3, 978506c6a3aSSam Leffler .chan11a = BM4(F1_4950_4980, 979506c6a3aSSam Leffler F1_5120_5240, 980506c6a3aSSam Leffler F1_5260_5700, 981506c6a3aSSam Leffler F1_5745_5825), 982506c6a3aSSam Leffler .chan11a_half = BM4(F1_4945_4985, 983506c6a3aSSam Leffler F2_5120_5240, 984506c6a3aSSam Leffler F2_5260_5700, 985506c6a3aSSam Leffler F7_5745_5825), 986506c6a3aSSam Leffler .chan11a_quarter = BM4(F1_4942_4987, 987506c6a3aSSam Leffler F3_5120_5240, 988506c6a3aSSam Leffler F3_5260_5700, 989506c6a3aSSam Leffler F8_5745_5825), 99014779705SSam Leffler .chan11a_turbo = BM8(T1_5130_5210, 99114779705SSam Leffler T1_5250_5330, 99214779705SSam Leffler T1_5370_5490, 99314779705SSam Leffler T1_5530_5650, 99414779705SSam Leffler T1_5150_5190, 99514779705SSam Leffler T1_5230_5310, 99614779705SSam Leffler T1_5350_5470, 99714779705SSam Leffler T1_5510_5670), 99814779705SSam Leffler .chan11a_dyn_turbo = BM4(T1_5200_5240, 99914779705SSam Leffler T1_5280_5280, 100014779705SSam Leffler T1_5540_5660, 100114779705SSam Leffler T1_5765_5805), 100214779705SSam Leffler .chan11b = BM4(F1_2312_2372, 100314779705SSam Leffler F1_2412_2472, 100414779705SSam Leffler F1_2484_2484, 100514779705SSam Leffler F1_2512_2732), 100614779705SSam Leffler .chan11g = BM3(G1_2312_2372, G1_2412_2472, G1_2512_2732), 100714779705SSam Leffler .chan11g_turbo = BM3(T1_2312_2372, T1_2437_2437, T1_2512_2732), 100814779705SSam Leffler .chan11g_half = BM3(G2_2312_2372, G4_2412_2472, G2_2512_2732), 100914779705SSam Leffler .chan11g_quarter = BM3(G3_2312_2372, G5_2412_2472, G3_2512_2732), 101014779705SSam Leffler }, 101114779705SSam Leffler 101214779705SSam Leffler {.regDmnEnum = APL1, 101314779705SSam Leffler .conformanceTestLimit = FCC, 101414779705SSam Leffler .chan11a = BM1(F4_5745_5825), 101514779705SSam Leffler }, 101614779705SSam Leffler 101714779705SSam Leffler {.regDmnEnum = APL2, 101814779705SSam Leffler .conformanceTestLimit = FCC, 101914779705SSam Leffler .chan11a = BM1(F1_5745_5805), 102014779705SSam Leffler }, 102114779705SSam Leffler 102214779705SSam Leffler {.regDmnEnum = APL3, 102314779705SSam Leffler .conformanceTestLimit = FCC, 102414779705SSam Leffler .chan11a = BM2(F1_5280_5320, F2_5745_5805), 102514779705SSam Leffler }, 102614779705SSam Leffler 102714779705SSam Leffler {.regDmnEnum = APL4, 102814779705SSam Leffler .conformanceTestLimit = FCC, 102914779705SSam Leffler .chan11a = BM2(F4_5180_5240, F3_5745_5825), 103014779705SSam Leffler }, 103114779705SSam Leffler 103214779705SSam Leffler {.regDmnEnum = APL5, 103314779705SSam Leffler .conformanceTestLimit = FCC, 103414779705SSam Leffler .chan11a = BM1(F2_5745_5825), 103514779705SSam Leffler }, 103614779705SSam Leffler 103714779705SSam Leffler {.regDmnEnum = APL6, 103814779705SSam Leffler .conformanceTestLimit = ETSI, 103914779705SSam Leffler .dfsMask = DFS_ETSI, 104014779705SSam Leffler .pscan = PSCAN_FCC_T | PSCAN_FCC, 104114779705SSam Leffler .chan11a = BM3(F4_5180_5240, F2_5260_5320, F3_5745_5825), 104214779705SSam Leffler .chan11a_turbo = BM3(T2_5210_5210, T1_5250_5290, T1_5760_5800), 104314779705SSam Leffler }, 104414779705SSam Leffler 104514779705SSam Leffler {.regDmnEnum = APL8, 104614779705SSam Leffler .conformanceTestLimit = ETSI, 104714779705SSam Leffler .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 104814779705SSam Leffler .chan11a = BM2(F6_5260_5320, F4_5745_5825), 104914779705SSam Leffler }, 105014779705SSam Leffler 105114779705SSam Leffler {.regDmnEnum = APL9, 105214779705SSam Leffler .conformanceTestLimit = ETSI, 105314779705SSam Leffler .dfsMask = DFS_ETSI, 105414779705SSam Leffler .pscan = PSCAN_ETSI, 105514779705SSam Leffler .flags = DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, 105614779705SSam Leffler .chan11a = BM3(F1_5180_5320, F1_5500_5620, F3_5745_5805), 105714779705SSam Leffler }, 105814779705SSam Leffler 105914779705SSam Leffler {.regDmnEnum = ETSI1, 106014779705SSam Leffler .conformanceTestLimit = ETSI, 106114779705SSam Leffler .dfsMask = DFS_ETSI, 106214779705SSam Leffler .pscan = PSCAN_ETSI, 106314779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 106414779705SSam Leffler .chan11a = BM3(W2_5180_5240, F2_5260_5320, F2_5500_5700), 106514779705SSam Leffler }, 106614779705SSam Leffler 106714779705SSam Leffler {.regDmnEnum = ETSI2, 106814779705SSam Leffler .conformanceTestLimit = ETSI, 106914779705SSam Leffler .dfsMask = DFS_ETSI, 107014779705SSam Leffler .pscan = PSCAN_ETSI, 107114779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 107214779705SSam Leffler .chan11a = BM1(F3_5180_5240), 107314779705SSam Leffler }, 107414779705SSam Leffler 107514779705SSam Leffler {.regDmnEnum = ETSI3, 107614779705SSam Leffler .conformanceTestLimit = ETSI, 107714779705SSam Leffler .dfsMask = DFS_ETSI, 107814779705SSam Leffler .pscan = PSCAN_ETSI, 107914779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 108014779705SSam Leffler .chan11a = BM2(W2_5180_5240, F2_5260_5320), 108114779705SSam Leffler }, 108214779705SSam Leffler 108314779705SSam Leffler {.regDmnEnum = ETSI4, 108414779705SSam Leffler .conformanceTestLimit = ETSI, 108514779705SSam Leffler .dfsMask = DFS_ETSI, 108614779705SSam Leffler .pscan = PSCAN_ETSI, 108714779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 108814779705SSam Leffler .chan11a = BM2(F3_5180_5240, F1_5260_5320), 108914779705SSam Leffler }, 109014779705SSam Leffler 109114779705SSam Leffler {.regDmnEnum = ETSI5, 109214779705SSam Leffler .conformanceTestLimit = ETSI, 109314779705SSam Leffler .dfsMask = DFS_ETSI, 109414779705SSam Leffler .pscan = PSCAN_ETSI, 109514779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 109614779705SSam Leffler .chan11a = BM1(F1_5180_5240), 109714779705SSam Leffler }, 109814779705SSam Leffler 109914779705SSam Leffler {.regDmnEnum = ETSI6, 110014779705SSam Leffler .conformanceTestLimit = ETSI, 110114779705SSam Leffler .dfsMask = DFS_ETSI, 110214779705SSam Leffler .pscan = PSCAN_ETSI, 110314779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 110414779705SSam Leffler .chan11a = BM3(F5_5180_5240, F1_5260_5280, F3_5500_5700), 110514779705SSam Leffler }, 110614779705SSam Leffler 110714779705SSam Leffler {.regDmnEnum = FCC1, 110814779705SSam Leffler .conformanceTestLimit = FCC, 110914779705SSam Leffler .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 111014779705SSam Leffler .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 111114779705SSam Leffler .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 111214779705SSam Leffler }, 111314779705SSam Leffler 111414779705SSam Leffler {.regDmnEnum = FCC2, 111514779705SSam Leffler .conformanceTestLimit = FCC, 111614779705SSam Leffler .chan11a = BM3(F6_5180_5240, F5_5260_5320, F6_5745_5825), 111714779705SSam Leffler .chan11a_dyn_turbo = BM3(T2_5200_5240, T1_5280_5280, T1_5765_5805), 111814779705SSam Leffler }, 111914779705SSam Leffler 112014779705SSam Leffler {.regDmnEnum = FCC3, 112114779705SSam Leffler .conformanceTestLimit = FCC, 112214779705SSam Leffler .dfsMask = DFS_FCC3, 112314779705SSam Leffler .pscan = PSCAN_FCC | PSCAN_FCC_T, 112414779705SSam Leffler .chan11a = BM4(F2_5180_5240, 112514779705SSam Leffler F3_5260_5320, 112614779705SSam Leffler F1_5500_5700, 112714779705SSam Leffler F5_5745_5825), 112814779705SSam Leffler .chan11a_turbo = BM4(T1_5210_5210, 112914779705SSam Leffler T1_5250_5250, 113014779705SSam Leffler T1_5290_5290, 113114779705SSam Leffler T2_5760_5800), 113214779705SSam Leffler .chan11a_dyn_turbo = BM3(T1_5200_5240, T2_5280_5280, T1_5540_5660), 113314779705SSam Leffler }, 113414779705SSam Leffler 113514779705SSam Leffler {.regDmnEnum = FCC4, 113614779705SSam Leffler .conformanceTestLimit = FCC, 113714779705SSam Leffler .dfsMask = DFS_FCC3, 113814779705SSam Leffler .pscan = PSCAN_FCC | PSCAN_FCC_T, 113914779705SSam Leffler .chan11a = BM1(F1_4950_4980), 114014779705SSam Leffler .chan11a_half = BM1(F1_4945_4985), 114114779705SSam Leffler .chan11a_quarter = BM1(F1_4942_4987), 114214779705SSam Leffler }, 114314779705SSam Leffler 114414779705SSam Leffler /* FCC1 w/ 1/2 and 1/4 width channels */ 114514779705SSam Leffler {.regDmnEnum = FCC5, 114614779705SSam Leffler .conformanceTestLimit = FCC, 114714779705SSam Leffler .chan11a = BM3(F2_5180_5240, F4_5260_5320, F5_5745_5825), 114814779705SSam Leffler .chan11a_turbo = BM3(T1_5210_5210, T2_5250_5290, T2_5760_5800), 114914779705SSam Leffler .chan11a_dyn_turbo = BM3(T1_5200_5240, T1_5280_5280, T1_5765_5805), 115014779705SSam Leffler .chan11a_half = BM3(F7_5180_5240, F7_5260_5320, F9_5745_5825), 115114779705SSam Leffler .chan11a_quarter = BM3(F8_5180_5240, F8_5260_5320,F10_5745_5825), 115214779705SSam Leffler }, 115314779705SSam Leffler 115414779705SSam Leffler {.regDmnEnum = MKK1, 115514779705SSam Leffler .conformanceTestLimit = MKK, 115614779705SSam Leffler .pscan = PSCAN_MKK1, 115714779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 115814779705SSam Leffler .chan11a = BM1(F1_5170_5230), 115914779705SSam Leffler }, 116014779705SSam Leffler 116114779705SSam Leffler {.regDmnEnum = MKK2, 116214779705SSam Leffler .conformanceTestLimit = MKK, 116314779705SSam Leffler .pscan = PSCAN_MKK2, 116414779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 116514779705SSam Leffler .chan11a = BM3(F1_4920_4980, F1_5040_5080, F1_5170_5230), 116614779705SSam Leffler .chan11a_half = BM4(F1_4915_4925, 116714779705SSam Leffler F1_4935_4945, 116814779705SSam Leffler F1_5035_5040, 116914779705SSam Leffler F1_5055_5055), 117014779705SSam Leffler }, 117114779705SSam Leffler 117214779705SSam Leffler /* UNI-1 even */ 117314779705SSam Leffler {.regDmnEnum = MKK3, 117414779705SSam Leffler .conformanceTestLimit = MKK, 117514779705SSam Leffler .pscan = PSCAN_MKK3, 117614779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 117714779705SSam Leffler .chan11a = BM1(F4_5180_5240), 117814779705SSam Leffler }, 117914779705SSam Leffler 118014779705SSam Leffler /* UNI-1 even + UNI-2 */ 118114779705SSam Leffler {.regDmnEnum = MKK4, 118214779705SSam Leffler .conformanceTestLimit = MKK, 118314779705SSam Leffler .dfsMask = DFS_MKK4, 118414779705SSam Leffler .pscan = PSCAN_MKK3, 118514779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 118614779705SSam Leffler .chan11a = BM2(F4_5180_5240, F2_5260_5320), 118714779705SSam Leffler }, 118814779705SSam Leffler 118914779705SSam Leffler /* UNI-1 even + UNI-2 + mid-band */ 119014779705SSam Leffler {.regDmnEnum = MKK5, 119114779705SSam Leffler .conformanceTestLimit = MKK, 119214779705SSam Leffler .dfsMask = DFS_MKK4, 119314779705SSam Leffler .pscan = PSCAN_MKK3, 119414779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 119514779705SSam Leffler .chan11a = BM3(F4_5180_5240, F2_5260_5320, F4_5500_5700), 119614779705SSam Leffler }, 119714779705SSam Leffler 119814779705SSam Leffler /* UNI-1 odd + even */ 119914779705SSam Leffler {.regDmnEnum = MKK6, 120014779705SSam Leffler .conformanceTestLimit = MKK, 120114779705SSam Leffler .pscan = PSCAN_MKK1, 120214779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 120314779705SSam Leffler .chan11a = BM2(F2_5170_5230, F4_5180_5240), 120414779705SSam Leffler }, 120514779705SSam Leffler 120614779705SSam Leffler /* UNI-1 odd + UNI-1 even + UNI-2 */ 120714779705SSam Leffler {.regDmnEnum = MKK7, 120814779705SSam Leffler .conformanceTestLimit = MKK, 120914779705SSam Leffler .dfsMask = DFS_MKK4, 121014779705SSam Leffler .pscan = PSCAN_MKK1 | PSCAN_MKK3, 121114779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 121214779705SSam Leffler .chan11a = BM3(F1_5170_5230, F4_5180_5240, F2_5260_5320), 121314779705SSam Leffler }, 121414779705SSam Leffler 121514779705SSam Leffler /* UNI-1 odd + UNI-1 even + UNI-2 + mid-band */ 121614779705SSam Leffler {.regDmnEnum = MKK8, 121714779705SSam Leffler .conformanceTestLimit = MKK, 121814779705SSam Leffler .dfsMask = DFS_MKK4, 121914779705SSam Leffler .pscan = PSCAN_MKK1 | PSCAN_MKK3, 122014779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 122114779705SSam Leffler .chan11a = BM4(F1_5170_5230, 122214779705SSam Leffler F4_5180_5240, 122314779705SSam Leffler F2_5260_5320, 122414779705SSam Leffler F4_5500_5700), 122514779705SSam Leffler }, 122614779705SSam Leffler 122714779705SSam Leffler /* UNI-1 even + 4.9 GHZ */ 122814779705SSam Leffler {.regDmnEnum = MKK9, 122914779705SSam Leffler .conformanceTestLimit = MKK, 123014779705SSam Leffler .pscan = PSCAN_MKK3, 123114779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 123214779705SSam Leffler .chan11a = BM7(F1_4915_4925, 123314779705SSam Leffler F1_4935_4945, 123414779705SSam Leffler F1_4920_4980, 123514779705SSam Leffler F1_5035_5040, 123614779705SSam Leffler F1_5055_5055, 123714779705SSam Leffler F1_5040_5080, 123814779705SSam Leffler F4_5180_5240), 123914779705SSam Leffler }, 124014779705SSam Leffler 124114779705SSam Leffler /* UNI-1 even + UNI-2 + 4.9 GHZ */ 124214779705SSam Leffler {.regDmnEnum = MKK10, 124314779705SSam Leffler .conformanceTestLimit = MKK, 124414779705SSam Leffler .dfsMask = DFS_MKK4, 124514779705SSam Leffler .pscan = PSCAN_MKK3, 124614779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 124714779705SSam Leffler .chan11a = BM8(F1_4915_4925, 124814779705SSam Leffler F1_4935_4945, 124914779705SSam Leffler F1_4920_4980, 125014779705SSam Leffler F1_5035_5040, 125114779705SSam Leffler F1_5055_5055, 125214779705SSam Leffler F1_5040_5080, 125314779705SSam Leffler F4_5180_5240, 125414779705SSam Leffler F2_5260_5320), 125514779705SSam Leffler }, 125614779705SSam Leffler 125714779705SSam Leffler /* Defined here to use when 2G channels are authorised for country K2 */ 125814779705SSam Leffler {.regDmnEnum = APLD, 125914779705SSam Leffler .conformanceTestLimit = NO_CTL, 126014779705SSam Leffler .chan11b = BM2(F2_2312_2372,F2_2412_2472), 126114779705SSam Leffler .chan11g = BM2(G2_2312_2372,G2_2412_2472), 126214779705SSam Leffler }, 126314779705SSam Leffler 126414779705SSam Leffler {.regDmnEnum = ETSIA, 126514779705SSam Leffler .conformanceTestLimit = NO_CTL, 126614779705SSam Leffler .pscan = PSCAN_ETSIA, 126714779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 126814779705SSam Leffler .chan11b = BM1(F1_2457_2472), 126914779705SSam Leffler .chan11g = BM1(G1_2457_2472), 127014779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 127114779705SSam Leffler }, 127214779705SSam Leffler 127314779705SSam Leffler {.regDmnEnum = ETSIB, 127414779705SSam Leffler .conformanceTestLimit = ETSI, 127514779705SSam Leffler .pscan = PSCAN_ETSIB, 127614779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 127714779705SSam Leffler .chan11b = BM1(F1_2432_2442), 127814779705SSam Leffler .chan11g = BM1(G1_2432_2442), 127914779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 128014779705SSam Leffler }, 128114779705SSam Leffler 128214779705SSam Leffler {.regDmnEnum = ETSIC, 128314779705SSam Leffler .conformanceTestLimit = ETSI, 128414779705SSam Leffler .pscan = PSCAN_ETSIC, 128514779705SSam Leffler .flags = DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, 128614779705SSam Leffler .chan11b = BM1(F3_2412_2472), 128714779705SSam Leffler .chan11g = BM1(G3_2412_2472), 128814779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 128914779705SSam Leffler }, 129014779705SSam Leffler 129114779705SSam Leffler {.regDmnEnum = FCCA, 129214779705SSam Leffler .conformanceTestLimit = FCC, 129314779705SSam Leffler .chan11b = BM1(F1_2412_2462), 129414779705SSam Leffler .chan11g = BM1(G1_2412_2462), 129514779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437), 129614779705SSam Leffler }, 129714779705SSam Leffler 129814779705SSam Leffler /* FCCA w/ 1/2 and 1/4 width channels */ 129914779705SSam Leffler {.regDmnEnum = FCCB, 130014779705SSam Leffler .conformanceTestLimit = FCC, 130114779705SSam Leffler .chan11b = BM1(F1_2412_2462), 130214779705SSam Leffler .chan11g = BM1(G1_2412_2462), 130314779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437), 130414779705SSam Leffler .chan11g_half = BM1(G3_2412_2462), 130514779705SSam Leffler .chan11g_quarter = BM1(G4_2412_2462), 130614779705SSam Leffler }, 130714779705SSam Leffler 130814779705SSam Leffler {.regDmnEnum = MKKA, 130914779705SSam Leffler .conformanceTestLimit = MKK, 131014779705SSam Leffler .pscan = PSCAN_MKKA | PSCAN_MKKA_G 131114779705SSam Leffler | PSCAN_MKKA1 | PSCAN_MKKA1_G 131214779705SSam Leffler | PSCAN_MKKA2 | PSCAN_MKKA2_G, 131314779705SSam Leffler .flags = DISALLOW_ADHOC_11A_TURB, 131414779705SSam Leffler .chan11b = BM3(F2_2412_2462, F1_2467_2472, F2_2484_2484), 131514779705SSam Leffler .chan11g = BM2(G2_2412_2462, G1_2467_2472), 131614779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 131714779705SSam Leffler }, 131814779705SSam Leffler 131914779705SSam Leffler {.regDmnEnum = MKKC, 132014779705SSam Leffler .conformanceTestLimit = MKK, 132114779705SSam Leffler .chan11b = BM1(F2_2412_2472), 132214779705SSam Leffler .chan11g = BM1(G2_2412_2472), 132314779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 132414779705SSam Leffler }, 132514779705SSam Leffler 132614779705SSam Leffler {.regDmnEnum = WORLD, 132714779705SSam Leffler .conformanceTestLimit = ETSI, 132814779705SSam Leffler .chan11b = BM1(F2_2412_2472), 132914779705SSam Leffler .chan11g = BM1(G2_2412_2472), 133014779705SSam Leffler .chan11g_turbo = BM1(T2_2437_2437) 133114779705SSam Leffler }, 133214779705SSam Leffler 133314779705SSam Leffler {.regDmnEnum = WOR0_WORLD, 133414779705SSam Leffler .conformanceTestLimit = NO_CTL, 133514779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 133614779705SSam Leffler .pscan = PSCAN_WWR, 133714779705SSam Leffler .flags = ADHOC_PER_11D, 133814779705SSam Leffler .chan11a = BM5(W1_5260_5320, 133914779705SSam Leffler W1_5180_5240, 134014779705SSam Leffler W1_5170_5230, 134114779705SSam Leffler W1_5745_5825, 134214779705SSam Leffler W1_5500_5700), 134314779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 134414779705SSam Leffler WT1_5290_5290, 134514779705SSam Leffler WT1_5760_5800), 134614779705SSam Leffler .chan11b = BM8(W1_2412_2412, 134714779705SSam Leffler W1_2437_2442, 134814779705SSam Leffler W1_2462_2462, 134914779705SSam Leffler W1_2472_2472, 135014779705SSam Leffler W1_2417_2432, 135114779705SSam Leffler W1_2447_2457, 135214779705SSam Leffler W1_2467_2467, 135314779705SSam Leffler W1_2484_2484), 135414779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 135514779705SSam Leffler WG1_2437_2442, 135614779705SSam Leffler WG1_2462_2462, 135714779705SSam Leffler WG1_2472_2472, 135814779705SSam Leffler WG1_2417_2432, 135914779705SSam Leffler WG1_2447_2457, 136014779705SSam Leffler WG1_2467_2467), 136114779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437) 136214779705SSam Leffler }, 136314779705SSam Leffler 136414779705SSam Leffler {.regDmnEnum = WOR01_WORLD, 136514779705SSam Leffler .conformanceTestLimit = NO_CTL, 136614779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 136714779705SSam Leffler .pscan = PSCAN_WWR, 136814779705SSam Leffler .flags = ADHOC_PER_11D, 136914779705SSam Leffler .chan11a = BM5(W1_5260_5320, 137014779705SSam Leffler W1_5180_5240, 137114779705SSam Leffler W1_5170_5230, 137214779705SSam Leffler W1_5745_5825, 137314779705SSam Leffler W1_5500_5700), 137414779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 137514779705SSam Leffler WT1_5290_5290, 137614779705SSam Leffler WT1_5760_5800), 137714779705SSam Leffler .chan11b = BM5(W1_2412_2412, 137814779705SSam Leffler W1_2437_2442, 137914779705SSam Leffler W1_2462_2462, 138014779705SSam Leffler W1_2417_2432, 138114779705SSam Leffler W1_2447_2457), 138214779705SSam Leffler .chan11g = BM5(WG1_2412_2412, 138314779705SSam Leffler WG1_2437_2442, 138414779705SSam Leffler WG1_2462_2462, 138514779705SSam Leffler WG1_2417_2432, 138614779705SSam Leffler WG1_2447_2457), 138714779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 138814779705SSam Leffler 138914779705SSam Leffler {.regDmnEnum = WOR02_WORLD, 139014779705SSam Leffler .conformanceTestLimit = NO_CTL, 139114779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 139214779705SSam Leffler .pscan = PSCAN_WWR, 139314779705SSam Leffler .flags = ADHOC_PER_11D, 139414779705SSam Leffler .chan11a = BM5(W1_5260_5320, 139514779705SSam Leffler W1_5180_5240, 139614779705SSam Leffler W1_5170_5230, 139714779705SSam Leffler W1_5745_5825, 139814779705SSam Leffler W1_5500_5700), 139914779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 140014779705SSam Leffler WT1_5290_5290, 140114779705SSam Leffler WT1_5760_5800), 140214779705SSam Leffler .chan11b = BM7(W1_2412_2412, 140314779705SSam Leffler W1_2437_2442, 140414779705SSam Leffler W1_2462_2462, 140514779705SSam Leffler W1_2472_2472, 140614779705SSam Leffler W1_2417_2432, 140714779705SSam Leffler W1_2447_2457, 140814779705SSam Leffler W1_2467_2467), 140914779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 141014779705SSam Leffler WG1_2437_2442, 141114779705SSam Leffler WG1_2462_2462, 141214779705SSam Leffler WG1_2472_2472, 141314779705SSam Leffler WG1_2417_2432, 141414779705SSam Leffler WG1_2447_2457, 141514779705SSam Leffler WG1_2467_2467), 141614779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 141714779705SSam Leffler 141814779705SSam Leffler {.regDmnEnum = EU1_WORLD, 141914779705SSam Leffler .conformanceTestLimit = NO_CTL, 142014779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 142114779705SSam Leffler .pscan = PSCAN_WWR, 142214779705SSam Leffler .flags = ADHOC_PER_11D, 142314779705SSam Leffler .chan11a = BM5(W1_5260_5320, 142414779705SSam Leffler W1_5180_5240, 142514779705SSam Leffler W1_5170_5230, 142614779705SSam Leffler W1_5745_5825, 142714779705SSam Leffler W1_5500_5700), 142814779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 142914779705SSam Leffler WT1_5290_5290, 143014779705SSam Leffler WT1_5760_5800), 143114779705SSam Leffler .chan11b = BM7(W1_2412_2412, 143214779705SSam Leffler W1_2437_2442, 143314779705SSam Leffler W1_2462_2462, 143414779705SSam Leffler W2_2472_2472, 143514779705SSam Leffler W1_2417_2432, 143614779705SSam Leffler W1_2447_2457, 143714779705SSam Leffler W2_2467_2467), 143814779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 143914779705SSam Leffler WG1_2437_2442, 144014779705SSam Leffler WG1_2462_2462, 144114779705SSam Leffler WG2_2472_2472, 144214779705SSam Leffler WG1_2417_2432, 144314779705SSam Leffler WG1_2447_2457, 144414779705SSam Leffler WG2_2467_2467), 144514779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 144614779705SSam Leffler 144714779705SSam Leffler {.regDmnEnum = WOR1_WORLD, 144814779705SSam Leffler .conformanceTestLimit = NO_CTL, 144914779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 145014779705SSam Leffler .pscan = PSCAN_WWR, 145159efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 145214779705SSam Leffler .chan11a = BM5(W1_5260_5320, 145314779705SSam Leffler W1_5180_5240, 145414779705SSam Leffler W1_5170_5230, 145514779705SSam Leffler W1_5745_5825, 145614779705SSam Leffler W1_5500_5700), 145714779705SSam Leffler .chan11b = BM8(W1_2412_2412, 145814779705SSam Leffler W1_2437_2442, 145914779705SSam Leffler W1_2462_2462, 146014779705SSam Leffler W1_2472_2472, 146114779705SSam Leffler W1_2417_2432, 146214779705SSam Leffler W1_2447_2457, 146314779705SSam Leffler W1_2467_2467, 146414779705SSam Leffler W1_2484_2484), 146514779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 146614779705SSam Leffler WG1_2437_2442, 146714779705SSam Leffler WG1_2462_2462, 146814779705SSam Leffler WG1_2472_2472, 146914779705SSam Leffler WG1_2417_2432, 147014779705SSam Leffler WG1_2447_2457, 147114779705SSam Leffler WG1_2467_2467), 147214779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437) 147314779705SSam Leffler }, 147414779705SSam Leffler 147514779705SSam Leffler {.regDmnEnum = WOR2_WORLD, 147614779705SSam Leffler .conformanceTestLimit = NO_CTL, 147714779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 147814779705SSam Leffler .pscan = PSCAN_WWR, 147959efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 148014779705SSam Leffler .chan11a = BM5(W1_5260_5320, 148114779705SSam Leffler W1_5180_5240, 148214779705SSam Leffler W1_5170_5230, 148314779705SSam Leffler W1_5745_5825, 148414779705SSam Leffler W1_5500_5700), 148514779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 148614779705SSam Leffler WT1_5290_5290, 148714779705SSam Leffler WT1_5760_5800), 148814779705SSam Leffler .chan11b = BM8(W1_2412_2412, 148914779705SSam Leffler W1_2437_2442, 149014779705SSam Leffler W1_2462_2462, 149114779705SSam Leffler W1_2472_2472, 149214779705SSam Leffler W1_2417_2432, 149314779705SSam Leffler W1_2447_2457, 149414779705SSam Leffler W1_2467_2467, 149514779705SSam Leffler W1_2484_2484), 149614779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 149714779705SSam Leffler WG1_2437_2442, 149814779705SSam Leffler WG1_2462_2462, 149914779705SSam Leffler WG1_2472_2472, 150014779705SSam Leffler WG1_2417_2432, 150114779705SSam Leffler WG1_2447_2457, 150214779705SSam Leffler WG1_2467_2467), 150314779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 150414779705SSam Leffler 150514779705SSam Leffler {.regDmnEnum = WOR3_WORLD, 150614779705SSam Leffler .conformanceTestLimit = NO_CTL, 150714779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 150814779705SSam Leffler .pscan = PSCAN_WWR, 150914779705SSam Leffler .flags = ADHOC_PER_11D, 151014779705SSam Leffler .chan11a = BM4(W1_5260_5320, 151114779705SSam Leffler W1_5180_5240, 151214779705SSam Leffler W1_5170_5230, 151314779705SSam Leffler W1_5745_5825), 151414779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 151514779705SSam Leffler WT1_5290_5290, 151614779705SSam Leffler WT1_5760_5800), 151714779705SSam Leffler .chan11b = BM7(W1_2412_2412, 151814779705SSam Leffler W1_2437_2442, 151914779705SSam Leffler W1_2462_2462, 152014779705SSam Leffler W1_2472_2472, 152114779705SSam Leffler W1_2417_2432, 152214779705SSam Leffler W1_2447_2457, 152314779705SSam Leffler W1_2467_2467), 152414779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 152514779705SSam Leffler WG1_2437_2442, 152614779705SSam Leffler WG1_2462_2462, 152714779705SSam Leffler WG1_2472_2472, 152814779705SSam Leffler WG1_2417_2432, 152914779705SSam Leffler WG1_2447_2457, 153014779705SSam Leffler WG1_2467_2467), 153114779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 153214779705SSam Leffler 153314779705SSam Leffler {.regDmnEnum = WOR4_WORLD, 153414779705SSam Leffler .conformanceTestLimit = NO_CTL, 153514779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 153614779705SSam Leffler .pscan = PSCAN_WWR, 153759efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 153814779705SSam Leffler .chan11a = BM4(W2_5260_5320, 153914779705SSam Leffler W2_5180_5240, 154014779705SSam Leffler F2_5745_5805, 154114779705SSam Leffler W2_5825_5825), 154214779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 154314779705SSam Leffler WT1_5290_5290, 154414779705SSam Leffler WT1_5760_5800), 154514779705SSam Leffler .chan11b = BM5(W1_2412_2412, 154614779705SSam Leffler W1_2437_2442, 154714779705SSam Leffler W1_2462_2462, 154814779705SSam Leffler W1_2417_2432, 154914779705SSam Leffler W1_2447_2457), 155014779705SSam Leffler .chan11g = BM5(WG1_2412_2412, 155114779705SSam Leffler WG1_2437_2442, 155214779705SSam Leffler WG1_2462_2462, 155314779705SSam Leffler WG1_2417_2432, 155414779705SSam Leffler WG1_2447_2457), 155514779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 155614779705SSam Leffler 155714779705SSam Leffler {.regDmnEnum = WOR5_ETSIC, 155814779705SSam Leffler .conformanceTestLimit = NO_CTL, 155914779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 156014779705SSam Leffler .pscan = PSCAN_WWR, 156159efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 156214779705SSam Leffler .chan11a = BM3(W1_5260_5320, W2_5180_5240, F6_5745_5825), 156314779705SSam Leffler .chan11b = BM7(W1_2412_2412, 156414779705SSam Leffler W1_2437_2442, 156514779705SSam Leffler W1_2462_2462, 156614779705SSam Leffler W2_2472_2472, 156714779705SSam Leffler W1_2417_2432, 156814779705SSam Leffler W1_2447_2457, 156914779705SSam Leffler W2_2467_2467), 157014779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 157114779705SSam Leffler WG1_2437_2442, 157214779705SSam Leffler WG1_2462_2462, 157314779705SSam Leffler WG2_2472_2472, 157414779705SSam Leffler WG1_2417_2432, 157514779705SSam Leffler WG1_2447_2457, 157614779705SSam Leffler WG2_2467_2467), 157714779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 157814779705SSam Leffler 157914779705SSam Leffler {.regDmnEnum = WOR9_WORLD, 158014779705SSam Leffler .conformanceTestLimit = NO_CTL, 158114779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 158214779705SSam Leffler .pscan = PSCAN_WWR, 158359efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 158414779705SSam Leffler .chan11a = BM4(W1_5260_5320, 158514779705SSam Leffler W1_5180_5240, 158614779705SSam Leffler W1_5745_5825, 158714779705SSam Leffler W1_5500_5700), 158814779705SSam Leffler .chan11a_turbo = BM3(WT1_5210_5250, 158914779705SSam Leffler WT1_5290_5290, 159014779705SSam Leffler WT1_5760_5800), 159114779705SSam Leffler .chan11b = BM5(W1_2412_2412, 159214779705SSam Leffler W1_2437_2442, 159314779705SSam Leffler W1_2462_2462, 159414779705SSam Leffler W1_2417_2432, 159514779705SSam Leffler W1_2447_2457), 159614779705SSam Leffler .chan11g = BM5(WG1_2412_2412, 159714779705SSam Leffler WG1_2437_2442, 159814779705SSam Leffler WG1_2462_2462, 159914779705SSam Leffler WG1_2417_2432, 160014779705SSam Leffler WG1_2447_2457), 160114779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 160214779705SSam Leffler 160314779705SSam Leffler {.regDmnEnum = WORA_WORLD, 160414779705SSam Leffler .conformanceTestLimit = NO_CTL, 160514779705SSam Leffler .dfsMask = DFS_FCC3 | DFS_ETSI, 160614779705SSam Leffler .pscan = PSCAN_WWR, 160759efa8b5SSam Leffler .flags = DISALLOW_ADHOC_11A, 160814779705SSam Leffler .chan11a = BM4(W1_5260_5320, 160914779705SSam Leffler W1_5180_5240, 161014779705SSam Leffler W1_5745_5825, 161114779705SSam Leffler W1_5500_5700), 161214779705SSam Leffler .chan11b = BM7(W1_2412_2412, 161314779705SSam Leffler W1_2437_2442, 161414779705SSam Leffler W1_2462_2462, 161514779705SSam Leffler W1_2472_2472, 161614779705SSam Leffler W1_2417_2432, 161714779705SSam Leffler W1_2447_2457, 161814779705SSam Leffler W1_2467_2467), 161914779705SSam Leffler .chan11g = BM7(WG1_2412_2412, 162014779705SSam Leffler WG1_2437_2442, 162114779705SSam Leffler WG1_2462_2462, 162214779705SSam Leffler WG1_2472_2472, 162314779705SSam Leffler WG1_2417_2432, 162414779705SSam Leffler WG1_2447_2457, 162514779705SSam Leffler WG1_2467_2467), 162614779705SSam Leffler .chan11g_turbo = BM1(T3_2437_2437)}, 162714779705SSam Leffler 16289c9dad53SRui Paulo {.regDmnEnum = WORB_WORLD, 16299c9dad53SRui Paulo .conformanceTestLimit = NO_CTL, 16309c9dad53SRui Paulo .dfsMask = DFS_FCC3 | DFS_ETSI, 16319c9dad53SRui Paulo .pscan = PSCAN_WWR, 16329c9dad53SRui Paulo .flags = DISALLOW_ADHOC_11A, 16339c9dad53SRui Paulo .chan11a = BM4(W1_5260_5320, 16349c9dad53SRui Paulo W1_5180_5240, 16359c9dad53SRui Paulo W1_5745_5825, 16369c9dad53SRui Paulo W1_5500_5700), 16379c9dad53SRui Paulo .chan11b = BM7(W1_2412_2412, 16389c9dad53SRui Paulo W1_2437_2442, 16399c9dad53SRui Paulo W1_2462_2462, 16409c9dad53SRui Paulo W1_2472_2472, 16419c9dad53SRui Paulo W1_2417_2432, 16429c9dad53SRui Paulo W1_2447_2457, 16439c9dad53SRui Paulo W1_2467_2467), 16449c9dad53SRui Paulo .chan11g = BM7(WG1_2412_2412, 16459c9dad53SRui Paulo WG1_2437_2442, 16469c9dad53SRui Paulo WG1_2462_2462, 16479c9dad53SRui Paulo WG1_2472_2472, 16489c9dad53SRui Paulo WG1_2417_2432, 16499c9dad53SRui Paulo WG1_2447_2457, 16509c9dad53SRui Paulo WG1_2467_2467), 16519c9dad53SRui Paulo .chan11g_turbo = BM1(T3_2437_2437)}, 16529c9dad53SRui Paulo 165314779705SSam Leffler {.regDmnEnum = NULL1, 165414779705SSam Leffler .conformanceTestLimit = NO_CTL, 165514779705SSam Leffler } 165614779705SSam Leffler }; 165714779705SSam Leffler 165814779705SSam Leffler static const struct cmode modes[] = { 165959efa8b5SSam Leffler { HAL_MODE_TURBO, IEEE80211_CHAN_ST }, 166059efa8b5SSam Leffler { HAL_MODE_11A, IEEE80211_CHAN_A }, 166159efa8b5SSam Leffler { HAL_MODE_11B, IEEE80211_CHAN_B }, 166259efa8b5SSam Leffler { HAL_MODE_11G, IEEE80211_CHAN_G }, 166359efa8b5SSam Leffler { HAL_MODE_11G_TURBO, IEEE80211_CHAN_108G }, 166459efa8b5SSam Leffler { HAL_MODE_11A_TURBO, IEEE80211_CHAN_108A }, 166559efa8b5SSam Leffler { HAL_MODE_11A_QUARTER_RATE, 166659efa8b5SSam Leffler IEEE80211_CHAN_A | IEEE80211_CHAN_QUARTER }, 166759efa8b5SSam Leffler { HAL_MODE_11A_HALF_RATE, 166859efa8b5SSam Leffler IEEE80211_CHAN_A | IEEE80211_CHAN_HALF }, 166959efa8b5SSam Leffler { HAL_MODE_11G_QUARTER_RATE, 167059efa8b5SSam Leffler IEEE80211_CHAN_G | IEEE80211_CHAN_QUARTER }, 167159efa8b5SSam Leffler { HAL_MODE_11G_HALF_RATE, 167259efa8b5SSam Leffler IEEE80211_CHAN_G | IEEE80211_CHAN_HALF }, 1673b2e73ce9SSam Leffler { HAL_MODE_11NG_HT20, IEEE80211_CHAN_G | IEEE80211_CHAN_HT20 }, 167459efa8b5SSam Leffler { HAL_MODE_11NG_HT40PLUS, 1675b2e73ce9SSam Leffler IEEE80211_CHAN_G | IEEE80211_CHAN_HT40U }, 167659efa8b5SSam Leffler { HAL_MODE_11NG_HT40MINUS, 1677b2e73ce9SSam Leffler IEEE80211_CHAN_G | IEEE80211_CHAN_HT40D }, 1678b2e73ce9SSam Leffler { HAL_MODE_11NA_HT20, IEEE80211_CHAN_A | IEEE80211_CHAN_HT20 }, 167959efa8b5SSam Leffler { HAL_MODE_11NA_HT40PLUS, 1680b2e73ce9SSam Leffler IEEE80211_CHAN_A | IEEE80211_CHAN_HT40U }, 168159efa8b5SSam Leffler { HAL_MODE_11NA_HT40MINUS, 1682b2e73ce9SSam Leffler IEEE80211_CHAN_A | IEEE80211_CHAN_HT40D }, 168314779705SSam Leffler }; 168414779705SSam Leffler 168559efa8b5SSam Leffler static OS_INLINE uint16_t 168614779705SSam Leffler getEepromRD(struct ath_hal *ah) 168714779705SSam Leffler { 168814779705SSam Leffler return AH_PRIVATE(ah)->ah_currentRD &~ WORLDWIDE_ROAMING_FLAG; 168914779705SSam Leffler } 169014779705SSam Leffler 169114779705SSam Leffler /* 169214779705SSam Leffler * Test to see if the bitmask array is all zeros 169314779705SSam Leffler */ 169414779705SSam Leffler static HAL_BOOL 169514779705SSam Leffler isChanBitMaskZero(const uint64_t *bitmask) 169614779705SSam Leffler { 169714779705SSam Leffler #if BMLEN > 2 169814779705SSam Leffler #error "add more cases" 169914779705SSam Leffler #endif 170014779705SSam Leffler #if BMLEN > 1 170114779705SSam Leffler if (bitmask[1] != 0) 170214779705SSam Leffler return AH_FALSE; 170314779705SSam Leffler #endif 170414779705SSam Leffler return (bitmask[0] == 0); 170514779705SSam Leffler } 170614779705SSam Leffler 170714779705SSam Leffler /* 170814779705SSam Leffler * Return whether or not the regulatory domain/country in EEPROM 170914779705SSam Leffler * is acceptable. 171014779705SSam Leffler */ 171114779705SSam Leffler static HAL_BOOL 171214779705SSam Leffler isEepromValid(struct ath_hal *ah) 171314779705SSam Leffler { 171414779705SSam Leffler uint16_t rd = getEepromRD(ah); 171514779705SSam Leffler int i; 171614779705SSam Leffler 171714779705SSam Leffler if (rd & COUNTRY_ERD_FLAG) { 171814779705SSam Leffler uint16_t cc = rd &~ COUNTRY_ERD_FLAG; 171914779705SSam Leffler for (i = 0; i < N(allCountries); i++) 172014779705SSam Leffler if (allCountries[i].countryCode == cc) 172114779705SSam Leffler return AH_TRUE; 172214779705SSam Leffler } else { 172314779705SSam Leffler for (i = 0; i < N(regDomainPairs); i++) 172414779705SSam Leffler if (regDomainPairs[i].regDmnEnum == rd) 172514779705SSam Leffler return AH_TRUE; 172614779705SSam Leffler } 172714779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 172814779705SSam Leffler "%s: invalid regulatory domain/country code 0x%x\n", __func__, rd); 172914779705SSam Leffler return AH_FALSE; 173014779705SSam Leffler } 173114779705SSam Leffler 173214779705SSam Leffler /* 173314779705SSam Leffler * Find the pointer to the country element in the country table 173414779705SSam Leffler * corresponding to the country code 173514779705SSam Leffler */ 173614779705SSam Leffler static COUNTRY_CODE_TO_ENUM_RD* 173714779705SSam Leffler findCountry(HAL_CTRY_CODE countryCode) 173814779705SSam Leffler { 173914779705SSam Leffler int i; 174014779705SSam Leffler 174114779705SSam Leffler for (i = 0; i < N(allCountries); i++) { 174214779705SSam Leffler if (allCountries[i].countryCode == countryCode) 174314779705SSam Leffler return &allCountries[i]; 174414779705SSam Leffler } 174559efa8b5SSam Leffler return AH_NULL; 174659efa8b5SSam Leffler } 174759efa8b5SSam Leffler 174859efa8b5SSam Leffler static REG_DOMAIN * 174959efa8b5SSam Leffler findRegDmn(int regDmn) 175059efa8b5SSam Leffler { 175159efa8b5SSam Leffler int i; 175259efa8b5SSam Leffler 175359efa8b5SSam Leffler for (i = 0; i < N(regDomains); i++) { 175459efa8b5SSam Leffler if (regDomains[i].regDmnEnum == regDmn) 175559efa8b5SSam Leffler return ®Domains[i]; 175659efa8b5SSam Leffler } 175759efa8b5SSam Leffler return AH_NULL; 175859efa8b5SSam Leffler } 175959efa8b5SSam Leffler 176059efa8b5SSam Leffler static REG_DMN_PAIR_MAPPING * 176159efa8b5SSam Leffler findRegDmnPair(int regDmnPair) 176259efa8b5SSam Leffler { 176359efa8b5SSam Leffler int i; 176459efa8b5SSam Leffler 176559efa8b5SSam Leffler if (regDmnPair != NO_ENUMRD) { 176659efa8b5SSam Leffler for (i = 0; i < N(regDomainPairs); i++) { 176759efa8b5SSam Leffler if (regDomainPairs[i].regDmnEnum == regDmnPair) 176859efa8b5SSam Leffler return ®DomainPairs[i]; 176959efa8b5SSam Leffler } 177059efa8b5SSam Leffler } 177159efa8b5SSam Leffler return AH_NULL; 177214779705SSam Leffler } 177314779705SSam Leffler 177414779705SSam Leffler /* 177514779705SSam Leffler * Calculate a default country based on the EEPROM setting. 177614779705SSam Leffler */ 177714779705SSam Leffler static HAL_CTRY_CODE 177814779705SSam Leffler getDefaultCountry(struct ath_hal *ah) 177914779705SSam Leffler { 178059efa8b5SSam Leffler REG_DMN_PAIR_MAPPING *regpair; 178114779705SSam Leffler uint16_t rd; 178214779705SSam Leffler 178314779705SSam Leffler rd = getEepromRD(ah); 178414779705SSam Leffler if (rd & COUNTRY_ERD_FLAG) { 178559efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 178614779705SSam Leffler uint16_t cc = rd & ~COUNTRY_ERD_FLAG; 178714779705SSam Leffler country = findCountry(cc); 178814779705SSam Leffler if (country != AH_NULL) 178914779705SSam Leffler return cc; 179014779705SSam Leffler } 179114779705SSam Leffler /* 179214779705SSam Leffler * Check reg domains that have only one country 179314779705SSam Leffler */ 179459efa8b5SSam Leffler regpair = findRegDmnPair(rd); 179559efa8b5SSam Leffler return (regpair != AH_NULL) ? regpair->singleCC : CTRY_DEFAULT; 179614779705SSam Leffler } 179714779705SSam Leffler 179814779705SSam Leffler static HAL_BOOL 179914779705SSam Leffler IS_BIT_SET(int bit, const uint64_t bitmask[]) 180014779705SSam Leffler { 180114779705SSam Leffler int byteOffset, bitnum; 180214779705SSam Leffler uint64_t val; 180314779705SSam Leffler 180414779705SSam Leffler byteOffset = bit/64; 180514779705SSam Leffler bitnum = bit - byteOffset*64; 180614779705SSam Leffler val = ((uint64_t) 1) << bitnum; 180714779705SSam Leffler return (bitmask[byteOffset] & val) != 0; 180814779705SSam Leffler } 180914779705SSam Leffler 181059efa8b5SSam Leffler static HAL_STATUS 181159efa8b5SSam Leffler getregstate(struct ath_hal *ah, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 181259efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD **pcountry, 181359efa8b5SSam Leffler REG_DOMAIN **prd2GHz, REG_DOMAIN **prd5GHz) 181414779705SSam Leffler { 181559efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 181659efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 181714779705SSam Leffler 181859efa8b5SSam Leffler if (cc == CTRY_DEFAULT && regDmn == SKU_NONE) { 181914779705SSam Leffler /* 182014779705SSam Leffler * Validate the EEPROM setting and setup defaults 182114779705SSam Leffler */ 182214779705SSam Leffler if (!isEepromValid(ah)) { 182314779705SSam Leffler /* 182414779705SSam Leffler * Don't return any channels if the EEPROM has an 182514779705SSam Leffler * invalid regulatory domain/country code setting. 182614779705SSam Leffler */ 182714779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 182814779705SSam Leffler "%s: invalid EEPROM contents\n",__func__); 182959efa8b5SSam Leffler return HAL_EEBADREG; 183014779705SSam Leffler } 183114779705SSam Leffler 183259efa8b5SSam Leffler cc = getDefaultCountry(ah); 183359efa8b5SSam Leffler country = findCountry(cc); 183414779705SSam Leffler if (country == AH_NULL) { 183514779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 183659efa8b5SSam Leffler "NULL Country!, cc %d\n", cc); 183759efa8b5SSam Leffler return HAL_EEBADCC; 183814779705SSam Leffler } 183959efa8b5SSam Leffler regDmn = country->regDmnEnum; 184059efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: EEPROM cc %u rd 0x%x\n", 184159efa8b5SSam Leffler __func__, cc, regDmn); 184259efa8b5SSam Leffler 184359efa8b5SSam Leffler if (country->countryCode == CTRY_DEFAULT) { 184459efa8b5SSam Leffler /* 184559efa8b5SSam Leffler * Check EEPROM; SKU may be for a country, single 184659efa8b5SSam Leffler * domain, or multiple domains (WWR). 184759efa8b5SSam Leffler */ 184859efa8b5SSam Leffler uint16_t rdnum = getEepromRD(ah); 184959efa8b5SSam Leffler if ((rdnum & COUNTRY_ERD_FLAG) == 0 && 185059efa8b5SSam Leffler (findRegDmn(rdnum) != AH_NULL || 185159efa8b5SSam Leffler findRegDmnPair(rdnum) != AH_NULL)) { 185259efa8b5SSam Leffler regDmn = rdnum; 185314779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 185459efa8b5SSam Leffler "%s: EEPROM rd 0x%x\n", __func__, rdnum); 185559efa8b5SSam Leffler } 185659efa8b5SSam Leffler } 185759efa8b5SSam Leffler } else { 185859efa8b5SSam Leffler country = findCountry(cc); 185959efa8b5SSam Leffler if (country == AH_NULL) { 186059efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 186159efa8b5SSam Leffler "unknown country, cc %d\n", cc); 186259efa8b5SSam Leffler return HAL_EINVAL; 186359efa8b5SSam Leffler } 186459efa8b5SSam Leffler if (regDmn == SKU_NONE) 186559efa8b5SSam Leffler regDmn = country->regDmnEnum; 186659efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u rd 0x%x\n", 186759efa8b5SSam Leffler __func__, cc, regDmn); 186814779705SSam Leffler } 186914779705SSam Leffler 187059efa8b5SSam Leffler /* 187159efa8b5SSam Leffler * Setup per-band state. 187259efa8b5SSam Leffler */ 187359efa8b5SSam Leffler if ((regDmn & MULTI_DOMAIN_MASK) == 0) { 187459efa8b5SSam Leffler REG_DMN_PAIR_MAPPING *regpair = findRegDmnPair(regDmn); 187559efa8b5SSam Leffler if (regpair == AH_NULL) { 187659efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 187759efa8b5SSam Leffler "%s: no reg domain pair %u for country %u\n", 187859efa8b5SSam Leffler __func__, regDmn, country->countryCode); 187959efa8b5SSam Leffler return HAL_EINVAL; 188059efa8b5SSam Leffler } 188159efa8b5SSam Leffler rd5GHz = findRegDmn(regpair->regDmn5GHz); 188259efa8b5SSam Leffler if (rd5GHz == AH_NULL) { 188359efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 188459efa8b5SSam Leffler "%s: no 5GHz reg domain %u for country %u\n", 188559efa8b5SSam Leffler __func__, regpair->regDmn5GHz, country->countryCode); 188659efa8b5SSam Leffler return HAL_EINVAL; 188759efa8b5SSam Leffler } 188859efa8b5SSam Leffler rd2GHz = findRegDmn(regpair->regDmn2GHz); 188959efa8b5SSam Leffler if (rd2GHz == AH_NULL) { 189059efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 189159efa8b5SSam Leffler "%s: no 2GHz reg domain %u for country %u\n", 189259efa8b5SSam Leffler __func__, regpair->regDmn2GHz, country->countryCode); 189359efa8b5SSam Leffler return HAL_EINVAL; 189459efa8b5SSam Leffler } 189559efa8b5SSam Leffler } else { 189659efa8b5SSam Leffler rd5GHz = rd2GHz = findRegDmn(regDmn); 189759efa8b5SSam Leffler if (rd2GHz == AH_NULL) { 189859efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 189959efa8b5SSam Leffler "%s: no unitary reg domain %u for country %u\n", 190059efa8b5SSam Leffler __func__, regDmn, country->countryCode); 190159efa8b5SSam Leffler return HAL_EINVAL; 190259efa8b5SSam Leffler } 190359efa8b5SSam Leffler } 190459efa8b5SSam Leffler if (pcountry != AH_NULL) 190559efa8b5SSam Leffler *pcountry = country; 190659efa8b5SSam Leffler *prd2GHz = rd2GHz; 190759efa8b5SSam Leffler *prd5GHz = rd5GHz; 190859efa8b5SSam Leffler return HAL_OK; 190959efa8b5SSam Leffler } 191014779705SSam Leffler 191159efa8b5SSam Leffler /* 191259efa8b5SSam Leffler * Construct the channel list for the specified regulatory config. 191359efa8b5SSam Leffler */ 191459efa8b5SSam Leffler static HAL_STATUS 191559efa8b5SSam Leffler getchannels(struct ath_hal *ah, 191659efa8b5SSam Leffler struct ieee80211_channel chans[], u_int maxchans, int *nchans, 191759efa8b5SSam Leffler u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 191859efa8b5SSam Leffler HAL_BOOL enableExtendedChannels, 191959efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD **pcountry, 192059efa8b5SSam Leffler REG_DOMAIN **prd2GHz, REG_DOMAIN **prd5GHz) 192159efa8b5SSam Leffler { 192259efa8b5SSam Leffler #define CHANNEL_HALF_BW 10 192359efa8b5SSam Leffler #define CHANNEL_QUARTER_BW 5 192459efa8b5SSam Leffler #define HAL_MODE_11A_ALL \ 192559efa8b5SSam Leffler (HAL_MODE_11A | HAL_MODE_11A_TURBO | HAL_MODE_TURBO | \ 192659efa8b5SSam Leffler HAL_MODE_11A_QUARTER_RATE | HAL_MODE_11A_HALF_RATE) 192759efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 192859efa8b5SSam Leffler u_int modesAvail; 192959efa8b5SSam Leffler const struct cmode *cm; 193059efa8b5SSam Leffler struct ieee80211_channel *ic; 193159efa8b5SSam Leffler int next, b; 193259efa8b5SSam Leffler HAL_STATUS status; 193359efa8b5SSam Leffler 193459efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u regDmn 0x%x mode 0x%x%s\n", 193559efa8b5SSam Leffler __func__, cc, regDmn, modeSelect, 193659efa8b5SSam Leffler enableExtendedChannels ? " ecm" : ""); 193759efa8b5SSam Leffler 193859efa8b5SSam Leffler status = getregstate(ah, cc, regDmn, pcountry, &rd2GHz, &rd5GHz); 193959efa8b5SSam Leffler if (status != HAL_OK) 194059efa8b5SSam Leffler return status; 194159efa8b5SSam Leffler 194259efa8b5SSam Leffler /* get modes that HW is capable of */ 194359efa8b5SSam Leffler modesAvail = ath_hal_getWirelessModes(ah); 194459efa8b5SSam Leffler /* optimize work below if no 11a channels */ 194559efa8b5SSam Leffler if (isChanBitMaskZero(rd5GHz->chan11a) && 194659efa8b5SSam Leffler (modesAvail & HAL_MODE_11A_ALL)) { 194759efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 194859efa8b5SSam Leffler "%s: disallow all 11a\n", __func__); 194959efa8b5SSam Leffler modesAvail &= ~HAL_MODE_11A_ALL; 195059efa8b5SSam Leffler } 195159efa8b5SSam Leffler 195214779705SSam Leffler next = 0; 195359efa8b5SSam Leffler ic = &chans[0]; 195414779705SSam Leffler for (cm = modes; cm < &modes[N(modes)]; cm++) { 195514779705SSam Leffler uint16_t c, c_hi, c_lo; 195614779705SSam Leffler uint64_t *channelBM = AH_NULL; 195714779705SSam Leffler REG_DMN_FREQ_BAND *fband = AH_NULL,*freqs; 195814779705SSam Leffler int low_adj, hi_adj, channelSep, lastc; 195959efa8b5SSam Leffler uint32_t rdflags; 196059efa8b5SSam Leffler uint64_t dfsMask; 196159efa8b5SSam Leffler uint64_t pscan; 196214779705SSam Leffler 196314779705SSam Leffler if ((cm->mode & modeSelect) == 0) { 196414779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 196514779705SSam Leffler "%s: skip mode 0x%x flags 0x%x\n", 196614779705SSam Leffler __func__, cm->mode, cm->flags); 196714779705SSam Leffler continue; 196814779705SSam Leffler } 196914779705SSam Leffler if ((cm->mode & modesAvail) == 0) { 197014779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 197114779705SSam Leffler "%s: !avail mode 0x%x (0x%x) flags 0x%x\n", 197214779705SSam Leffler __func__, modesAvail, cm->mode, cm->flags); 197314779705SSam Leffler continue; 197414779705SSam Leffler } 197514779705SSam Leffler if (!ath_hal_getChannelEdges(ah, cm->flags, &c_lo, &c_hi)) { 197614779705SSam Leffler /* channel not supported by hardware, skip it */ 197714779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 197814779705SSam Leffler "%s: channels 0x%x not supported by hardware\n", 197914779705SSam Leffler __func__,cm->flags); 198014779705SSam Leffler continue; 198114779705SSam Leffler } 198214779705SSam Leffler switch (cm->mode) { 198314779705SSam Leffler case HAL_MODE_TURBO: 198459efa8b5SSam Leffler case HAL_MODE_11A_TURBO: 198559efa8b5SSam Leffler rdflags = rd5GHz->flags; 198659efa8b5SSam Leffler dfsMask = rd5GHz->dfsMask; 198759efa8b5SSam Leffler pscan = rd5GHz->pscan; 198859efa8b5SSam Leffler if (cm->mode == HAL_MODE_TURBO) 198959efa8b5SSam Leffler channelBM = rd5GHz->chan11a_turbo; 199059efa8b5SSam Leffler else 199159efa8b5SSam Leffler channelBM = rd5GHz->chan11a_dyn_turbo; 199214779705SSam Leffler freqs = ®Dmn5GhzTurboFreq[0]; 199359efa8b5SSam Leffler break; 199459efa8b5SSam Leffler case HAL_MODE_11G_TURBO: 199559efa8b5SSam Leffler rdflags = rd2GHz->flags; 199659efa8b5SSam Leffler dfsMask = rd2GHz->dfsMask; 199759efa8b5SSam Leffler pscan = rd2GHz->pscan; 199859efa8b5SSam Leffler channelBM = rd2GHz->chan11g_turbo; 199959efa8b5SSam Leffler freqs = ®Dmn2Ghz11gTurboFreq[0]; 200014779705SSam Leffler break; 200114779705SSam Leffler case HAL_MODE_11A: 200214779705SSam Leffler case HAL_MODE_11A_HALF_RATE: 200314779705SSam Leffler case HAL_MODE_11A_QUARTER_RATE: 200414779705SSam Leffler case HAL_MODE_11NA_HT20: 200514779705SSam Leffler case HAL_MODE_11NA_HT40PLUS: 200614779705SSam Leffler case HAL_MODE_11NA_HT40MINUS: 200759efa8b5SSam Leffler rdflags = rd5GHz->flags; 200859efa8b5SSam Leffler dfsMask = rd5GHz->dfsMask; 200959efa8b5SSam Leffler pscan = rd5GHz->pscan; 201014779705SSam Leffler if (cm->mode == HAL_MODE_11A_HALF_RATE) 201159efa8b5SSam Leffler channelBM = rd5GHz->chan11a_half; 201214779705SSam Leffler else if (cm->mode == HAL_MODE_11A_QUARTER_RATE) 201359efa8b5SSam Leffler channelBM = rd5GHz->chan11a_quarter; 201414779705SSam Leffler else 201559efa8b5SSam Leffler channelBM = rd5GHz->chan11a; 201614779705SSam Leffler freqs = ®Dmn5GhzFreq[0]; 201714779705SSam Leffler break; 201814779705SSam Leffler case HAL_MODE_11B: 201914779705SSam Leffler case HAL_MODE_11G: 202014779705SSam Leffler case HAL_MODE_11G_HALF_RATE: 202114779705SSam Leffler case HAL_MODE_11G_QUARTER_RATE: 202214779705SSam Leffler case HAL_MODE_11NG_HT20: 202314779705SSam Leffler case HAL_MODE_11NG_HT40PLUS: 202414779705SSam Leffler case HAL_MODE_11NG_HT40MINUS: 202559efa8b5SSam Leffler rdflags = rd2GHz->flags; 202659efa8b5SSam Leffler dfsMask = rd2GHz->dfsMask; 202759efa8b5SSam Leffler pscan = rd2GHz->pscan; 202814779705SSam Leffler if (cm->mode == HAL_MODE_11G_HALF_RATE) 202959efa8b5SSam Leffler channelBM = rd2GHz->chan11g_half; 203014779705SSam Leffler else if (cm->mode == HAL_MODE_11G_QUARTER_RATE) 203159efa8b5SSam Leffler channelBM = rd2GHz->chan11g_quarter; 203259efa8b5SSam Leffler else if (cm->mode == HAL_MODE_11B) 203359efa8b5SSam Leffler channelBM = rd2GHz->chan11b; 203414779705SSam Leffler else 203559efa8b5SSam Leffler channelBM = rd2GHz->chan11g; 203659efa8b5SSam Leffler if (cm->mode == HAL_MODE_11B) 203759efa8b5SSam Leffler freqs = ®Dmn2GhzFreq[0]; 203859efa8b5SSam Leffler else 203914779705SSam Leffler freqs = ®Dmn2Ghz11gFreq[0]; 204014779705SSam Leffler break; 204114779705SSam Leffler default: 204214779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 204314779705SSam Leffler "%s: Unkonwn HAL mode 0x%x\n", __func__, cm->mode); 204414779705SSam Leffler continue; 204514779705SSam Leffler } 204614779705SSam Leffler if (isChanBitMaskZero(channelBM)) 204714779705SSam Leffler continue; 204814779705SSam Leffler /* 204914779705SSam Leffler * Setup special handling for HT40 channels; e.g. 205014779705SSam Leffler * 5G HT40 channels require 40Mhz channel separation. 205114779705SSam Leffler */ 205214779705SSam Leffler hi_adj = (cm->mode == HAL_MODE_11NA_HT40PLUS || 205314779705SSam Leffler cm->mode == HAL_MODE_11NG_HT40PLUS) ? -20 : 0; 205414779705SSam Leffler low_adj = (cm->mode == HAL_MODE_11NA_HT40MINUS || 205514779705SSam Leffler cm->mode == HAL_MODE_11NG_HT40MINUS) ? 20 : 0; 205614779705SSam Leffler channelSep = (cm->mode == HAL_MODE_11NA_HT40PLUS || 205714779705SSam Leffler cm->mode == HAL_MODE_11NA_HT40MINUS) ? 40 : 0; 205814779705SSam Leffler 205914779705SSam Leffler for (b = 0; b < 64*BMLEN; b++) { 206014779705SSam Leffler if (!IS_BIT_SET(b, channelBM)) 206114779705SSam Leffler continue; 206214779705SSam Leffler fband = &freqs[b]; 206314779705SSam Leffler lastc = 0; 206414779705SSam Leffler 206514779705SSam Leffler for (c = fband->lowChannel + low_adj; 206614779705SSam Leffler c <= fband->highChannel + hi_adj; 206714779705SSam Leffler c += fband->channelSep) { 206814779705SSam Leffler if (!(c_lo <= c && c <= c_hi)) { 206914779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 207014779705SSam Leffler "%s: c %u out of range [%u..%u]\n", 207114779705SSam Leffler __func__, c, c_lo, c_hi); 207214779705SSam Leffler continue; 207314779705SSam Leffler } 207414779705SSam Leffler if (next >= maxchans){ 207514779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 207614779705SSam Leffler "%s: too many channels for channel table\n", 207714779705SSam Leffler __func__); 207814779705SSam Leffler goto done; 207914779705SSam Leffler } 208014779705SSam Leffler if ((fband->usePassScan & IS_ECM_CHAN) && 208114779705SSam Leffler !enableExtendedChannels) { 208214779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 208359efa8b5SSam Leffler "skip ecm channel\n"); 208414779705SSam Leffler continue; 208514779705SSam Leffler } 208659efa8b5SSam Leffler if ((fband->useDfs & dfsMask) && 208759efa8b5SSam Leffler (cm->flags & IEEE80211_CHAN_HT40)) { 208859efa8b5SSam Leffler /* NB: DFS and HT40 don't mix */ 208914779705SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 209059efa8b5SSam Leffler "skip HT40 chan, DFS required\n"); 209114779705SSam Leffler continue; 209214779705SSam Leffler } 209314779705SSam Leffler /* 209414779705SSam Leffler * Make sure that channel separation 209514779705SSam Leffler * meets the requirement. 209614779705SSam Leffler */ 209714779705SSam Leffler if (lastc && channelSep && 209814779705SSam Leffler (c-lastc) < channelSep) 209914779705SSam Leffler continue; 210014779705SSam Leffler lastc = c; 210114779705SSam Leffler 210259efa8b5SSam Leffler OS_MEMZERO(ic, sizeof(*ic)); 210359efa8b5SSam Leffler ic->ic_freq = c; 210459efa8b5SSam Leffler ic->ic_flags = cm->flags; 210559efa8b5SSam Leffler ic->ic_maxregpower = fband->powerDfs; 210659efa8b5SSam Leffler ath_hal_getpowerlimits(ah, ic); 210759efa8b5SSam Leffler ic->ic_maxantgain = fband->antennaMax; 210859efa8b5SSam Leffler if (fband->usePassScan & pscan) 210959efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_PASSIVE; 211059efa8b5SSam Leffler if (fband->useDfs & dfsMask) 211159efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_DFS; 211259efa8b5SSam Leffler if (IEEE80211_IS_CHAN_5GHZ(ic) && 211359efa8b5SSam Leffler (rdflags & DISALLOW_ADHOC_11A)) 211459efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_NOADHOC; 211559efa8b5SSam Leffler if (IEEE80211_IS_CHAN_TURBO(ic) && 211659efa8b5SSam Leffler (rdflags & DISALLOW_ADHOC_11A_TURB)) 211759efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_NOADHOC; 211859efa8b5SSam Leffler if (rdflags & NO_HOSTAP) 211959efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_NOHOSTAP; 212059efa8b5SSam Leffler if (rdflags & LIMIT_FRAME_4MS) 212159efa8b5SSam Leffler ic->ic_flags |= IEEE80211_CHAN_4MSXMIT; 212259efa8b5SSam Leffler if (rdflags & NEED_NFC) 212359efa8b5SSam Leffler ic->ic_flags |= CHANNEL_NFCREQUIRED; 212459efa8b5SSam Leffler 212559efa8b5SSam Leffler ic++, next++; 212614779705SSam Leffler } 212714779705SSam Leffler } 212814779705SSam Leffler } 212914779705SSam Leffler done: 213014779705SSam Leffler *nchans = next; 213159efa8b5SSam Leffler /* NB: pcountry set above by getregstate */ 213259efa8b5SSam Leffler if (prd2GHz != AH_NULL) 213359efa8b5SSam Leffler *prd2GHz = rd2GHz; 213459efa8b5SSam Leffler if (prd5GHz != AH_NULL) 213559efa8b5SSam Leffler *prd5GHz = rd5GHz; 213659efa8b5SSam Leffler return HAL_OK; 213759efa8b5SSam Leffler #undef HAL_MODE_11A_ALL 213814779705SSam Leffler #undef CHANNEL_HALF_BW 213914779705SSam Leffler #undef CHANNEL_QUARTER_BW 214014779705SSam Leffler } 214114779705SSam Leffler 214214779705SSam Leffler /* 214359efa8b5SSam Leffler * Retrieve a channel list without affecting runtime state. 214414779705SSam Leffler */ 214559efa8b5SSam Leffler HAL_STATUS 214659efa8b5SSam Leffler ath_hal_getchannels(struct ath_hal *ah, 214759efa8b5SSam Leffler struct ieee80211_channel chans[], u_int maxchans, int *nchans, 214859efa8b5SSam Leffler u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 214959efa8b5SSam Leffler HAL_BOOL enableExtendedChannels) 215014779705SSam Leffler { 215159efa8b5SSam Leffler return getchannels(ah, chans, maxchans, nchans, modeSelect, 215259efa8b5SSam Leffler cc, regDmn, enableExtendedChannels, AH_NULL, AH_NULL, AH_NULL); 215359efa8b5SSam Leffler } 215414779705SSam Leffler 215514779705SSam Leffler /* 215659efa8b5SSam Leffler * Handle frequency mapping from 900Mhz range to 2.4GHz range 215759efa8b5SSam Leffler * for GSM radios. This is done when we need the h/w frequency 215859efa8b5SSam Leffler * and the channel is marked IEEE80211_CHAN_GSM. 215914779705SSam Leffler */ 216059efa8b5SSam Leffler static int 216159efa8b5SSam Leffler ath_hal_mapgsm(int sku, int freq) 216259efa8b5SSam Leffler { 216359efa8b5SSam Leffler if (sku == SKU_XR9) 216459efa8b5SSam Leffler return 1520 + freq; 216559efa8b5SSam Leffler if (sku == SKU_GZ901) 216659efa8b5SSam Leffler return 1544 + freq; 216759efa8b5SSam Leffler if (sku == SKU_SR9) 216859efa8b5SSam Leffler return 3344 - freq; 216959efa8b5SSam Leffler HALDEBUG(AH_NULL, HAL_DEBUG_ANY, 217059efa8b5SSam Leffler "%s: cannot map freq %u unknown gsm sku %u\n", 217159efa8b5SSam Leffler __func__, freq, sku); 217259efa8b5SSam Leffler return freq; 217314779705SSam Leffler } 217414779705SSam Leffler 217559efa8b5SSam Leffler /* 217659efa8b5SSam Leffler * Setup the internal/private channel state given a table of 217759efa8b5SSam Leffler * net80211 channels. We collapse entries for the same frequency 217859efa8b5SSam Leffler * and record the frequency for doing noise floor processing 217959efa8b5SSam Leffler * where we don't have net80211 channel context. 218059efa8b5SSam Leffler */ 218159efa8b5SSam Leffler static HAL_BOOL 218259efa8b5SSam Leffler assignPrivateChannels(struct ath_hal *ah, 218359efa8b5SSam Leffler struct ieee80211_channel chans[], int nchans, int sku) 218459efa8b5SSam Leffler { 218559efa8b5SSam Leffler HAL_CHANNEL_INTERNAL *ic; 218659efa8b5SSam Leffler int i, j, next, freq; 218759efa8b5SSam Leffler 218859efa8b5SSam Leffler next = 0; 218959efa8b5SSam Leffler for (i = 0; i < nchans; i++) { 219059efa8b5SSam Leffler struct ieee80211_channel *c = &chans[i]; 219159efa8b5SSam Leffler for (j = i-1; j >= 0; j--) 219259efa8b5SSam Leffler if (chans[j].ic_freq == c->ic_freq) { 219359efa8b5SSam Leffler c->ic_devdata = chans[j].ic_devdata; 219459efa8b5SSam Leffler break; 219559efa8b5SSam Leffler } 219659efa8b5SSam Leffler if (j < 0) { 219759efa8b5SSam Leffler /* new entry, assign a private channel entry */ 219859efa8b5SSam Leffler if (next >= N(AH_PRIVATE(ah)->ah_channels)) { 219959efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, 220050d5ad0eSSam Leffler "%s: too many channels, max %zu\n", 220159efa8b5SSam Leffler __func__, N(AH_PRIVATE(ah)->ah_channels)); 220259efa8b5SSam Leffler return AH_FALSE; 220359efa8b5SSam Leffler } 220459efa8b5SSam Leffler /* 220559efa8b5SSam Leffler * Handle frequency mapping for 900MHz devices. 220659efa8b5SSam Leffler * The hardware uses 2.4GHz frequencies that are 220759efa8b5SSam Leffler * down-converted. The 802.11 layer uses the 220859efa8b5SSam Leffler * true frequencies. 220959efa8b5SSam Leffler */ 221059efa8b5SSam Leffler freq = IEEE80211_IS_CHAN_GSM(c) ? 221159efa8b5SSam Leffler ath_hal_mapgsm(sku, c->ic_freq) : c->ic_freq; 221259efa8b5SSam Leffler 221359efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, 221459efa8b5SSam Leffler "%s: private[%3u] %u/0x%x -> channel %u\n", 221559efa8b5SSam Leffler __func__, next, c->ic_freq, c->ic_flags, freq); 221659efa8b5SSam Leffler 221759efa8b5SSam Leffler ic = &AH_PRIVATE(ah)->ah_channels[next]; 221859efa8b5SSam Leffler /* 221959efa8b5SSam Leffler * NB: This clears privFlags which means ancillary 222059efa8b5SSam Leffler * code like ANI and IQ calibration will be 222159efa8b5SSam Leffler * restarted and re-setup any per-channel state. 222259efa8b5SSam Leffler */ 222359efa8b5SSam Leffler OS_MEMZERO(ic, sizeof(*ic)); 222459efa8b5SSam Leffler ic->channel = freq; 222559efa8b5SSam Leffler c->ic_devdata = next; 222659efa8b5SSam Leffler next++; 222759efa8b5SSam Leffler } 222859efa8b5SSam Leffler } 222959efa8b5SSam Leffler AH_PRIVATE(ah)->ah_nchan = next; 223059efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, "%s: %u public, %u private channels\n", 223159efa8b5SSam Leffler __func__, nchans, next); 223259efa8b5SSam Leffler return AH_TRUE; 223359efa8b5SSam Leffler } 223459efa8b5SSam Leffler 223559efa8b5SSam Leffler /* 223659efa8b5SSam Leffler * Setup the channel list based on the information in the EEPROM. 223759efa8b5SSam Leffler */ 223859efa8b5SSam Leffler HAL_STATUS 223959efa8b5SSam Leffler ath_hal_init_channels(struct ath_hal *ah, 224059efa8b5SSam Leffler struct ieee80211_channel chans[], u_int maxchans, int *nchans, 224159efa8b5SSam Leffler u_int modeSelect, HAL_CTRY_CODE cc, HAL_REG_DOMAIN regDmn, 224259efa8b5SSam Leffler HAL_BOOL enableExtendedChannels) 224359efa8b5SSam Leffler { 224459efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 224559efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 224659efa8b5SSam Leffler HAL_STATUS status; 224759efa8b5SSam Leffler 224859efa8b5SSam Leffler status = getchannels(ah, chans, maxchans, nchans, modeSelect, 224959efa8b5SSam Leffler cc, regDmn, enableExtendedChannels, &country, &rd2GHz, &rd5GHz); 225059efa8b5SSam Leffler if (status == HAL_OK && 225159efa8b5SSam Leffler assignPrivateChannels(ah, chans, *nchans, AH_PRIVATE(ah)->ah_currentRD)) { 225259efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz; 225359efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz; 225459efa8b5SSam Leffler 225559efa8b5SSam Leffler ah->ah_countryCode = country->countryCode; 225659efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n", 225759efa8b5SSam Leffler __func__, ah->ah_countryCode); 225859efa8b5SSam Leffler } else 225959efa8b5SSam Leffler status = HAL_EINVAL; 226059efa8b5SSam Leffler return status; 226159efa8b5SSam Leffler } 226259efa8b5SSam Leffler 226359efa8b5SSam Leffler /* 226459efa8b5SSam Leffler * Set the channel list. 226559efa8b5SSam Leffler */ 226659efa8b5SSam Leffler HAL_STATUS 226759efa8b5SSam Leffler ath_hal_set_channels(struct ath_hal *ah, 226859efa8b5SSam Leffler struct ieee80211_channel chans[], int nchans, 226959efa8b5SSam Leffler HAL_CTRY_CODE cc, HAL_REG_DOMAIN rd) 227059efa8b5SSam Leffler { 227159efa8b5SSam Leffler COUNTRY_CODE_TO_ENUM_RD *country; 227259efa8b5SSam Leffler REG_DOMAIN *rd5GHz, *rd2GHz; 227359efa8b5SSam Leffler HAL_STATUS status; 227459efa8b5SSam Leffler 227559efa8b5SSam Leffler switch (rd) { 227659efa8b5SSam Leffler case SKU_SR9: 227759efa8b5SSam Leffler case SKU_XR9: 227859efa8b5SSam Leffler case SKU_GZ901: 227959efa8b5SSam Leffler /* 228059efa8b5SSam Leffler * Map 900MHz sku's. The frequencies will be mapped 228159efa8b5SSam Leffler * according to the sku to compensate for the down-converter. 228259efa8b5SSam Leffler * We use the FCC for these sku's as the mapped channel 228359efa8b5SSam Leffler * list is known compatible (will need to change if/when 228459efa8b5SSam Leffler * vendors do different mapping in different locales). 228559efa8b5SSam Leffler */ 228659efa8b5SSam Leffler status = getregstate(ah, CTRY_DEFAULT, SKU_FCC, 228759efa8b5SSam Leffler &country, &rd2GHz, &rd5GHz); 228859efa8b5SSam Leffler break; 228959efa8b5SSam Leffler default: 229059efa8b5SSam Leffler status = getregstate(ah, cc, rd, 229159efa8b5SSam Leffler &country, &rd2GHz, &rd5GHz); 229259efa8b5SSam Leffler rd = AH_PRIVATE(ah)->ah_currentRD; 229359efa8b5SSam Leffler break; 229459efa8b5SSam Leffler } 229559efa8b5SSam Leffler if (status == HAL_OK && assignPrivateChannels(ah, chans, nchans, rd)) { 229659efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz; 229759efa8b5SSam Leffler AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz; 229859efa8b5SSam Leffler 229959efa8b5SSam Leffler ah->ah_countryCode = country->countryCode; 230059efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n", 230159efa8b5SSam Leffler __func__, ah->ah_countryCode); 230259efa8b5SSam Leffler } else 230359efa8b5SSam Leffler status = HAL_EINVAL; 230459efa8b5SSam Leffler return status; 230559efa8b5SSam Leffler } 230659efa8b5SSam Leffler 230759efa8b5SSam Leffler #ifdef AH_DEBUG 230859efa8b5SSam Leffler /* 230959efa8b5SSam Leffler * Return the internal channel corresponding to a public channel. 231059efa8b5SSam Leffler * NB: normally this routine is inline'd (see ah_internal.h) 231159efa8b5SSam Leffler */ 231259efa8b5SSam Leffler HAL_CHANNEL_INTERNAL * 231359efa8b5SSam Leffler ath_hal_checkchannel(struct ath_hal *ah, const struct ieee80211_channel *c) 231459efa8b5SSam Leffler { 231559efa8b5SSam Leffler HAL_CHANNEL_INTERNAL *cc = &AH_PRIVATE(ah)->ah_channels[c->ic_devdata]; 231659efa8b5SSam Leffler 231759efa8b5SSam Leffler if (c->ic_devdata < AH_PRIVATE(ah)->ah_nchan && 231859efa8b5SSam Leffler (c->ic_freq == cc->channel || IEEE80211_IS_CHAN_GSM(c))) 231914779705SSam Leffler return cc; 232059efa8b5SSam Leffler if (c->ic_devdata >= AH_PRIVATE(ah)->ah_nchan) { 232159efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, 232259efa8b5SSam Leffler "%s: bad mapping, devdata %u nchans %u\n", 232359efa8b5SSam Leffler __func__, c->ic_devdata, AH_PRIVATE(ah)->ah_nchan); 232459efa8b5SSam Leffler HALASSERT(c->ic_devdata < AH_PRIVATE(ah)->ah_nchan); 232559efa8b5SSam Leffler } else { 232659efa8b5SSam Leffler HALDEBUG(ah, HAL_DEBUG_ANY, 232759efa8b5SSam Leffler "%s: no match for %u/0x%x devdata %u channel %u\n", 232859efa8b5SSam Leffler __func__, c->ic_freq, c->ic_flags, c->ic_devdata, 232959efa8b5SSam Leffler cc->channel); 233059efa8b5SSam Leffler HALASSERT(c->ic_freq == cc->channel || IEEE80211_IS_CHAN_GSM(c)); 233114779705SSam Leffler } 233214779705SSam Leffler return AH_NULL; 233359efa8b5SSam Leffler } 233459efa8b5SSam Leffler #endif /* AH_DEBUG */ 233559efa8b5SSam Leffler 233659efa8b5SSam Leffler #define isWwrSKU(_ah) \ 233759efa8b5SSam Leffler ((getEepromRD((_ah)) & WORLD_SKU_MASK) == WORLD_SKU_PREFIX || \ 233859efa8b5SSam Leffler getEepromRD(_ah) == WORLD) 233959efa8b5SSam Leffler 234059efa8b5SSam Leffler /* 234159efa8b5SSam Leffler * Return the test group for the specific channel based on 234259efa8b5SSam Leffler * the current regulatory setup. 234359efa8b5SSam Leffler */ 234459efa8b5SSam Leffler u_int 234559efa8b5SSam Leffler ath_hal_getctl(struct ath_hal *ah, const struct ieee80211_channel *c) 234659efa8b5SSam Leffler { 234759efa8b5SSam Leffler u_int ctl; 234859efa8b5SSam Leffler 234959efa8b5SSam Leffler if (AH_PRIVATE(ah)->ah_rd2GHz == AH_PRIVATE(ah)->ah_rd5GHz || 235059efa8b5SSam Leffler (ah->ah_countryCode == CTRY_DEFAULT && isWwrSKU(ah))) 235159efa8b5SSam Leffler ctl = SD_NO_CTL; 235259efa8b5SSam Leffler else if (IEEE80211_IS_CHAN_2GHZ(c)) 235359efa8b5SSam Leffler ctl = AH_PRIVATE(ah)->ah_rd2GHz->conformanceTestLimit; 235459efa8b5SSam Leffler else 235559efa8b5SSam Leffler ctl = AH_PRIVATE(ah)->ah_rd5GHz->conformanceTestLimit; 235659efa8b5SSam Leffler if (IEEE80211_IS_CHAN_B(c)) 235759efa8b5SSam Leffler return ctl | CTL_11B; 235859efa8b5SSam Leffler if (IEEE80211_IS_CHAN_G(c)) 235959efa8b5SSam Leffler return ctl | CTL_11G; 236059efa8b5SSam Leffler if (IEEE80211_IS_CHAN_108G(c)) 236159efa8b5SSam Leffler return ctl | CTL_108G; 236259efa8b5SSam Leffler if (IEEE80211_IS_CHAN_TURBO(c)) 236359efa8b5SSam Leffler return ctl | CTL_TURBO; 236459efa8b5SSam Leffler if (IEEE80211_IS_CHAN_A(c)) 236559efa8b5SSam Leffler return ctl | CTL_11A; 236659efa8b5SSam Leffler return ctl; 236714779705SSam Leffler } 236814779705SSam Leffler 236914779705SSam Leffler /* 237014779705SSam Leffler * Return the max allowed antenna gain and apply any regulatory 237114779705SSam Leffler * domain specific changes. 237214779705SSam Leffler * 237314779705SSam Leffler * NOTE: a negative reduction is possible in RD's that only 237414779705SSam Leffler * measure radiated power (e.g., ETSI) which would increase 237514779705SSam Leffler * that actual conducted output power (though never beyond 237614779705SSam Leffler * the calibrated target power). 237714779705SSam Leffler */ 237814779705SSam Leffler u_int 237959efa8b5SSam Leffler ath_hal_getantennareduction(struct ath_hal *ah, 238059efa8b5SSam Leffler const struct ieee80211_channel *chan, u_int twiceGain) 238114779705SSam Leffler { 238259efa8b5SSam Leffler int8_t antennaMax = twiceGain - chan->ic_maxantgain*2; 238314779705SSam Leffler return (antennaMax < 0) ? 0 : antennaMax; 238414779705SSam Leffler } 2385