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