All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Luis R. Rodriguez" <mcgrof@gmail.com>
To: John Linville <linville@tuxdriver.com>
Cc: linux-wireless@vger.kernel.org,
	Michael Wu <flamingice@sourmilk.net>,
	Johannes Berg <johannes@sipsolutions.net>,
	Daniel Drake <dsd@gentoo.org>,
	Larry Finger <Larry.Finger@lwfinger.net>
Subject: [PATCH 3/5] Wireless: add IEEE-802.11 regualtory domain module
Date: Fri, 21 Sep 2007 17:04:37 -0400	[thread overview]
Message-ID: <20070921210437.GG31768@pogo> (raw)
In-Reply-To: <20070921204606.GD31768@pogo>

[-- Attachment #1: Type: text/plain, Size: 76792 bytes --]

This adds the regulatory domain module. It provides a way to
allocate and construct a regulatory domain based on the current
map. This module provides no enforcement, it just does the actual
building of the regdomain and returns it as defined in ieee80211_regdomains.h

This module depends on the ISO3166-1 module.

Signed-off-by: Luis R. Rodriguez <mcgrof@gmail.com>
---
 include/net/ieee80211_regdomains.h |  196 ++++++++
 net/wireless/Kconfig               |   16 +
 net/wireless/Makefile              |    1 +
 net/wireless/reg_common.h          |  138 ++++++
 net/wireless/regdomains.c          |  751 ++++++++++++++++++++++++++++++
 net/wireless/regulatory_map.h      |  887 ++++++++++++++++++++++++++++++++++++
 6 files changed, 1989 insertions(+), 0 deletions(-)
 create mode 100644 include/net/ieee80211_regdomains.h
 create mode 100644 net/wireless/reg_common.h
 create mode 100644 net/wireless/regdomains.c
 create mode 100644 net/wireless/regulatory_map.h

diff --git a/include/net/ieee80211_regdomains.h b/include/net/ieee80211_regdomains.h
new file mode 100644
index 0000000..adf4de4
--- /dev/null
+++ b/include/net/ieee80211_regdomains.h
@@ -0,0 +1,196 @@
+#ifndef _IEEE80211_REGDOMAIN_H
+#define _IEEE80211_REGDOMAIN_H
+/*
+ * Copyright (C) 2006-2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <net/wireless_common.h>
+#include <net/iso3166-1.h>
+
+#define REGDOMAINS_VERSION "1.0"
+#define REGNAMSIZ		22
+#define REGSBNAMSIZ		30
+
+/* Changing this will change the default regulatory domain
+ * for countries we don't have a map for. Use World as default */
+#define DEFAULT_REG_ISO3166_1   "00"
+
+/* XXX: <net/ieee80211.h> has two band defs bellow */
+#ifndef IEEE80211_24GHZ_BAND
+#define IEEE80211_24GHZ_BAND     (1<<0)
+#define IEEE80211_52GHZ_BAND     (1<<1)
+#endif
+
+#define MAX_NUM_MODE_A_CHANS	220
+#define MAX_NUM_MODE_B_CHANS	26
+#define MAX_NUM_MODE_G_CHANS	26
+
+#define REG_NUM_SUBBANDS	7
+
+/**
+ * struct ieee80211_subband_restrictions - defines a regulatory domain
+ * 	subband restrictions list
+ *
+ * @band: which band we this subband belongs to, could be either IEEE80211_24GHZ_BAND
+ * 	or IEEE80211_52GHZ_BAND
+ * @name: name for this subband.
+ * @min_freq: minimum frequency for this subband, in MHz. This represents the 
+ * 	center of frequency of a channel.
+ * @max_freq: maximum frequency for this subband, in MHz. This represents the 
+ * 	center of frequency of a channel.
+ * @modulation_cap: modulations this subband is capable of handling. This can be
+ *	IEEE80211_RATE_OFDM, IEEE80211_RATE_CCK
+ * @environment_cap: defines indoor/outdoor capability for subband as defined by
+ * 	the 802.11d Country Information element char. This can be 
+ * 	Indoor REG_CAP_INDOOR ('I'), REG_CAP_OUTDOOR ('O'), or both 
+ * 	REG_CAP_INOUT (' ').
+ * @max_antenna_gain: defines the maximum antenna gain set by regulatory 
+ * 	agencies for this subband. This is expressed in dBi, which is 
+ * 	dB relative to isotropic, used to measure antenna gain compared to an
+ * 	isotropic antenna on which radiation is distributed uniformly on the
+ * 	surface of a sphere. This can be used to define mac80211's
+ * 	conf.antenna_max and channel.antenna_max for example.
+ * @max_ir_ptmp: maximum allowed Intentional Radiated power on the transmitter
+ * 	for Point to Multi Points, given in dBm. This applies to stations, 
+ * 	Access Points and PtMP bridges.
+ * @max_ir_ptmp: maximum allowed Intentional Radiated power on the transmitter
+ *	for Point to Point links such as PtP Bridges, given in dBm.
+ * @max_eirp_ptmp: maximum allowed Equivalent Isotropically Radiated Power on 
+ *	the transmitter for Point to Point to Multi Points links, given in dBm
+ * @max_eirp_ptp: maximum allowed Equivalent Isotropically Radiated Power on 
+ *	the transmitter for Point to Point links such as PtP Bridges, given in
+ *	dBm.
+ * @num_channels: number of channels in channel_list.
+ * @channel_list: linked list of all channels on this subband. These are of
+ * 	type @ieee80211_channel
+ *
+ * This structure contains the regualtory power restrictions on this subband 
+ * and has a linked list of all possible channels. Wireless drivers can compute
+ * their maximum allowed TX power as follows:
+ *
+ * Max TX Power = Max EIRP - passive gain of antenna
+ * 
+ * Keep in mind that the passive gain of the standard dipole antenna is approx
+ * 2.2 dBi. You can use this value for most wireless setups. Please note that 
+ * some regulatory domains also have rules to which change the max IR if you 
+ * change the antenna, such as the 1:1 and 3:1 rule for the FCC. For more 
+ * information please refer to the Documentation/ieee80211_regdomains.txt
+ * documentation.
+ */
+struct ieee80211_subband_restrictions {
+	u8 band;
+	char name[REGSBNAMSIZ];
+	u16 min_freq;
+	u16 max_freq;
+	u32 modulation_cap;
+	u8 max_antenna_gain;
+	u8 max_ir_ptmp;
+	u8 max_ir_ptp;
+#define REG_DIPOLE_ANTENNA_GAIN 2
+	u8 max_eirp_ptmp;
+	u8 max_eirp_ptp;
+#define REG_CAP_INDOOR 	'I'
+#define REG_CAP_OUTDOOR	'O'
+#define REG_CAP_INOUT	' '
+	char environment_cap;
+	u8 num_channels;
+	struct list_head channel_list;
+};
+
+/**
+ * struct ieee80211_regdomain - defines a regulatory domain
+ *
+ * @regdomain_id: ID of this regulatory domain. Some come from
+ * 	http://standards.ieee.org/getieee802/download/802.11b-1999_Cor1-2001.pdf
+ * @regdomain_name: name of this regulatory domain.
+ * @list: node, part of band_restrictions_list
+ *
+ * This structure defines a regulatory domain, which consists of channel and
+ * power restrictions. Some regulatory domains come from 
+ * 802.11b-1999_Cor1-2001, the rest are based on Reyk Floeter's ar5k. If 
+ * there is need to add more values here, please add one that is either 
+ * defined in a standard or that many hardware devices have adopted. Also 
+ * note that multiple countries can map to the same @regdomain_id
+ */
+struct ieee80211_regdomain {
+	u32 regdomain_id;
+	char regdomain_name[REGNAMSIZ];
+	struct ieee80211_subband_restrictions subbands[REG_NUM_SUBBANDS];
+};
+
+/**
+ * struct ieee80211_iso3166_reg_map - map of an ISO3166-1 country to a regdomain
+ *
+ * @alpha2: the ISO-3166-1 alpha2 country code string. Example: 'CR' for 
+ * 	Costa Rica.
+ *
+ * @regdomain_id: a regualtory domain ID this country maps to.
+ *
+ * This structure holds the mapping of the country to a specific regulatory
+ * domain. Keep in mind more than one country can map to the same regulatory
+ * domain. The ISO-3166-1 alpha2 country code also happens to be used in the 
+ * 802.11d Country Information Element on the string for the country. It 
+ * should be noted, however, that in that the size of this string, is 
+ * three octects while our string is only 2. The third octet is used to 
+ * indicate Indoor/outdoor capabilities which we set in 
+ * @ieee80211_subband_restrictions environment_cap.
+ */
+struct ieee80211_iso3166_reg_map {
+	char alpha2[ISOCOUNTRYSIZ2];
+	u32 regdomain_id; /* stack-aware value */
+	/* XXX: shall we just use an array? */
+	struct list_head list; /* node, part of iso3166_reg_map_list */
+};
+
+/**
+ * regdomain_mhz2ieee - convert a frequency to an IEEE-80211 channel number
+ * @freq: center of frequency in MHz. We support a range:
+ * 	2412 - 2732 MHz (Channel 1 - 26) in the 2GHz band and 
+ * 	5005 - 6100 MHz (Channel 1 - 220) in the 5GHz band.
+ *
+ * Given a frequency in MHz returns the respective IEEE-80211 channel
+ * number. You are expected to provide the center of freqency in MHz.
+ */
+u16 regdomain_mhz2ieee(u16 freq);
+
+/**
+ * regdomain_ieee2mhz - convert an IEEE-80211 channel number to frequency
+ * @chan: An IEEE-802.11 channel number we support the range:
+ * 	Channel 1 - 26 in the 2GHz band and
+ * 	Channel 1 - 220 in the 5GHz band
+ *
+ * @band: Which band we want the frequency in, could be either 
+ * 	IEEE80211_24GHZ_BAND or IEEE80211_52GHZ_BAND.
+ *
+ * Given an IEEE-802.11 channel number and band returns the respective center
+ * of frequency in MHz.
+ */
+u16 regdomain_ieee2mhz(u16 chan, u8 band);
+
+void print_regdomain(struct ieee80211_regdomain *);
+void print_iso3166_reg_map(void);
+
+int get_ieee80211_regname(u32, char *);
+
+int iso3166_to_reg_exists(char *);
+int iso3166_to_reg(char *, u32 *);
+
+int regdomain_build(u32, struct ieee80211_regdomain **);
+void free_regdomain(struct ieee80211_regdomain *);
+u32 ieee80211_mode_modulation(u8 mode);
+
+#endif /* _IEEE80211_REGDOMAIN_H_ */ 
diff --git a/net/wireless/Kconfig b/net/wireless/Kconfig
index d03cd53..c60ee87 100644
--- a/net/wireless/Kconfig
+++ b/net/wireless/Kconfig
@@ -14,6 +14,22 @@ config NL80211
 
          If unsure, say Y.
 
+config IEEE80211_REGDOMAINS
+	tristate "Central IEEE 802.11 regulatory domain agent"
+	select ISO3166_1
+	---help---
+	 This option enables the a regdomains part of the central
+	 regulatory domain agent for the kernel. If added as a module 
+	 the module will be called regdomains.ko.
+	 
+	 If unsure, you can safely say Y.
+
+config IEEE80211_REGDOMAINS_DBG
+	bool "Enables debugging output for the regulatory domain agent"
+	depends on IEEE80211_REGDOMAINS
+	---help---
+	 This option enables debug for the central regulatory domain agent
+
 config ISO3166_1
 	tristate "ISO 3166-1 support (for 802.11d and regulatory)"
 	---help---
diff --git a/net/wireless/Makefile b/net/wireless/Makefile
index f710044..74c1059 100644
--- a/net/wireless/Makefile
+++ b/net/wireless/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_CFG80211) += cfg80211.o
 cfg80211-y += core.o sysfs.o radiotap.o
 cfg80211-$(CONFIG_NL80211) += nl80211.o
 
+obj-$(CONFIG_IEEE80211_REGDOMAINS) += regdomains.o
 obj-$(CONFIG_ISO3166_1) += iso3166-1.o
diff --git a/net/wireless/reg_common.h b/net/wireless/reg_common.h
new file mode 100644
index 0000000..460761b
--- /dev/null
+++ b/net/wireless/reg_common.h
@@ -0,0 +1,138 @@
+#ifndef _REGULATORY_COMMON_H_
+
+#define REG_2GHZ_MIN	2412	/* 2GHz channel 1 */
+#define REG_2GHZ_MAX	2732	/* 2GHz channel 26 */
+#define REG_5GHZ_MIN	5005	/* 5GHz channel 1 */
+#define REG_5GHZ_MAX	6100	/* 5GHz channel 220 */
+
+#define DMN_NULL_WORLD	0x03 /* World default */
+#define DMN_NULL_ETSIB	0x07
+#define DMN_NULL_ETSIC	0x08
+#define DMN_FCC1_FCCA	0x10
+#define DMN_FCC1_WORLD	0x11
+#define DMN_FCC2_FCCA	0x20
+#define DMN_FCC2_WORLD	0x21
+#define DMN_FCC2_ETSIC	0x22
+#define DMN_FCC3_FCCA	0x3A
+#define DMN_ETSI1_WORLD	0x37
+#define DMN_ETSI3_ETSIA	0x32
+#define DMN_ETSI2_WORLD	0x35
+#define DMN_ETSI3_WORLD	0x36
+#define DMN_ETSI4_WORLD	0x30
+#define DMN_ETSI4_ETSIC	0x38
+#define DMN_ETSI5_WORLD	0x39
+#define DMN_ETSI6_WORLD	0x34
+#define DMN_MKK1_MKKA	0x40
+#define DMN_MKK1_MKKB	0x41
+#define DMN_APL4_WORLD	0x42
+#define DMN_MKK2_MKKA	0x43
+#define DMN_APL2_WORLD	0x45
+#define DMN_APL2_APLC	0x46
+#define DMN_APL3_WORLD	0x47
+#define DMN_MKK1_FCCA	0x48
+#define DMN_APL2_APLD	0x49
+#define DMN_MKK1_MKKA1	0x4A
+#define DMN_MKK1_MKKA2	0x4B
+#define DMN_APL1_WORLD	0x52
+#define DMN_APL1_FCCA	0x53
+#define DMN_APL1_APLA	0x54
+#define DMN_APL1_ETSIC	0x55
+#define DMN_APL2_ETSIC	0x56
+#define DMN_APL5_WORLD	0x58
+#define DMN_DEBUG_DEBUG	0xFF
+
+/* 2.4GHz and 5GHz common subbands */
+#define	DMN_APL1	(1<<0)
+#define DMN_APL2	(1<<1)
+#define DMN_APL3	(1<<2)
+#define DMN_APL4	(1<<3)
+#define DMN_APL5	(1<<4)
+#define DMN_ETSI1	(1<<5)
+#define DMN_ETSI2	(1<<6)
+#define DMN_ETSI3	(1<<7)
+#define DMN_ETSI4	(1<<8)
+#define DMN_ETSI5	(1<<9)
+#define DMN_ETSI6	(1<<10)
+#define DMN_ETSIA	(1<<11)
+#define DMN_ETSIB	(1<<12)
+#define DMN_ETSIC	(1<<13)
+#define DMN_FCC1	(1<<14)
+#define DMN_FCC2	(1<<15)
+#define DMN_FCC3	(1<<16)
+#define DMN_FCCA	(1<<17)
+#define DMN_APLD	(1<<18)
+#define DMN_MKK1	(1<<19)
+#define DMN_MKK2	(1<<20)
+#define DMN_MKKA	(1<<21)
+#define DMN_NULL	(1<<22)
+#define DMN_WORLD	(1<<23)
+#define DMN_DEBUG	(1<<31) /* Use on any map for debugging */
+
+/* Default max antenna gain, in dBi */
+#define REG_MAX_ANTENNA	6
+
+/* Subbands definitions. We break the IEEE-802.11 spectrum into 7 
+ * logical subbands */
+#define DMN_SB_ISM24	0
+#define DMN_SB_TELEC	1
+#define DMN_SB_UNII_1	2
+#define DMN_SB_UNII_2	3
+#define DMN_SB_ETSI	4
+#define DMN_SB_UNII_3	5
+#define DMN_SB_AAD	6
+
+#define REG_ISM24_MIN		2412	/* 2GHz channel 1 */
+#define REG_ISM24_MAX		2732	/* 2GHz channel 26 */
+#define REG_TELEC_MIN 		5005 	/* 5GHz channel 1 */
+#define REG_TELEC_MAX 		5145 	/* 5GHz channel 29 */
+#define REG_UNII_1_MIN 		5150 	/* 5GHz channel 30 */
+#define REG_UNII_1_MAX 		5245	/* 5GHz channel 49 */
+#define REG_UNII_2_MIN 		5250	/* 5GHz channel 50 */
+#define REG_UNII_2_MAX 		5350	/* 5GHz channel 70 */
+#define REG_ETSI_MIN		5355	/* 5GHz channel 71 */
+#define REG_ETSI_MAX		5720	/* 5GHz channel 144 */
+#define REG_UNII_3_MIN 		5725	/* 5GHz channel 145 */
+#define REG_UNII_3_MAX 		5825	/* 5GHz channel 165 */
+#define REG_AAD_MIN		5830	/* 5GHz channel 166 */
+#define REG_AAD_MAX 		6100	/* 5GHz channel 220 */
+
+/* Just FYI for now, technically DSRC is Dedicated Short Range Communications, 
+ * for vehicles in North America (USA, Canada, and Mexico) */
+#define REG_DSRC_MIN		5850
+#define REG_DSRC_MAX		5925
+
+/* 2.4GHz power subband IDs, note the entire world enables the 
+ * 2.4GHz subband */
+#define	DMN_P24_FCC	(2<<1)
+#define	DMN_P24_ETSI	(2<<2)
+#define DMN_P24_MKK	(2<<3)
+#define	DMN_P24_WORLD	(2<<4)
+
+/* Now for all 5GHz power subbands IDs, note that WORLD
+ * regdomain has no 5GHz subbands */
+
+/* TELEC subband */
+#define	DMN_PT_MKK	(2<<0)
+/* UNII-1 Used for indoor -- regulations require use of an integrated antenna */
+#define	DMN_PU1_FCC	(2<<1)
+#define	DMN_PU1_ETSI	(2<<2)
+#define	DMN_PU1_MKK	(2<<3)
+#define	DMN_PU1_APL	(2<<4)
+/* UNII-2 Used for indoor -- regulations allow for a user-installable antenna */
+#define	DMN_PU2_FCC	(2<<5)
+#define	DMN_PU2_ETSI	(2<<6)
+#define	DMN_PU2_APL	(2<<7)
+/* ETSI band */
+#define	DMN_PE_FCC	(2<<8)
+#define	DMN_PE_ETSI	(2<<9)
+/* UNII-3 Used for both outdoor and indoor use -- subject to 
+ * Dynamic Frequency Selection (DFS, or radar avoidance */
+#define	DMN_PU3_FCC	(2<<10)
+#define	DMN_PU3_APL	(2<<11)
+/* Asia/Africa/DSRC */
+/* XXX: fill these power restrictions out, for now only
+ * debug makes use of it */
+//#define	DMN_PA_FCC	(2<<12)
+//#define	DMN_PA_MKK	(2<<13)
+
+#endif /*_REGULATORY_COMMON_H_ */
diff --git a/net/wireless/regdomains.c b/net/wireless/regdomains.c
new file mode 100644
index 0000000..b9f79fd
--- /dev/null
+++ b/net/wireless/regdomains.c
@@ -0,0 +1,751 @@
+/*
+ * Copyright (c) 2004, 2005 Reyk Floeter <reyk@openbsd.org>
+ * Copyright (c) 2006, 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+#include <linux/module.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <net/ieee80211_regdomains.h>
+#include "regulatory_map.h"
+
+#define DRV_NAME	"ieee80211_regdomains"
+#define DRV_DESCRIPTION	"IEEE-802.11 Regulatory Domain wireless driver"
+#define DRV_VERSION	REGDOMAINS_VERSION
+
+MODULE_AUTHOR("Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DESCRIPTION(DRV_DESCRIPTION);
+MODULE_VERSION(DRV_VERSION);
+
+LIST_HEAD(iso3166_reg_map_list);
+EXPORT_SYMBOL(iso3166_reg_map_list);
+
+rwlock_t iso3166_reg_rwlock	= RW_LOCK_UNLOCKED;
+EXPORT_SYMBOL(iso3166_reg_rwlock);
+
+/* 
+ * Loads regulatory maps, used to build regualtory domains. We later
+ * can provide support to update maps via nl80211 or configfs. */
+struct reg_band		reg_band_map[] =	REG_MAP;
+struct reg_channel	reg_2ghz_channels[] =	REG_CHANNELS_2GHZ;
+struct reg_channel	reg_5ghz_channels[] =	REG_CHANNELS_5GHZ;
+struct reg_domainname	reg_domainname_map[] =	REG_NAMES;
+struct reg_country	reg_ctry_map[] =	REG_COUNTRY_NAMES;
+struct reg_subband	reg_subbands_map[] =	REG_SUBBANDS;
+struct reg_pw		reg_pw_2ghz_map[] =	REG_PW_24_MAP;
+struct reg_pw		reg_pw_t_map[] =	REG_PW_T_MAP;
+struct reg_pw		reg_pw_u1_map[] =	REG_PW_U1_MAP;
+struct reg_pw		reg_pw_u2_map[] =	REG_PW_U2_MAP;
+struct reg_pw		reg_pw_e_map[] =	REG_PW_E_MAP;
+struct reg_pw		reg_pw_u3_map[] =	REG_PW_U3_MAP;
+struct reg_pw		reg_pw_aad_map[] =	REG_PW_AAD_MAP;
+struct reg_pw_subbands	reg_pw_map[] =		REG_PW_MAP;
+
+/* Add any exceptions to the official ISO3166-1 alpha map here */
+static char *iso3166_1_exceptions[] = { 
+	"00", /* World regulatory domain */
+	"F2", 
+	"J1", "J2", "J3", "J4", "J5", /* Japan is complicated... */
+	"K2", 
+	"UK", /* UK's alpha2 is actually GB ;) */
+	"99" /* Used for debugging */
+};
+
+static inline int is_iso3166_1_exception(char *alpha2)
+{
+	int i;
+	for (i=0; i<ARRAY_SIZE(iso3166_1_exceptions); i++)
+		if(strncmp(alpha2, iso3166_1_exceptions[i], 2)==0)
+		return 1;
+	return 0;
+}
+
+static u32 ieee80211_regdomain2flag(u32 regdomain, u16 mhz)
+{
+	int i;
+	for (i = 0; i < ARRAY_SIZE(reg_band_map); i++) {
+		if (reg_band_map[i].rm_domain == regdomain) {
+			if (mhz >= 2000 && mhz <= 3000)
+				return((u32)reg_band_map[i].rm_domain_2ghz);
+			if (mhz >= REG_5GHZ_MIN && 
+			    mhz <= REG_5GHZ_MAX)
+				return((u32)reg_band_map[i].rm_domain_5ghz);
+		}
+	}
+	return((u32)DMN_DEBUG);
+}
+
+static int ieee80211_regdomain2name(u32 regdomain, char *name)
+{
+	int i;
+	/* Linear search over the table */
+	for(i = 0; i < ARRAY_SIZE(reg_domainname_map); i++)
+		if(reg_domainname_map[i].rn_domain == regdomain) {
+			memcpy(name, reg_domainname_map[i].rn_name, REGNAMSIZ);
+			return 0;
+		}
+	printk("No regdomain name matches regdomain: %0x\n", regdomain);
+	return -ENOENT;
+}
+
+int freq_to_subband(u16 freq, u32 *sb_id)
+{
+	int i;
+	struct reg_subband *sb;
+	for (i=0; i < ARRAY_SIZE(reg_subbands_map); i++) {
+		sb = &reg_subbands_map[i];
+		if (freq <= sb->sb_max_freq && freq >= sb->sb_min_freq) {
+			*sb_id = sb->sb_id;
+			return 0;
+		}
+	}
+	return -EINVAL;
+}
+
+static void update_reg_subband_map()
+{
+	reg_subbands_map[DMN_SB_ISM24].sb_reg_pw = reg_pw_2ghz_map;
+	reg_subbands_map[DMN_SB_ISM24].sb_reg_pw_size = ARRAY_SIZE(reg_pw_2ghz_map);
+
+	reg_subbands_map[DMN_SB_TELEC].sb_reg_pw = reg_pw_t_map;
+	reg_subbands_map[DMN_SB_TELEC].sb_reg_pw_size = ARRAY_SIZE(reg_pw_t_map);
+
+	reg_subbands_map[DMN_SB_UNII_1].sb_reg_pw = reg_pw_u1_map;
+	reg_subbands_map[DMN_SB_UNII_1].sb_reg_pw_size = ARRAY_SIZE(reg_pw_u1_map);
+
+	reg_subbands_map[DMN_SB_UNII_2].sb_reg_pw = reg_pw_u2_map;
+	reg_subbands_map[DMN_SB_UNII_2].sb_reg_pw_size = ARRAY_SIZE(reg_pw_u2_map);
+
+	reg_subbands_map[DMN_SB_ETSI].sb_reg_pw = reg_pw_e_map;
+	reg_subbands_map[DMN_SB_ETSI].sb_reg_pw_size = ARRAY_SIZE(reg_pw_e_map);
+
+	reg_subbands_map[DMN_SB_UNII_3].sb_reg_pw = reg_pw_u3_map;
+	reg_subbands_map[DMN_SB_UNII_3].sb_reg_pw_size = ARRAY_SIZE(reg_pw_u3_map);
+
+	reg_subbands_map[DMN_SB_AAD].sb_reg_pw = reg_pw_aad_map;
+	reg_subbands_map[DMN_SB_AAD].sb_reg_pw_size = ARRAY_SIZE(reg_pw_aad_map);
+}
+
+static int get_subband_pw_id(u32 regdomain, u32 sb_id, u32 *pw_id)
+{
+	int i;
+	struct reg_pw_subbands *pw_sb;
+	for (i=0; i <= ARRAY_SIZE(reg_pw_map); i++) {
+		pw_sb = &reg_pw_map[i];
+		if (pw_sb->domain_id == regdomain) {
+			switch(sb_id) {
+				case DMN_SB_ISM24:
+					*pw_id = pw_sb->p_domain_2ghz;
+					break;
+				case DMN_SB_TELEC:
+					*pw_id = pw_sb->p_domain_telec;
+					break;
+				case DMN_SB_UNII_1:
+					*pw_id = pw_sb->p_domain_unii1;
+					break;
+				case DMN_SB_UNII_2:
+					*pw_id = pw_sb->p_domain_unii2;
+					break;
+				case DMN_SB_ETSI:
+					*pw_id = pw_sb->p_domain_etsi;
+					break;
+				case DMN_SB_UNII_3:
+					*pw_id = pw_sb->p_domain_unii3;
+					break;
+				case DMN_SB_AAD:
+					*pw_id = pw_sb->p_domain_aad;
+					break;
+				default:	
+					return -ENOENT;
+			}
+			return 0;
+		}
+	}
+	return -ENOENT;
+}
+
+
+/* XXX: change to return u8 when ieee80211_channel chan gets changed */
+u16 regdomain_mhz2ieee(u16 freq)
+{
+	if (freq >= REG_2GHZ_MIN &&  /* Channel 1 */
+		freq <= REG_2GHZ_MAX) { /* Channel 26 */
+		if (freq == 2484) /* Japan */
+			return 14;
+		if ((freq >= 2412) && (freq < 2484))
+			return (freq - 2407) / 5;
+		if (freq < 2512) /* No new channel until 2512 */
+			return 0;
+		return ((freq - 2512)/20) + 15; /* 15-26 */
+	} else if (freq >= REG_5GHZ_MIN && /* Channel 1 */
+		freq <= REG_5GHZ_MAX) { /* Channel 220 */
+		return (freq - 5000) / 5;
+	} else
+	return 0;
+}
+EXPORT_SYMBOL(regdomain_mhz2ieee);
+
+/* XXX: change arg1 to u8 when ieee80211_channel chan gets changed */
+u16 regdomain_ieee2mhz(u16 chan, u8 band)
+{
+	switch (band) {
+	case IEEE80211_24GHZ_BAND:
+		if (chan > MAX_NUM_MODE_G_CHANS || chan == 0) {
+			BUG();
+			return 0;
+		}
+		if (chan < 14)
+			return (2407 + (chan * 5));
+		else if (chan == 14)
+			return 2484;
+		else if (chan == 15)
+			return 2512;
+		else
+			return (2492 + (chan * 20));
+	case IEEE80211_52GHZ_BAND:
+		if (chan > MAX_NUM_MODE_A_CHANS || chan == 0) {
+			BUG();
+			return 0;
+		}
+		return ((5000) + (chan * 5));
+	default:
+		BUG();
+		return 0;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(regdomain_ieee2mhz);
+
+static inline u8 freq_band_id(u16 freq)
+{
+	if (freq >= REG_2GHZ_MIN &&  /* Channel 1 */
+		freq <= REG_2GHZ_MAX) /* Channel 26 */
+		return IEEE80211_24GHZ_BAND;
+	else if (freq >= REG_5GHZ_MIN && /* Channel 1 */
+		freq <= REG_5GHZ_MAX) /* Channel 220 */
+		return IEEE80211_52GHZ_BAND;
+	else {
+		BUG();
+		return -EINVAL;
+	}
+	
+}
+
+static inline int is_japan_regdomain_id(u32 regdomain_id)
+{
+	switch(regdomain_id) {
+	case DMN_MKK1_MKKB:
+	case DMN_MKK1_FCCA:
+	case DMN_MKK1_MKKA:
+	case DMN_MKK2_MKKA:
+	case DMN_MKK1_MKKA1:
+	case DMN_MKK1_MKKA2:
+		return 1;
+	default:
+		return 0;
+	}
+}
+
+u32 ieee80211_mode_modulation(u8 mode)
+{
+	switch (mode) {
+	case MODE_IEEE80211A:
+		return IEEE80211_RATE_OFDM;
+	case MODE_IEEE80211B:
+		return IEEE80211_RATE_CCK;
+	case MODE_IEEE80211G:
+		return IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(ieee80211_mode_modulation);
+
+static inline void setup_regdomain(struct ieee80211_regdomain *r,
+		u8 regdomain_id, char *regdomain_name)
+{
+	strcpy(r->regdomain_name, regdomain_name);
+	r->regdomain_id = regdomain_id;
+}
+
+static inline void setup_subband_restrictions(
+		struct ieee80211_subband_restrictions *sb, char *name,
+		u16 min_freq, u16 max_freq, u8 max_antenna_gain,
+		u8 max_ir_ptmp, u8 max_ir_ptp,
+		u8 max_eirp_ptmp, u8 max_eirp_ptp,
+		char environment_cap)
+{
+	memcpy(sb->name, name, REGSBNAMSIZ);
+	sb->band = freq_band_id(min_freq);
+	sb->min_freq = min_freq;
+	sb->max_freq = max_freq;
+	sb->max_antenna_gain = max_antenna_gain;
+	sb->max_ir_ptmp = max_ir_ptmp;
+	sb->max_ir_ptp = max_ir_ptp;
+	sb->max_eirp_ptmp = max_eirp_ptmp;
+	sb->max_eirp_ptp = max_eirp_ptp;
+	sb->environment_cap = environment_cap;
+}
+
+static inline void setup_reg_channel(u32 regdomain_id,
+		struct ieee80211_channel *chan,
+		struct ieee80211_subband_restrictions *sb,
+		struct reg_channel *r_channel)
+{
+	chan->freq = r_channel->rc_freq;
+	chan->modulation_cap = r_channel->rc_modulation_cap;
+	/* We set chan->val with what is common, drivers can overwrite 
+	 * that if they so wish to */
+	chan->chan = chan->val = regdomain_mhz2ieee(chan->freq);
+
+	chan->flag = IEEE80211_CHAN_W_SCAN | 
+		IEEE80211_CHAN_W_ACTIVE_SCAN |
+		IEEE80211_CHAN_W_IBSS;
+
+	/* For now assume standard dipole antenna */
+	chan->power_level = sb->max_eirp_ptmp - REG_DIPOLE_ANTENNA_GAIN;
+
+	if (chan->freq > REG_5GHZ_MIN) {
+		/* New regulatory rules in japan don't allow scan in
+ 		 * these old channels (5.15-5.25 GHz). This is an
+ 		 * excemption to common regulatory rules so we add 
+ 		 * it here */
+		if (is_japan_regdomain_id(regdomain_id) &&
+		  (chan->freq == 5170 || chan->freq == 5190 ||
+		  chan->freq == 5210 || chan->freq == 5230))
+			chan->flag &= ~IEEE80211_CHAN_W_ACTIVE_SCAN;
+	}
+}
+
+static void free_subband_channel_list(struct list_head *channel_list)
+{	
+	struct ieee80211_channel *chan, *chan_tmp;
+	list_for_each_entry_safe(chan, chan_tmp, channel_list, list) {
+		list_del(&chan->list);
+		if (chan != NULL)
+			kfree(chan);
+	}
+}
+
+void free_regdomain(struct ieee80211_regdomain *reg)
+{
+	struct ieee80211_subband_restrictions *sb;
+	int y;
+	for (y=0; y<REG_NUM_SUBBANDS; y++) {
+		sb = &reg->subbands[y];
+		if (! list_empty(&sb->channel_list)) {
+			free_subband_channel_list(&sb->channel_list);
+		}
+		list_del(&sb->channel_list);
+	}
+	kfree(reg);
+}
+EXPORT_SYMBOL(free_regdomain);
+
+static void free_iso3166_reg_map_list(void)
+{
+	struct ieee80211_iso3166_reg_map *map, *tmp;
+	list_for_each_entry_safe(map, tmp, &iso3166_reg_map_list, list) {
+		list_del(&map->list);
+		kfree(map);
+	}
+}
+
+static inline int check_reg_init(int r, char *reg_name)
+{
+	printk("%s: regulatory domain %s ", DRV_NAME, reg_name);
+	switch(r) {
+		case -ENOMEM:
+			printk("Unable to allocate memory\n");
+			break;
+		case -EINVAL:
+			printk("reg_name is invalid\n");
+			break;
+		case 0:
+			printk("created\n");
+			break;
+		default:
+			printk("Unexpected error detected\n");
+			r = -EINVAL;
+			break;
+	}
+	return r;
+}
+
+void print_regdomain(struct ieee80211_regdomain *reg)
+{
+	struct ieee80211_subband_restrictions *sb;
+	struct ieee80211_channel *chan;
+	int y;
+
+	u32 modulation_a = ieee80211_mode_modulation(MODE_IEEE80211A);
+	u32 modulation_b = ieee80211_mode_modulation(MODE_IEEE80211B);
+	u32 modulation_g = ieee80211_mode_modulation(MODE_IEEE80211G);
+
+	if (reg == NULL) {
+		printk("Invalid regulatory domain encountered\n");
+		return;
+	}
+
+	printk("Regulatory Domain:\t%s\tRegulatory Domain ID:\t0x%02x\n",
+			reg->regdomain_name,
+			reg->regdomain_id);
+
+	
+	for (y=0; y < REG_NUM_SUBBANDS; y++) {
+		sb = &reg->subbands[y];
+		if (sb->num_channels == 0)
+			continue;
+		switch (sb->band) {
+		case IEEE80211_24GHZ_BAND:
+			if (sb->modulation_cap == modulation_b)
+				printk("\tIEEE 802.11b\t2GHz\t%s subband", sb->name);
+			else if (sb->modulation_cap == modulation_g)
+				printk("\tIEEE 802.11g\t2GHz\t%s subband", sb->name);
+			else 
+				BUG();
+			break;
+		case IEEE80211_52GHZ_BAND:
+			if (sb->modulation_cap == modulation_a) {
+				printk("\tIEEE 802.11a\t5GHz\t%s subband", sb->name);
+			}
+			else
+				BUG();
+			break;
+		default:
+			BUG();
+			break;
+		}
+
+		printk("\n\tmax_ir_ptmp:\t%d dBm\tmax_eirp_ptmp:\t%d dBm\n", 
+			sb->max_ir_ptmp, sb->max_eirp_ptmp);
+		printk("\tmax_ir_ptp:\t%d dBm\tmax_eirp_ptp:\t%d dBm\n", 
+			sb->max_ir_ptp, sb->max_eirp_ptp);
+		printk("\tmax_antenna_gain:\t%d dBi\n"
+			"\tEnvironment capability:\t", sb->max_antenna_gain);
+		if(sb->environment_cap == REG_CAP_INDOOR)
+			printk("Indoor\n");
+		else if(sb->environment_cap == REG_CAP_OUTDOOR)
+			printk("Outdoor\n");
+		else if(sb->environment_cap == REG_CAP_INOUT)
+			printk("Indoor & Outdoor\n");
+		else
+			BUG();
+		printk("\t\tChannel\tFreq (MHz)\t\n");
+
+		list_for_each_entry(chan, &sb->channel_list, list){
+			printk("\t\t%d\t%d\t\n", chan->chan, chan->freq);
+		}
+	}
+	printk("\n");
+}
+EXPORT_SYMBOL(print_regdomain);
+
+#ifdef CONFIG_IEEE80211_REGDOMAINS_DBG
+void print_iso3166_reg_map(void)
+{
+	struct ieee80211_iso3166_reg_map *map;
+	char regdomain_name[REGNAMSIZ];
+	printk("ISO3166 <--> regulatory domain map:\n");
+	printk("CTRY\t-->\tRegdomain\n");
+	read_lock(&iso3166_reg_rwlock);
+	list_for_each_entry(map, &iso3166_reg_map_list, list) {
+		if (ieee80211_regdomain2name(map->regdomain_id, regdomain_name))
+			printk("%s\t-->\t0x%02x (reg_id not registered in "
+					"regulatory db)\n", 
+					map->alpha2, map->regdomain_id);
+		else
+			printk("%s\t-->\t%s\n", map->alpha2, regdomain_name);
+	}
+	read_unlock(&iso3166_reg_rwlock);
+}
+#else
+
+void print_iso3166_reg_map(void)
+{
+	return;
+}
+#endif /* CONFIG_IEEE80211_REGDOMAINS_DBG */
+EXPORT_SYMBOL(print_iso3166_reg_map);
+
+static inline void setup_iso3166_reg_map(struct ieee80211_iso3166_reg_map *map,
+		char *alpha2, u32 regdomain_id)
+{
+	strcpy(map->alpha2, alpha2);
+	map->regdomain_id = regdomain_id;
+}
+
+int iso3166_to_reg_exists(char *alpha2)
+{
+	struct ieee80211_iso3166_reg_map *map;
+	read_lock(&iso3166_reg_rwlock);
+	list_for_each_entry(map, &iso3166_reg_map_list, list)
+		if(strncmp(map->alpha2, alpha2, ISOCOUNTRYSIZ2-1)==0) {
+			read_unlock(&iso3166_reg_rwlock);
+			return 1;
+		}
+	read_unlock(&iso3166_reg_rwlock);
+	return 0;
+}
+EXPORT_SYMBOL(iso3166_to_reg_exists);
+
+int iso3166_to_reg(char *alpha2, u32 *regdomain_id)
+{
+	struct ieee80211_iso3166_reg_map *map;
+	read_lock(&iso3166_reg_rwlock);
+	list_for_each_entry(map, &iso3166_reg_map_list, list)
+		if(strncmp(map->alpha2, alpha2, ISOCOUNTRYSIZ2-1)==0) {
+			*regdomain_id = map->regdomain_id;
+			read_unlock(&iso3166_reg_rwlock);
+			return 0;
+		}
+	read_unlock(&iso3166_reg_rwlock);
+	return -ENOENT;
+}
+EXPORT_SYMBOL(iso3166_to_reg);
+
+static int add_iso3166_reg_map(char *alpha2, u32 regdomain_id)
+{
+	int r = 0;
+	struct ieee80211_iso3166_reg_map *map;
+	/* If not valid or iso map does already already present */
+	if((!iso3166_1_exists(alpha2) && !is_iso3166_1_exception(alpha2)) 
+		|| iso3166_to_reg_exists(alpha2)){
+		r = -EPERM;
+		goto exit;
+	}
+	write_lock(&iso3166_reg_rwlock);
+	map = kzalloc(sizeof(struct ieee80211_iso3166_reg_map), GFP_KERNEL);
+	if(map == NULL) {
+		r = -ENOMEM;
+		goto unlock_and_exit;
+	}
+	setup_iso3166_reg_map(map, alpha2, regdomain_id);
+	list_add_tail(&map->list, &iso3166_reg_map_list);
+unlock_and_exit:
+	write_unlock(&iso3166_reg_rwlock);
+exit:
+	return r;
+}
+
+static int __load_iso3166_reg_map_list(void)
+{
+	int i, r = 0;
+	struct reg_country *r_country;
+	INIT_LIST_HEAD(&iso3166_reg_map_list);
+	for (i = 0; i < ARRAY_SIZE(reg_ctry_map); i++) {
+		r_country = &reg_ctry_map[i];
+		r = add_iso3166_reg_map(r_country->cn_name, 
+			r_country->cn_domain);
+		if(r && r!=-ENOMEM) {
+			printk("%s: Skipping country <-> regdomain map for "
+				"country %s\n", DRV_NAME, r_country->cn_name);
+			r = 0;
+		}
+	}
+	return r;
+}
+
+static int __alloc_band_channels(u32 regdomain_id, 
+	struct ieee80211_regdomain *reg, u8 band, 
+	u32 sb_chan_domain)
+{
+	struct reg_channel *band_channels = NULL;
+	int band_channel_size = 0;
+	int i;
+
+	switch (band) {
+		case IEEE80211_24GHZ_BAND:
+			band_channels = reg_2ghz_channels;
+			band_channel_size = ARRAY_SIZE(reg_2ghz_channels);
+			break;
+		case IEEE80211_52GHZ_BAND:
+			band_channels = reg_5ghz_channels;
+			band_channel_size = ARRAY_SIZE(reg_5ghz_channels);
+			break;
+	}
+
+	for (i = 0; i < band_channel_size; i++) {
+		u32 sb_id = -1;
+		struct ieee80211_subband_restrictions *sb;
+		struct ieee80211_channel *sb_chan; /* For subband */
+		struct reg_subband *reg_sb;
+		struct reg_channel *r_channel = &band_channels[i];
+
+		if (r_channel->rc_domain != sb_chan_domain)
+			continue;
+
+		BUG_ON(freq_to_subband(r_channel->rc_freq, &sb_id));
+		BUG_ON(&reg_subbands_map[sb_id] == NULL);
+
+		sb = &reg->subbands[sb_id];
+		reg_sb = &reg_subbands_map[sb_id];
+
+		sb->modulation_cap |= r_channel->rc_modulation_cap;
+
+		/* Add to subband linked list */
+		sb_chan = kzalloc(sizeof(struct ieee80211_channel), 
+					GFP_KERNEL);
+		if (sb_chan == NULL)
+			return -ENOMEM;
+		setup_reg_channel(regdomain_id, sb_chan, 
+				sb, r_channel);
+		list_add_tail(&sb_chan->list, &sb->channel_list);
+		sb->num_channels++;
+	}
+	return 0;
+}
+
+static int setup_reg_pw_restrictions(u32 regdomain_id, 
+	struct ieee80211_regdomain *reg)
+{
+	int i, r = 0;
+	/* Iterate over our subbands and set respective power restrictions */
+	for (i=0; i < REG_NUM_SUBBANDS; i++) {
+		struct reg_subband *reg_sb;
+		struct reg_pw *sb_reg_pw;
+		struct ieee80211_subband_restrictions *sb;
+		u32 pw_sb_id = -1;
+		int pw_idx;
+
+		reg_sb = &reg_subbands_map[i];
+		/* Note, bellow is an array, we're going to iterate 
+		 * through it later */
+		sb_reg_pw = reg_sb->sb_reg_pw;
+		BUG_ON(sb_reg_pw == NULL);
+		sb = &reg->subbands[i];
+		/* Initialize all lists */
+		INIT_LIST_HEAD(&sb->channel_list);
+
+		/* Iterate through this subbands possible power maps, and setup
+		 * the subband as corresponds to this regdomain */
+		r = get_subband_pw_id(regdomain_id, i, &pw_sb_id);
+		BUG_ON(r);
+		for (pw_idx = 0; pw_idx < reg_sb->sb_reg_pw_size; pw_idx++) {
+			if (sb_reg_pw->p_domain != pw_sb_id) {
+				sb_reg_pw++;
+				continue;
+			}
+			/* We found a match */
+			setup_subband_restrictions(sb, reg_sb->sb_name,
+				reg_sb->sb_min_freq, reg_sb->sb_max_freq,
+				sb_reg_pw->max_antenna_gain,
+				sb_reg_pw->max_ir_ptmp, sb_reg_pw->max_ir_ptp,
+				sb_reg_pw->max_eirp_ptmp, 
+				sb_reg_pw->max_eirp_ptp,
+				sb_reg_pw->environment_cap);
+			break; /* Start working on next subband */
+		}
+	}
+	return r;
+}
+
+/* Called by users of this module, cfg80211 at the moment */
+int regdomain_build(u32 regdomain_id, struct ieee80211_regdomain **reg_p)
+{
+	struct ieee80211_regdomain *reg = NULL;
+	struct ieee80211_subband_restrictions *subbands = NULL;
+	char reg_name[REGNAMSIZ];
+	u32 reg_2ghz_id;
+	u32 reg_5ghz_id;
+	int i;
+	int r = -ENOMEM;
+
+	reg_2ghz_id = ieee80211_regdomain2flag(regdomain_id, REG_2GHZ_MIN);
+	reg_5ghz_id = ieee80211_regdomain2flag(regdomain_id, REG_5GHZ_MIN);
+	r = ieee80211_regdomain2name(regdomain_id, reg_name);
+	BUG_ON(r);
+
+	/* Allocate regdomain */
+	*reg_p = kzalloc(sizeof(struct ieee80211_regdomain), GFP_KERNEL);
+	if (reg) {
+		r = -ENOMEM;
+		goto exit;
+	}
+
+	reg = *reg_p;
+	subbands = reg->subbands;
+
+	/* First update subband power maps */
+	update_reg_subband_map();
+
+	/* Now update power restrictions */
+	r = setup_reg_pw_restrictions(regdomain_id, reg);
+	BUG_ON(r);
+	
+	/* Allocate 2GHz channels for regdomain */
+	if (reg_2ghz_id != DMN_NULL) {
+		r = __alloc_band_channels(regdomain_id, reg, 
+			IEEE80211_24GHZ_BAND, reg_2ghz_id);
+		if (r)
+			goto free_sb_channels;
+	}
+
+	/* Allocate 5GHz channels for regdomain */
+	if (reg_5ghz_id != DMN_NULL) {
+		r = __alloc_band_channels(regdomain_id, reg, 
+			IEEE80211_52GHZ_BAND, reg_2ghz_id);
+		if (r)
+			goto free_sb_channels;
+	}
+
+	/* Setup regdomain, bands and subbands */
+	setup_regdomain(reg, regdomain_id, reg_name);
+	check_reg_init(r, reg_name);
+	return 0;
+
+free_sb_channels:
+	for (i=0; i < REG_NUM_SUBBANDS; i++) {
+		struct ieee80211_subband_restrictions *sb;
+		sb = &subbands[i];
+		if (! list_empty(&sb->channel_list))
+			free_subband_channel_list(&sb->channel_list);
+		list_del(&sb->channel_list);
+	}
+exit:
+	check_reg_init(r, reg_name);
+	return r;
+}
+EXPORT_SYMBOL(regdomain_build);
+
+static int regdomains_init(void)
+{
+	int r;
+	printk("%s: %s v%s loaded\n", DRV_NAME, DRV_DESCRIPTION, DRV_VERSION);
+
+	/* Load iso->reg map */
+	r = __load_iso3166_reg_map_list();
+	if(r)
+		goto free_iso_reg_map_list;
+	print_iso3166_reg_map();
+
+	return r;
+free_iso_reg_map_list:
+	free_iso3166_reg_map_list();
+	return r;
+}
+
+void regdomains_exit(void)
+{
+	/* Iso->reg map */
+	write_lock(&iso3166_reg_rwlock);
+	free_iso3166_reg_map_list();
+	list_del(&iso3166_reg_map_list);
+	write_unlock(&iso3166_reg_rwlock);
+	printk("%s: unloaded\n", DRV_NAME);
+}
+
+module_init(regdomains_init);
+module_exit(regdomains_exit);
diff --git a/net/wireless/regulatory_map.h b/net/wireless/regulatory_map.h
new file mode 100644
index 0000000..35fa358
--- /dev/null
+++ b/net/wireless/regulatory_map.h
@@ -0,0 +1,887 @@
+#ifndef _REGULATORY_MAP_H_
+/*
+ * Copyright (c) 2004, 2005 Reyk Floeter <reyk@openbsd.org>
+ * Copyright (c) 2007 Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#include "reg_common.h"
+
+static int ieee80211_regdomain2name(u32, char *);
+static u32 ieee80211_regdomain2flag(u32, u16);
+
+static void update_reg_subband_map(void);
+static int get_subband_pw_id(u32, u32, u32 *);
+
+struct reg_channel {
+	u16	rc_freq; /* Center of frequency */
+	u32	rc_domain;
+	/* Can be IEEE80211_RATE_OFDM, IEEE80211_RATE_CCK, 
+ 	 * depending on he rc_freq (mhz), we'll
+ 	 * use the modulation cap to configure mode on the subband 
+ 	 * (MODE_IEEE80211A, MODE_IEEE80211B, MODE_IEEE80211G ) */ 
+	u32	rc_modulation_cap;
+};
+
+struct reg_domainname {
+	u32		rn_domain;
+	const char	*rn_name;
+};
+
+struct reg_pw {
+	u32 p_domain;
+	char environment_cap;
+/* As like the last (3rd) octect of 802.11d Country 
+ * Information Element string */
+#define REG_CAP_INDOOR  'I'
+#define REG_CAP_OUTDOOR 'O'
+#define REG_CAP_INOUT   ' '
+	u8 max_antenna_gain;
+	u8 max_ir_ptmp;
+	u8 max_ir_ptp;
+	u8 max_eirp_ptmp;
+	u8 max_eirp_ptp;
+};
+
+struct reg_pw_subbands {
+	u32	domain_id;
+	u32	p_domain_2ghz;
+	u32	p_domain_telec;
+	u32	p_domain_unii1;
+	u32	p_domain_unii2;
+	u32	p_domain_etsi;
+	u32	p_domain_unii3;
+	u32	p_domain_aad;
+};
+
+struct reg_band {
+	u16	rm_domain;
+	u32	rm_domain_5ghz;
+	u32	rm_domain_2ghz;
+};
+
+struct reg_country {
+	/* ISO-3166-1 alpha 2 */
+	char	cn_name[2];
+	u32	cn_domain;
+};
+
+struct reg_subband {
+	u32	sb_id;
+	char	sb_name[30];
+	u16	sb_min_freq;
+	u16	sb_max_freq;
+	struct reg_pw *sb_reg_pw;
+	u8	sb_reg_pw_size;
+};
+
+#define REG_SUBBANDS { \
+	{ DMN_SB_ISM24,		"ISM", \
+		REG_ISM24_MIN,	REG_ISM24_MAX, NULL, 0 }, \
+	{ DMN_SB_TELEC,		"TELEC", \
+		REG_TELEC_MIN,	REG_TELEC_MAX, NULL, 0 }, \
+	{ DMN_SB_UNII_1,	"UNII-1", \
+		REG_UNII_1_MIN, REG_UNII_1_MAX, NULL, 0 }, \
+	{ DMN_SB_UNII_2,	"UNII-2 / ETSI", \
+		REG_UNII_2_MIN,	REG_UNII_2_MAX, NULL, 0 }, \
+	{ DMN_SB_ETSI,		"ETSI", \
+		REG_ETSI_MIN,	REG_ETSI_MAX, NULL, 0 }, \
+	{ DMN_SB_UNII_3,	"UNII-3", \
+		REG_UNII_3_MIN,	REG_UNII_3_MAX, NULL, 0 }, \
+	{ DMN_SB_AAD,		"Asia/Africa/DSRC", \
+		REG_AAD_MIN,	REG_AAD_MAX, NULL, 0 } \
+}
+
+/*
+ * EIRP	- Equivalent Isotropically Radiated Power
+ * IR	- Intentional Radiator, transmitter
+ * dBm	- dB milliwatt (mW), the base says that 1mW = 0 dBm
+ * dBi	- dB relative to isotropic, used to measure antenna gain compared to an
+ * 	  isotropic antenna on which radiation is distributed uniformly on the
+ * 	  surface of a sphere 
+ *
+ * EIRP = IR - loss in transmission line + passive gain of the antenna
+ */
+
+#define DMN_P5_NULL	DMN_NULL,	DMN_NULL,	DMN_NULL, \
+			DMN_NULL, 	DMN_NULL,	DMN_NULL
+#define DMN_P5_DEBUG	DMN_DEBUG,	DMN_DEBUG,	DMN_DEBUG, \
+			DMN_DEBUG, 	DMN_DEBUG,	DMN_DEBUG
+
+#define DMN_P5_FCC1	DMN_NULL,	DMN_PU1_FCC,	DMN_PU2_FCC, \
+			DMN_NULL,	DMN_PU3_FCC,	DMN_NULL
+#define DMN_P5_FCC2	DMN_P5_FCC1
+#define DMN_P5_FCC3	DMN_NULL,	DMN_PU1_FCC,	DMN_PU2_FCC, \
+			DMN_PE_FCC,	DMN_PU3_FCC,	DMN_NULL
+
+#define DMN_P5_ETSI1	DMN_NULL,	DMN_PU1_ETSI,	DMN_PU2_ETSI, \
+			DMN_PE_ETSI, 	DMN_NULL,	DMN_NULL
+#define DMN_P5_ETSI2	DMN_NULL,	DMN_PU1_ETSI,	DMN_NULL, \
+			DMN_NULL,	DMN_NULL,	DMN_NULL
+#define DMN_P5_ETSI3	DMN_NULL,	DMN_PU1_ETSI,	DMN_PU2_ETSI, \
+			DMN_NULL,	DMN_NULL,	DMN_NULL
+#define DMN_P5_ETSI4	DMN_P5_ETSI3
+#define DMN_P5_ETSI5	DMN_P5_ETSI2
+#define DMN_P5_ETSI6	DMN_NULL,	DMN_PU1_ETSI,	DMN_PU2_ETSI, \
+			DMN_PE_ETSI,	DMN_NULL,	DMN_NULL
+
+#define DMN_P5_MKK1	DMN_NULL,	DMN_PU1_MKK,	DMN_NULL, \
+			DMN_NULL,	DMN_NULL,	DMN_NULL
+#define DMN_P5_MKK2	DMN_PT_MKK,	DMN_PU1_MKK,	DMN_NULL, \
+			DMN_NULL,	DMN_NULL,	DMN_NULL
+
+#define DMN_P5_APL1	DMN_NULL,	DMN_NULL,	DMN_NULL, \
+			DMN_NULL,	DMN_PU3_APL,	DMN_NULL
+#define DMN_P5_APL2	DMN_P5_APL
+#define DMN_P5_APL3	DMN_NULL,	DMN_NULL,	DMN_PU2_APL, \
+			DMN_NULL, 	DMN_PU3_APL,	DMN_NULL
+#define DMN_P5_APL4	DMN_NULL,	DMN_PU1_APL,	DMN_NULL, \
+			DMN_NULL,	DMN_PU3_APL,	DMN_NULL
+#define DMN_P5_APL5	DMN_P5_APL1
+
+#define REG_PW_24_MAP { \
+	{ DMN_P24_FCC,	REG_CAP_INOUT, REG_MAX_ANTENNA, 30, 30, 36, 0xff},\
+	{ DMN_P24_ETSI,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_P24_WORLD,REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_P24_MKK,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_DEBUG,	REG_CAP_INOUT, 0xff, 0xff, 0xff, 0xff, 0xff} \
+}
+
+#define REG_PW_T_MAP { \
+	{ DMN_PT_MKK,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_DEBUG,	REG_CAP_INOUT, 0xff, 0xff, 0xff, 0xff, 0xff} \
+}
+
+#define REG_PW_U1_MAP { \
+	{ DMN_PU1_FCC,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_PU1_ETSI,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_PU1_MKK,	REG_CAP_INOUT, REG_MAX_ANTENNA, 10, 0, 10, 0}, \
+	{ DMN_DEBUG,	REG_CAP_INOUT, 0xff, 0xff, 0xff, 0xff, 0xff} \
+}
+
+#define REG_PW_U2_MAP { \
+	{ DMN_PU2_FCC,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_PU2_ETSI,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_DEBUG,	REG_CAP_INOUT, 0xff, 0xff, 0xff, 0xff, 0xff} \
+}
+
+#define REG_PW_E_MAP { \
+	{ DMN_PE_FCC,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_PE_ETSI,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_DEBUG,	REG_CAP_INOUT, 0xff, 0xff, 0xff, 0xff, 0xff} \
+}
+
+#define REG_PW_U3_MAP { \
+	{ DMN_PU3_FCC,	REG_CAP_INOUT, REG_MAX_ANTENNA, 20, 0, 20, 0}, \
+	{ DMN_DEBUG,	REG_CAP_INOUT, 0xff, 0xff, 0xff, 0xff, 0xff} \
+}
+
+#define REG_PW_AAD_MAP { \
+	{ DMN_DEBUG,	REG_CAP_INOUT, 0xff, 0xff, 0xff, 0xff, 0xff} \
+}
+
+#define REG_PW_MAP { \
+	{ DMN_NULL_WORLD,	DMN_P24_ETSI,	DMN_P5_NULL }, \
+	{ DMN_NULL_ETSIB,	DMN_P24_ETSI,	DMN_P5_NULL }, \
+	{ DMN_NULL_ETSIC,	DMN_P24_ETSI,	DMN_P5_NULL }, \
+	{ DMN_FCC1_WORLD,	DMN_P24_FCC,	DMN_P5_FCC1 }, \
+	{ DMN_FCC1_FCCA,	DMN_P24_FCC,	DMN_P5_FCC1 }, \
+	{ DMN_FCC2_WORLD,	DMN_DEBUG,	DMN_P5_FCC2 }, \
+	{ DMN_FCC2_FCCA,	DMN_P24_FCC,	DMN_P5_FCC2 }, \
+	{ DMN_FCC2_ETSIC,	DMN_DEBUG,	DMN_P5_FCC2 }, \
+	{ DMN_FCC3_FCCA,	DMN_P24_FCC,	DMN_P5_FCC3 }, \
+	{ DMN_ETSI1_WORLD,	DMN_P24_ETSI,	DMN_P5_ETSI1},	\
+	{ DMN_ETSI2_WORLD,	DMN_P24_ETSI,	DMN_P5_ETSI2},	\
+	{ DMN_ETSI3_WORLD,	DMN_P24_ETSI,	DMN_P5_ETSI3},	\
+	{ DMN_ETSI3_ETSIA,	DMN_P24_ETSI,	DMN_P5_ETSI3},	\
+	{ DMN_ETSI4_WORLD,	DMN_P24_ETSI,	DMN_P5_ETSI4},	\
+	{ DMN_ETSI4_ETSIC,	DMN_P24_ETSI,	DMN_P5_ETSI4},	\
+	{ DMN_ETSI5_WORLD,	DMN_P24_ETSI,	DMN_P5_ETSI5},	\
+	{ DMN_ETSI6_WORLD,	DMN_P24_ETSI,	DMN_P5_ETSI5},	\
+	{ DMN_MKK1_MKKA,	DMN_P24_MKK,	DMN_P5_MKK1},	\
+	{ DMN_MKK1_MKKB,	DMN_P24_MKK,	DMN_P5_MKK1},	\
+	{ DMN_MKK1_MKKB,	DMN_P24_MKK,	DMN_P5_MKK1},	\
+	{ DMN_MKK1_FCCA,	DMN_P24_MKK,	DMN_P5_MKK1},	\
+	{ DMN_MKK1_MKKA1,	DMN_P24_MKK,	DMN_P5_MKK1},	\
+	{ DMN_MKK1_MKKA2,	DMN_P24_MKK,	DMN_P5_MKK1},	\
+	{ DMN_MKK2_MKKA,	DMN_P24_MKK,	DMN_P5_MKK2},	\
+	{ DMN_APL1_WORLD,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL1_APLA,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL1_ETSIC,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL1_FCCA,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL2_WORLD,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL2_ETSIC,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL2_APLC,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL2_APLD,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL3_WORLD,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL4_WORLD,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_APL5_WORLD,	DMN_DEBUG,	DMN_P5_DEBUG},	\
+	{ DMN_DEBUG_DEBUG, 	DMN_DEBUG,	DMN_P5_DEBUG} \
+}
+
+#define REG_CHANNELS_2GHZ { \
+	{ 2432, DMN_WORLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* ISM 2.4 GHz */	\
+	{ 2437, DMN_WORLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2442, DMN_WORLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+											\
+	{ 2412, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* ISM 2.4 GHz */	\
+	{ 2417, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2422, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2427, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2432, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2437, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2442, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2447, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2452, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2457, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2462, DMN_FCCA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+											\
+	{ 2412, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* ISM 2.4GHz */	\
+	{ 2417, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2422, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2427, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2432, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2437, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2442, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2447, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2452, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2457, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2462, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2467, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2472, DMN_APLD, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+											\
+	{ 2432, DMN_ETSIB, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* ISM 2.4GHz */	\
+	{ 2437, DMN_ETSIB, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2442, DMN_ETSIB, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+											\
+	{ 2412, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* ISM 2.4 GHz */	\
+	{ 2417, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2422, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2427, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2432, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2437, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2442, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2447, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2452, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2457, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2462, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2467, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2472, DMN_ETSIC, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+											\
+	{ 2412, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* ISM 2.4 GHz */	\
+	{ 2417, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2422, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2427, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2432, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2437, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2442, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2447, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2452, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2457, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2462, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2467, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2472, DMN_MKKA, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2484, DMN_MKKA, IEEE80211_RATE_CCK },						\
+											\
+	{ 2412, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* ISM 2.4 GHz */	\
+	{ 2417, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Every 5MHz */	\
+	{ 2422, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2427, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2432, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2437, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2442, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2447, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2452, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2457, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2462, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2467, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },			\
+	{ 2472, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },/* Ch 13 */		\
+	{ 2484, DMN_DEBUG, IEEE80211_RATE_CCK }, /* Japan 14, note we hopped 12 MHz */	\
+	{ 2512, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM },/*Now every 20mhz*/ \
+	{ 2532, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 16 */	\
+	{ 2552, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 17 */	\
+	{ 2572, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 18 */	\
+	{ 2592, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 19 */	\
+	{ 2612, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 20 */	\
+	{ 2632, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 21 */	\
+	{ 2652, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 22 */	\
+	{ 2672, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 23 */	\
+	{ 2692, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 24 */	\
+	{ 2712, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }, /* Ch 25 */	\
+	{ 2732, DMN_DEBUG, IEEE80211_RATE_CCK|IEEE80211_RATE_OFDM }  /* Ch 26 */	\
+}
+
+#define REG_CHANNELS_5GHZ { \
+	{ 5745, DMN_APL1, IEEE80211_RATE_OFDM }, /* UNII-3 */	\
+	{ 5765, DMN_APL1, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_APL1, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_APL1, IEEE80211_RATE_OFDM },		\
+	{ 5825, DMN_APL1, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5745, DMN_APL2, IEEE80211_RATE_OFDM }, /* UNII-3 */	\
+	{ 5765, DMN_APL2, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_APL2, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_APL2, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5280, DMN_APL3, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5300, DMN_APL3, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_APL3, IEEE80211_RATE_OFDM },		\
+	{ 5745, DMN_APL3, IEEE80211_RATE_OFDM }, /* UNII-3 */	\
+	{ 5765, DMN_APL3, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_APL3, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_APL3, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_APL4, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_APL4, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_APL4, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_APL4, IEEE80211_RATE_OFDM },		\
+	{ 5745, DMN_APL4, IEEE80211_RATE_OFDM }, /* UNII-3 */	\
+	{ 5765, DMN_APL4, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_APL4, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_APL4, IEEE80211_RATE_OFDM },		\
+	{ 5825, DMN_APL4, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5745, DMN_APL5, IEEE80211_RATE_OFDM }, /* UNII-3 */	\
+	{ 5765, DMN_APL5, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_APL5, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_APL5, IEEE80211_RATE_OFDM },		\
+	{ 5825, DMN_APL5, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_ETSI1, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_ETSI1, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5280, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5300, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5500, DMN_ETSI1, IEEE80211_RATE_OFDM }, /* ETSI  */	\
+	{ 5520, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5540, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5560, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5580, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5600, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5620, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5640, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5660, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5680, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+	{ 5700, DMN_ETSI1, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_ETSI2, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_ETSI2, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_ETSI2, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_ETSI2, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_ETSI3, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_ETSI3, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_ETSI3, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_ETSI3, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_ETSI3, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5280, DMN_ETSI3, IEEE80211_RATE_OFDM },		\
+	{ 5300, DMN_ETSI3, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_ETSI3, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_ETSI4, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_ETSI4, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_ETSI4, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_ETSI4, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_ETSI4, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5280, DMN_ETSI4, IEEE80211_RATE_OFDM },		\
+	{ 5300, DMN_ETSI4, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_ETSI4, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_ETSI5, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_ETSI5, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_ETSI5, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_ETSI5, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_ETSI6, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_ETSI6, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5280, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5500, DMN_ETSI6, IEEE80211_RATE_OFDM }, /* ETSI */	\
+	{ 5520, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5540, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5560, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5580, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5600, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5620, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5640, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5660, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5680, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+	{ 5700, DMN_ETSI6, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_FCC1, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5210, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5250, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_FCC1, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5280, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5290, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5300, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5745, DMN_FCC1, IEEE80211_RATE_OFDM }, /* UNII-3 */	\
+	{ 5760, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5765, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5800, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+	{ 5825, DMN_FCC1, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_FCC2, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_FCC2, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5280, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5300, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5745, DMN_FCC2, IEEE80211_RATE_OFDM }, /* UNII-3*/	\
+	{ 5765, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+	{ 5825, DMN_FCC2, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_FCC3, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5210, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5250, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_FCC3, IEEE80211_RATE_OFDM }, /* UNII-2 */	\
+	{ 5280, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5290, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5300, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5500, DMN_FCC3, IEEE80211_RATE_OFDM }, /* ETSI  */	\
+	{ 5520, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5540, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5560, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5580, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5600, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5620, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5640, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5660, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5680, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5700, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5745, DMN_FCC3, IEEE80211_RATE_OFDM }, /* UNII-3 */	\
+	{ 5760, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5765, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5800, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+	{ 5825, DMN_FCC3, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5170, DMN_MKK1, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5190, DMN_MKK1, IEEE80211_RATE_OFDM },		\
+	{ 5210, DMN_MKK1, IEEE80211_RATE_OFDM },		\
+	{ 5230, DMN_MKK1, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5040, DMN_MKK2, IEEE80211_RATE_OFDM }, /* TELEC */	\
+	{ 5060, DMN_MKK2, IEEE80211_RATE_OFDM },		\
+	{ 5080, DMN_MKK2, IEEE80211_RATE_OFDM },		\
+	{ 5170, DMN_MKK2, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5190, DMN_MKK2, IEEE80211_RATE_OFDM },		\
+	{ 5210, DMN_MKK2, IEEE80211_RATE_OFDM },		\
+	{ 5230, DMN_MKK2, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5180, DMN_WORLD, IEEE80211_RATE_OFDM }, /* UNII-1 */	\
+	{ 5200, DMN_WORLD, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_WORLD, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_WORLD, IEEE80211_RATE_OFDM },		\
+								\
+	{ 5005, DMN_DEBUG, IEEE80211_RATE_OFDM }, /* Ch 1 */	\
+	{ 5010, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5015, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5020, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5025, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5030, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5035, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5040, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5045, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5050, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5055, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5060, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5065, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5070, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5075, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5080, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5085, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5090, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5095, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5100, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5105, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5110, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5115, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5120, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5125, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5130, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5135, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5140, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5145, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5150, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5155, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5160, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5165, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5170, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5175, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5180, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5185, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5190, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5195, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5200, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5205, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5210, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5215, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5220, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5225, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5230, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5235, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5240, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5245, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5250, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5255, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5260, DMN_DEBUG, IEEE80211_RATE_OFDM }, 		\
+	{ 5265, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5270, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5275, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5280, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5285, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5290, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5295, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5300, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5305, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5310, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5315, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5320, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5325, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5330, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5335, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5340, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5345, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5350, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5355, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5360, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5365, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5370, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5375, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5380, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5385, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5390, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5395, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5400, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5405, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5410, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5415, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5420, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5425, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5430, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5435, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5440, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5445, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5450, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5455, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5460, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5465, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5470, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5475, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5480, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5485, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5490, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5495, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5500, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5505, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5510, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5515, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5520, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5525, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5530, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5535, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5540, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5545, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5550, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5555, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5560, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5565, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5570, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5575, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5580, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5585, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5590, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5595, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5600, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5605, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5610, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5615, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5620, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5625, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5630, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5635, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5640, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5645, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5650, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5655, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5660, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5665, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5670, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5675, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5680, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5685, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5690, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5695, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5700, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5705, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5710, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5715, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5720, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5725, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5730, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5735, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5740, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5745, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5750, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5755, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5760, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5765, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5770, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5775, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5780, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5785, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5790, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5795, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5800, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5805, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5810, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5815, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5820, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5825, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5830, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5835, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5840, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5845, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5850, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5855, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5860, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5865, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5870, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5875, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5880, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5885, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5890, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5895, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5900, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5905, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5910, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5915, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5920, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5925, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5930, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5935, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5940, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5945, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5950, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5955, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5960, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5965, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5970, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5975, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5980, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5985, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5990, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 5995, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6000, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6005, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6010, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6015, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6020, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6025, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6030, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6035, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6040, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6045, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6050, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6055, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6060, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6065, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6070, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6075, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6080, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6085, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6090, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6095, DMN_DEBUG, IEEE80211_RATE_OFDM },		\
+	{ 6100, DMN_DEBUG, IEEE80211_RATE_OFDM } /* Ch 220 */	\
+}
+
+#define REG_NAMES { \
+	{ DMN_APL1_APLA,	    "APL1A" },		\
+	{ DMN_APL1_ETSIC,	    "APL1_ETSIC" },	\
+	{ DMN_APL1_FCCA,	    "APL1_FCCA" },	\
+	{ DMN_APL1_WORLD,	    "APL1W" },		\
+	{ DMN_APL2_APLC,	    "APL2C" },		\
+	{ DMN_APL2_APLD,	    "APL2D" },		\
+	{ DMN_APL2_ETSIC,	    "APL2_ETSIC" },	\
+	{ DMN_APL2_WORLD,	    "APL2W" },		\
+	{ DMN_APL3_WORLD,	    "APL3W" },		\
+	{ DMN_APL4_WORLD,	    "APL4W" },		\
+	{ DMN_APL5_WORLD,	    "APL5W" },		\
+	{ DMN_ETSI1_WORLD,	    "ETSI1W" },		\
+	{ DMN_ETSI2_WORLD,	    "ETSI2W" },		\
+	{ DMN_ETSI3_ETSIA,	    "ETSI3A" },		\
+	{ DMN_ETSI3_WORLD,	    "ETSI3W" },		\
+	{ DMN_ETSI4_ETSIC,	    "ETSI4C" },		\
+	{ DMN_ETSI4_WORLD,	    "ETSI4W" },		\
+	{ DMN_ETSI5_WORLD,	    "ETSI5W" },		\
+	{ DMN_ETSI6_WORLD,	    "ETSI6W" },		\
+	{ DMN_FCC1_FCCA,	    "FCC1A" },		\
+	{ DMN_FCC1_WORLD,	    "FCC1W" },		\
+	{ DMN_FCC2_ETSIC,	    "FCC2C" },		\
+	{ DMN_FCC2_FCCA,	    "FCC2A" },		\
+	{ DMN_FCC2_WORLD,	    "FCC2W" },		\
+	{ DMN_FCC3_FCCA,	    "FCC3A" },		\
+	{ DMN_MKK1_FCCA,	    "MKK1_FCCA" },	\
+	{ DMN_MKK1_MKKA,	    "MKK1A" },		\
+	{ DMN_MKK1_MKKA1,	    "MKK1A1" },		\
+	{ DMN_MKK1_MKKA2,	    "MKK1A2" },		\
+	{ DMN_MKK1_MKKB,	    "MKK1B" },		\
+	{ DMN_MKK2_MKKA,	    "MKK2A" },		\
+	{ DMN_NULL_ETSIB,	    "ETSIB" },		\
+	{ DMN_NULL_ETSIC,	    "ETSIC" },		\
+	{ DMN_NULL_WORLD,	    "WORLD" },		\
+	{ DMN_DEBUG_DEBUG,	    "DEBUG_DEBUG" }	\
+}
+
+#define REG_MAP {	\
+	{ DMN_NULL_WORLD,	DMN_NULL,	DMN_WORLD },	\
+	{ DMN_NULL_ETSIB,	DMN_NULL,	DMN_ETSIB },	\
+	{ DMN_NULL_ETSIC,	DMN_NULL,	DMN_ETSIC },	\
+	{ DMN_FCC1_WORLD,	DMN_FCC1,	DMN_WORLD },	\
+	{ DMN_FCC1_FCCA,	DMN_FCC1,	DMN_FCCA },	\
+	{ DMN_FCC2_WORLD,	DMN_FCC2,	DMN_WORLD },	\
+	{ DMN_FCC2_FCCA,	DMN_FCC2,	DMN_FCCA },	\
+	{ DMN_FCC2_ETSIC,	DMN_FCC2,	DMN_ETSIC },	\
+	{ DMN_FCC3_FCCA,	DMN_FCC3,	DMN_WORLD },	\
+	{ DMN_ETSI1_WORLD,	DMN_ETSI1,	DMN_WORLD },	\
+	{ DMN_ETSI2_WORLD,	DMN_ETSI2,	DMN_WORLD },	\
+	{ DMN_ETSI3_WORLD,	DMN_ETSI3,	DMN_WORLD },	\
+	{ DMN_ETSI3_ETSIA,	DMN_ETSI3,	DMN_WORLD },	\
+	{ DMN_ETSI4_WORLD,	DMN_ETSI4,	DMN_WORLD },	\
+	{ DMN_ETSI4_ETSIC,	DMN_ETSI4,	DMN_ETSIC },	\
+	{ DMN_ETSI5_WORLD,	DMN_ETSI5,	DMN_WORLD },	\
+	{ DMN_ETSI6_WORLD,	DMN_ETSI6,	DMN_WORLD },	\
+	{ DMN_MKK1_MKKA,	DMN_MKK1,	DMN_MKKA },	\
+	{ DMN_MKK1_MKKB,	DMN_MKK1,	DMN_MKKA },	\
+	{ DMN_MKK1_FCCA,	DMN_MKK1,	DMN_FCCA },	\
+	{ DMN_MKK1_MKKA1,	DMN_MKK1,	DMN_MKKA },	\
+	{ DMN_MKK1_MKKA2,	DMN_MKK1,	DMN_MKKA },	\
+	{ DMN_MKK2_MKKA,	DMN_MKK2,	DMN_MKKA },	\
+	{ DMN_APL1_WORLD,	DMN_APL1,	DMN_WORLD },	\
+	{ DMN_APL1_APLA,	DMN_APL1,	DMN_WORLD },	\
+	{ DMN_APL1_ETSIC,	DMN_APL1,	DMN_ETSIC },	\
+	{ DMN_APL1_FCCA,	DMN_APL1,	DMN_FCCA },	\
+	{ DMN_APL2_WORLD,	DMN_APL2,	DMN_WORLD },	\
+	{ DMN_APL2_ETSIC,	DMN_APL2,	DMN_ETSIC },	\
+	{ DMN_APL2_APLC,	DMN_APL2,	DMN_WORLD },	\
+	{ DMN_APL2_APLD,	DMN_APL2,	DMN_APLD },	\
+	{ DMN_APL3_WORLD,	DMN_APL3,	DMN_WORLD },	\
+	{ DMN_APL4_WORLD,	DMN_APL4,	DMN_WORLD },	\
+	{ DMN_APL5_WORLD,	DMN_APL5,	DMN_WORLD },	\
+	{ DMN_DEBUG_DEBUG,	DMN_DEBUG,	DMN_DEBUG }	\
+}
+
+/* Anything not here gets DMN_NULL_WORLD regdomain */
+#define REG_COUNTRY_NAMES { \
+	{ "00", DMN_NULL_WORLD},	\
+	{ "AM", DMN_ETSI4_WORLD },	\
+	{ "AR", DMN_APL3_WORLD },	\
+	{ "AT", DMN_ETSI5_WORLD },	\
+	{ "AU", DMN_FCC2_WORLD },	\
+	{ "AZ", DMN_ETSI4_WORLD },	\
+	{ "BE", DMN_ETSI4_WORLD },	\
+	{ "BG", DMN_ETSI6_WORLD },	\
+	{ "BN", DMN_APL1_WORLD },	\
+	{ "BO", DMN_APL1_ETSIC },	\
+	{ "BR", DMN_NULL_ETSIC },	\
+	{ "BZ", DMN_NULL_ETSIC },	\
+	{ "CA", DMN_FCC2_FCCA },	\
+	{ "CH", DMN_ETSI2_WORLD },	\
+	{ "CL", DMN_APL5_WORLD },	\
+	{ "CN", DMN_APL1_WORLD },	\
+	{ "CO", DMN_FCC1_FCCA },	\
+	{ "CY", DMN_ETSI1_WORLD },	\
+	{ "CZ", DMN_ETSI3_WORLD },	\
+	{ "DE", DMN_ETSI1_WORLD },	\
+	{ "DK", DMN_ETSI1_WORLD },	\
+	{ "DO", DMN_FCC1_FCCA },	\
+	{ "EE", DMN_ETSI1_WORLD },	\
+	{ "ES", DMN_ETSI1_WORLD },	\
+	{ "F2", DMN_ETSI3_WORLD },	\
+	{ "FI", DMN_ETSI1_WORLD },	\
+	{ "FR", DMN_ETSI3_WORLD },	\
+	{ "GB", DMN_ETSI1_WORLD },	\
+	{ "GE", DMN_ETSI4_WORLD },	\
+	{ "GT", DMN_FCC1_FCCA },	\
+	{ "HK", DMN_FCC2_WORLD },	\
+	{ "HR", DMN_ETSI3_WORLD },	\
+	{ "HU", DMN_ETSI2_WORLD },	\
+	{ "IE", DMN_ETSI1_WORLD },	\
+	{ "IR", DMN_APL1_WORLD },	\
+	{ "IS", DMN_ETSI1_WORLD },	\
+	{ "IT", DMN_ETSI1_WORLD },	\
+	{ "J1", DMN_MKK1_MKKB },	\
+	{ "J2", DMN_MKK1_FCCA },	\
+	{ "J3", DMN_MKK2_MKKA },	\
+	{ "J4", DMN_MKK1_MKKA1 },	\
+	{ "J5", DMN_MKK1_MKKA2 },	\
+	{ "JP", DMN_MKK1_MKKA },	\
+	{ "K2", DMN_APL2_APLD },	\
+	{ "KP", DMN_APL2_WORLD },	\
+	{ "KR", DMN_APL2_WORLD },	\
+	{ "LI", DMN_ETSI2_WORLD },	\
+	{ "LT", DMN_ETSI1_WORLD },	\
+	{ "LU", DMN_ETSI1_WORLD },	\
+	{ "MC", DMN_ETSI4_WORLD },	\
+	{ "MO", DMN_FCC2_WORLD },	\
+	{ "MX", DMN_FCC1_FCCA },	\
+	{ "NL", DMN_ETSI1_WORLD },	\
+	{ "NO", DMN_ETSI1_WORLD },	\
+	{ "NZ", DMN_FCC2_ETSIC },	\
+	{ "PA", DMN_FCC1_FCCA },	\
+	{ "PH", DMN_FCC1_WORLD },	\
+	{ "PL", DMN_ETSI1_WORLD },	\
+	{ "PR", DMN_FCC1_FCCA },	\
+	{ "PT", DMN_ETSI1_WORLD },	\
+	{ "SE", DMN_ETSI1_WORLD },	\
+	{ "SG", DMN_APL4_WORLD },	\
+	{ "SI", DMN_ETSI1_WORLD },	\
+	{ "SK", DMN_ETSI3_WORLD },	\
+	{ "TH", DMN_APL2_WORLD },	\
+	{ "TN", DMN_ETSI3_WORLD },	\
+	{ "TR", DMN_ETSI3_WORLD },	\
+	{ "TT", DMN_ETSI4_WORLD },	\
+	{ "TW", DMN_APL3_WORLD },	\
+	{ "UK", DMN_ETSI1_WORLD },	\
+	{ "US", DMN_FCC1_FCCA },	\
+	{ "UY", DMN_APL2_WORLD },	\
+	{ "UZ", DMN_FCC3_FCCA },	\
+	{ "VE", DMN_APL2_ETSIC },	\
+	{ "ZA", DMN_ETSI1_WORLD },	\
+	{ "99", DMN_DEBUG_DEBUG}	\
+}
+
+#endif /* _REGULATORY_MAP_H_ */
-- 
1.5.2.4


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

  parent reply	other threads:[~2007-09-21 21:04 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-21 20:46 [PATCH 0/5] Add central regulatory domain agent - Patchset I Luis R. Rodriguez
2007-09-21 20:46 ` Dan Williams
2007-09-21 20:47 ` Dan Williams
2007-09-21 21:00 ` [PATCH 1/5] Move standard wireless defintions out of mac80211 Luis R. Rodriguez
2007-09-21 21:17   ` Johannes Berg
2007-09-21 21:33     ` Luis R. Rodriguez
2007-09-24  9:49       ` Joerg Mayer
2007-09-24 17:49         ` Luis R. Rodriguez
2007-09-26 15:01           ` Dan Williams
2007-09-26 15:48             ` Luis R. Rodriguez
2007-09-21 21:04 ` Luis R. Rodriguez [this message]
2007-09-21 21:30   ` [PATCH 3/5] Wireless: add IEEE-802.11 regualtory domain module Johannes Berg
2007-09-21 21:52     ` Luis R. Rodriguez
2007-09-21 21:58       ` Johannes Berg
2007-09-21 22:57         ` Luis R. Rodriguez
2007-09-21 21:07 ` [PATCH 4/5] Wireless: Add regdomain support to cfg80211 Luis R. Rodriguez
2007-09-21 21:08 ` [PATCH 5/5] Wireless: add wireless configfs module Luis R. Rodriguez
2007-09-21 21:17 ` [PATCH 5/5] Wireless: add wireless configfs module - v2 Luis R. Rodriguez
2007-09-21 21:39 ` [PATCH 0/5] Add central regulatory domain agent - Patchset I Dan Williams
2007-09-21 21:49   ` Johannes Berg
2007-09-21 22:00     ` Luis R. Rodriguez
2007-09-22  0:14       ` Luis R. Rodriguez
2007-09-22  0:23         ` Luis R. Rodriguez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070921210437.GG31768@pogo \
    --to=mcgrof@gmail.com \
    --cc=Larry.Finger@lwfinger.net \
    --cc=dsd@gentoo.org \
    --cc=flamingice@sourmilk.net \
    --cc=johannes@sipsolutions.net \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.