cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

reg.c (115902B)


      1/*
      2 * Copyright 2002-2005, Instant802 Networks, Inc.
      3 * Copyright 2005-2006, Devicescape Software, Inc.
      4 * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
      5 * Copyright 2008-2011	Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
      6 * Copyright 2013-2014  Intel Mobile Communications GmbH
      7 * Copyright      2017  Intel Deutschland GmbH
      8 * Copyright (C) 2018 - 2021 Intel Corporation
      9 *
     10 * Permission to use, copy, modify, and/or distribute this software for any
     11 * purpose with or without fee is hereby granted, provided that the above
     12 * copyright notice and this permission notice appear in all copies.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     15 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     16 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     17 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     19 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     20 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     21 */
     22
     23
     24/**
     25 * DOC: Wireless regulatory infrastructure
     26 *
     27 * The usual implementation is for a driver to read a device EEPROM to
     28 * determine which regulatory domain it should be operating under, then
     29 * looking up the allowable channels in a driver-local table and finally
     30 * registering those channels in the wiphy structure.
     31 *
     32 * Another set of compliance enforcement is for drivers to use their
     33 * own compliance limits which can be stored on the EEPROM. The host
     34 * driver or firmware may ensure these are used.
     35 *
     36 * In addition to all this we provide an extra layer of regulatory
     37 * conformance. For drivers which do not have any regulatory
     38 * information CRDA provides the complete regulatory solution.
     39 * For others it provides a community effort on further restrictions
     40 * to enhance compliance.
     41 *
     42 * Note: When number of rules --> infinity we will not be able to
     43 * index on alpha2 any more, instead we'll probably have to
     44 * rely on some SHA1 checksum of the regdomain for example.
     45 *
     46 */
     47
     48#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     49
     50#include <linux/kernel.h>
     51#include <linux/export.h>
     52#include <linux/slab.h>
     53#include <linux/list.h>
     54#include <linux/ctype.h>
     55#include <linux/nl80211.h>
     56#include <linux/platform_device.h>
     57#include <linux/verification.h>
     58#include <linux/moduleparam.h>
     59#include <linux/firmware.h>
     60#include <net/cfg80211.h>
     61#include "core.h"
     62#include "reg.h"
     63#include "rdev-ops.h"
     64#include "nl80211.h"
     65
     66/*
     67 * Grace period we give before making sure all current interfaces reside on
     68 * channels allowed by the current regulatory domain.
     69 */
     70#define REG_ENFORCE_GRACE_MS 60000
     71
     72/**
     73 * enum reg_request_treatment - regulatory request treatment
     74 *
     75 * @REG_REQ_OK: continue processing the regulatory request
     76 * @REG_REQ_IGNORE: ignore the regulatory request
     77 * @REG_REQ_INTERSECT: the regulatory domain resulting from this request should
     78 *	be intersected with the current one.
     79 * @REG_REQ_ALREADY_SET: the regulatory request will not change the current
     80 *	regulatory settings, and no further processing is required.
     81 */
     82enum reg_request_treatment {
     83	REG_REQ_OK,
     84	REG_REQ_IGNORE,
     85	REG_REQ_INTERSECT,
     86	REG_REQ_ALREADY_SET,
     87};
     88
     89static struct regulatory_request core_request_world = {
     90	.initiator = NL80211_REGDOM_SET_BY_CORE,
     91	.alpha2[0] = '0',
     92	.alpha2[1] = '0',
     93	.intersect = false,
     94	.processed = true,
     95	.country_ie_env = ENVIRON_ANY,
     96};
     97
     98/*
     99 * Receipt of information from last regulatory request,
    100 * protected by RTNL (and can be accessed with RCU protection)
    101 */
    102static struct regulatory_request __rcu *last_request =
    103	(void __force __rcu *)&core_request_world;
    104
    105/* To trigger userspace events and load firmware */
    106static struct platform_device *reg_pdev;
    107
    108/*
    109 * Central wireless core regulatory domains, we only need two,
    110 * the current one and a world regulatory domain in case we have no
    111 * information to give us an alpha2.
    112 * (protected by RTNL, can be read under RCU)
    113 */
    114const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
    115
    116/*
    117 * Number of devices that registered to the core
    118 * that support cellular base station regulatory hints
    119 * (protected by RTNL)
    120 */
    121static int reg_num_devs_support_basehint;
    122
    123/*
    124 * State variable indicating if the platform on which the devices
    125 * are attached is operating in an indoor environment. The state variable
    126 * is relevant for all registered devices.
    127 */
    128static bool reg_is_indoor;
    129static DEFINE_SPINLOCK(reg_indoor_lock);
    130
    131/* Used to track the userspace process controlling the indoor setting */
    132static u32 reg_is_indoor_portid;
    133
    134static void restore_regulatory_settings(bool reset_user, bool cached);
    135static void print_regdomain(const struct ieee80211_regdomain *rd);
    136static void reg_process_hint(struct regulatory_request *reg_request);
    137
    138static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
    139{
    140	return rcu_dereference_rtnl(cfg80211_regdomain);
    141}
    142
    143/*
    144 * Returns the regulatory domain associated with the wiphy.
    145 *
    146 * Requires any of RTNL, wiphy mutex or RCU protection.
    147 */
    148const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
    149{
    150	return rcu_dereference_check(wiphy->regd,
    151				     lockdep_is_held(&wiphy->mtx) ||
    152				     lockdep_rtnl_is_held());
    153}
    154EXPORT_SYMBOL(get_wiphy_regdom);
    155
    156static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region)
    157{
    158	switch (dfs_region) {
    159	case NL80211_DFS_UNSET:
    160		return "unset";
    161	case NL80211_DFS_FCC:
    162		return "FCC";
    163	case NL80211_DFS_ETSI:
    164		return "ETSI";
    165	case NL80211_DFS_JP:
    166		return "JP";
    167	}
    168	return "Unknown";
    169}
    170
    171enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy)
    172{
    173	const struct ieee80211_regdomain *regd = NULL;
    174	const struct ieee80211_regdomain *wiphy_regd = NULL;
    175	enum nl80211_dfs_regions dfs_region;
    176
    177	rcu_read_lock();
    178	regd = get_cfg80211_regdom();
    179	dfs_region = regd->dfs_region;
    180
    181	if (!wiphy)
    182		goto out;
    183
    184	wiphy_regd = get_wiphy_regdom(wiphy);
    185	if (!wiphy_regd)
    186		goto out;
    187
    188	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
    189		dfs_region = wiphy_regd->dfs_region;
    190		goto out;
    191	}
    192
    193	if (wiphy_regd->dfs_region == regd->dfs_region)
    194		goto out;
    195
    196	pr_debug("%s: device specific dfs_region (%s) disagrees with cfg80211's central dfs_region (%s)\n",
    197		 dev_name(&wiphy->dev),
    198		 reg_dfs_region_str(wiphy_regd->dfs_region),
    199		 reg_dfs_region_str(regd->dfs_region));
    200
    201out:
    202	rcu_read_unlock();
    203
    204	return dfs_region;
    205}
    206
    207static void rcu_free_regdom(const struct ieee80211_regdomain *r)
    208{
    209	if (!r)
    210		return;
    211	kfree_rcu((struct ieee80211_regdomain *)r, rcu_head);
    212}
    213
    214static struct regulatory_request *get_last_request(void)
    215{
    216	return rcu_dereference_rtnl(last_request);
    217}
    218
    219/* Used to queue up regulatory hints */
    220static LIST_HEAD(reg_requests_list);
    221static DEFINE_SPINLOCK(reg_requests_lock);
    222
    223/* Used to queue up beacon hints for review */
    224static LIST_HEAD(reg_pending_beacons);
    225static DEFINE_SPINLOCK(reg_pending_beacons_lock);
    226
    227/* Used to keep track of processed beacon hints */
    228static LIST_HEAD(reg_beacon_list);
    229
    230struct reg_beacon {
    231	struct list_head list;
    232	struct ieee80211_channel chan;
    233};
    234
    235static void reg_check_chans_work(struct work_struct *work);
    236static DECLARE_DELAYED_WORK(reg_check_chans, reg_check_chans_work);
    237
    238static void reg_todo(struct work_struct *work);
    239static DECLARE_WORK(reg_work, reg_todo);
    240
    241/* We keep a static world regulatory domain in case of the absence of CRDA */
    242static const struct ieee80211_regdomain world_regdom = {
    243	.n_reg_rules = 8,
    244	.alpha2 =  "00",
    245	.reg_rules = {
    246		/* IEEE 802.11b/g, channels 1..11 */
    247		REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
    248		/* IEEE 802.11b/g, channels 12..13. */
    249		REG_RULE(2467-10, 2472+10, 20, 6, 20,
    250			NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW),
    251		/* IEEE 802.11 channel 14 - Only JP enables
    252		 * this and for 802.11b only */
    253		REG_RULE(2484-10, 2484+10, 20, 6, 20,
    254			NL80211_RRF_NO_IR |
    255			NL80211_RRF_NO_OFDM),
    256		/* IEEE 802.11a, channel 36..48 */
    257		REG_RULE(5180-10, 5240+10, 80, 6, 20,
    258                        NL80211_RRF_NO_IR |
    259                        NL80211_RRF_AUTO_BW),
    260
    261		/* IEEE 802.11a, channel 52..64 - DFS required */
    262		REG_RULE(5260-10, 5320+10, 80, 6, 20,
    263			NL80211_RRF_NO_IR |
    264			NL80211_RRF_AUTO_BW |
    265			NL80211_RRF_DFS),
    266
    267		/* IEEE 802.11a, channel 100..144 - DFS required */
    268		REG_RULE(5500-10, 5720+10, 160, 6, 20,
    269			NL80211_RRF_NO_IR |
    270			NL80211_RRF_DFS),
    271
    272		/* IEEE 802.11a, channel 149..165 */
    273		REG_RULE(5745-10, 5825+10, 80, 6, 20,
    274			NL80211_RRF_NO_IR),
    275
    276		/* IEEE 802.11ad (60GHz), channels 1..3 */
    277		REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
    278	}
    279};
    280
    281/* protected by RTNL */
    282static const struct ieee80211_regdomain *cfg80211_world_regdom =
    283	&world_regdom;
    284
    285static char *ieee80211_regdom = "00";
    286static char user_alpha2[2];
    287static const struct ieee80211_regdomain *cfg80211_user_regdom;
    288
    289module_param(ieee80211_regdom, charp, 0444);
    290MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
    291
    292static void reg_free_request(struct regulatory_request *request)
    293{
    294	if (request == &core_request_world)
    295		return;
    296
    297	if (request != get_last_request())
    298		kfree(request);
    299}
    300
    301static void reg_free_last_request(void)
    302{
    303	struct regulatory_request *lr = get_last_request();
    304
    305	if (lr != &core_request_world && lr)
    306		kfree_rcu(lr, rcu_head);
    307}
    308
    309static void reg_update_last_request(struct regulatory_request *request)
    310{
    311	struct regulatory_request *lr;
    312
    313	lr = get_last_request();
    314	if (lr == request)
    315		return;
    316
    317	reg_free_last_request();
    318	rcu_assign_pointer(last_request, request);
    319}
    320
    321static void reset_regdomains(bool full_reset,
    322			     const struct ieee80211_regdomain *new_regdom)
    323{
    324	const struct ieee80211_regdomain *r;
    325
    326	ASSERT_RTNL();
    327
    328	r = get_cfg80211_regdom();
    329
    330	/* avoid freeing static information or freeing something twice */
    331	if (r == cfg80211_world_regdom)
    332		r = NULL;
    333	if (cfg80211_world_regdom == &world_regdom)
    334		cfg80211_world_regdom = NULL;
    335	if (r == &world_regdom)
    336		r = NULL;
    337
    338	rcu_free_regdom(r);
    339	rcu_free_regdom(cfg80211_world_regdom);
    340
    341	cfg80211_world_regdom = &world_regdom;
    342	rcu_assign_pointer(cfg80211_regdomain, new_regdom);
    343
    344	if (!full_reset)
    345		return;
    346
    347	reg_update_last_request(&core_request_world);
    348}
    349
    350/*
    351 * Dynamic world regulatory domain requested by the wireless
    352 * core upon initialization
    353 */
    354static void update_world_regdomain(const struct ieee80211_regdomain *rd)
    355{
    356	struct regulatory_request *lr;
    357
    358	lr = get_last_request();
    359
    360	WARN_ON(!lr);
    361
    362	reset_regdomains(false, rd);
    363
    364	cfg80211_world_regdom = rd;
    365}
    366
    367bool is_world_regdom(const char *alpha2)
    368{
    369	if (!alpha2)
    370		return false;
    371	return alpha2[0] == '0' && alpha2[1] == '0';
    372}
    373
    374static bool is_alpha2_set(const char *alpha2)
    375{
    376	if (!alpha2)
    377		return false;
    378	return alpha2[0] && alpha2[1];
    379}
    380
    381static bool is_unknown_alpha2(const char *alpha2)
    382{
    383	if (!alpha2)
    384		return false;
    385	/*
    386	 * Special case where regulatory domain was built by driver
    387	 * but a specific alpha2 cannot be determined
    388	 */
    389	return alpha2[0] == '9' && alpha2[1] == '9';
    390}
    391
    392static bool is_intersected_alpha2(const char *alpha2)
    393{
    394	if (!alpha2)
    395		return false;
    396	/*
    397	 * Special case where regulatory domain is the
    398	 * result of an intersection between two regulatory domain
    399	 * structures
    400	 */
    401	return alpha2[0] == '9' && alpha2[1] == '8';
    402}
    403
    404static bool is_an_alpha2(const char *alpha2)
    405{
    406	if (!alpha2)
    407		return false;
    408	return isalpha(alpha2[0]) && isalpha(alpha2[1]);
    409}
    410
    411static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
    412{
    413	if (!alpha2_x || !alpha2_y)
    414		return false;
    415	return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1];
    416}
    417
    418static bool regdom_changes(const char *alpha2)
    419{
    420	const struct ieee80211_regdomain *r = get_cfg80211_regdom();
    421
    422	if (!r)
    423		return true;
    424	return !alpha2_equal(r->alpha2, alpha2);
    425}
    426
    427/*
    428 * The NL80211_REGDOM_SET_BY_USER regdom alpha2 is cached, this lets
    429 * you know if a valid regulatory hint with NL80211_REGDOM_SET_BY_USER
    430 * has ever been issued.
    431 */
    432static bool is_user_regdom_saved(void)
    433{
    434	if (user_alpha2[0] == '9' && user_alpha2[1] == '7')
    435		return false;
    436
    437	/* This would indicate a mistake on the design */
    438	if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2),
    439		 "Unexpected user alpha2: %c%c\n",
    440		 user_alpha2[0], user_alpha2[1]))
    441		return false;
    442
    443	return true;
    444}
    445
    446static const struct ieee80211_regdomain *
    447reg_copy_regd(const struct ieee80211_regdomain *src_regd)
    448{
    449	struct ieee80211_regdomain *regd;
    450	unsigned int i;
    451
    452	regd = kzalloc(struct_size(regd, reg_rules, src_regd->n_reg_rules),
    453		       GFP_KERNEL);
    454	if (!regd)
    455		return ERR_PTR(-ENOMEM);
    456
    457	memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));
    458
    459	for (i = 0; i < src_regd->n_reg_rules; i++)
    460		memcpy(&regd->reg_rules[i], &src_regd->reg_rules[i],
    461		       sizeof(struct ieee80211_reg_rule));
    462
    463	return regd;
    464}
    465
    466static void cfg80211_save_user_regdom(const struct ieee80211_regdomain *rd)
    467{
    468	ASSERT_RTNL();
    469
    470	if (!IS_ERR(cfg80211_user_regdom))
    471		kfree(cfg80211_user_regdom);
    472	cfg80211_user_regdom = reg_copy_regd(rd);
    473}
    474
    475struct reg_regdb_apply_request {
    476	struct list_head list;
    477	const struct ieee80211_regdomain *regdom;
    478};
    479
    480static LIST_HEAD(reg_regdb_apply_list);
    481static DEFINE_MUTEX(reg_regdb_apply_mutex);
    482
    483static void reg_regdb_apply(struct work_struct *work)
    484{
    485	struct reg_regdb_apply_request *request;
    486
    487	rtnl_lock();
    488
    489	mutex_lock(&reg_regdb_apply_mutex);
    490	while (!list_empty(&reg_regdb_apply_list)) {
    491		request = list_first_entry(&reg_regdb_apply_list,
    492					   struct reg_regdb_apply_request,
    493					   list);
    494		list_del(&request->list);
    495
    496		set_regdom(request->regdom, REGD_SOURCE_INTERNAL_DB);
    497		kfree(request);
    498	}
    499	mutex_unlock(&reg_regdb_apply_mutex);
    500
    501	rtnl_unlock();
    502}
    503
    504static DECLARE_WORK(reg_regdb_work, reg_regdb_apply);
    505
    506static int reg_schedule_apply(const struct ieee80211_regdomain *regdom)
    507{
    508	struct reg_regdb_apply_request *request;
    509
    510	request = kzalloc(sizeof(struct reg_regdb_apply_request), GFP_KERNEL);
    511	if (!request) {
    512		kfree(regdom);
    513		return -ENOMEM;
    514	}
    515
    516	request->regdom = regdom;
    517
    518	mutex_lock(&reg_regdb_apply_mutex);
    519	list_add_tail(&request->list, &reg_regdb_apply_list);
    520	mutex_unlock(&reg_regdb_apply_mutex);
    521
    522	schedule_work(&reg_regdb_work);
    523	return 0;
    524}
    525
    526#ifdef CONFIG_CFG80211_CRDA_SUPPORT
    527/* Max number of consecutive attempts to communicate with CRDA  */
    528#define REG_MAX_CRDA_TIMEOUTS 10
    529
    530static u32 reg_crda_timeouts;
    531
    532static void crda_timeout_work(struct work_struct *work);
    533static DECLARE_DELAYED_WORK(crda_timeout, crda_timeout_work);
    534
    535static void crda_timeout_work(struct work_struct *work)
    536{
    537	pr_debug("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
    538	rtnl_lock();
    539	reg_crda_timeouts++;
    540	restore_regulatory_settings(true, false);
    541	rtnl_unlock();
    542}
    543
    544static void cancel_crda_timeout(void)
    545{
    546	cancel_delayed_work(&crda_timeout);
    547}
    548
    549static void cancel_crda_timeout_sync(void)
    550{
    551	cancel_delayed_work_sync(&crda_timeout);
    552}
    553
    554static void reset_crda_timeouts(void)
    555{
    556	reg_crda_timeouts = 0;
    557}
    558
    559/*
    560 * This lets us keep regulatory code which is updated on a regulatory
    561 * basis in userspace.
    562 */
    563static int call_crda(const char *alpha2)
    564{
    565	char country[12];
    566	char *env[] = { country, NULL };
    567	int ret;
    568
    569	snprintf(country, sizeof(country), "COUNTRY=%c%c",
    570		 alpha2[0], alpha2[1]);
    571
    572	if (reg_crda_timeouts > REG_MAX_CRDA_TIMEOUTS) {
    573		pr_debug("Exceeded CRDA call max attempts. Not calling CRDA\n");
    574		return -EINVAL;
    575	}
    576
    577	if (!is_world_regdom((char *) alpha2))
    578		pr_debug("Calling CRDA for country: %c%c\n",
    579			 alpha2[0], alpha2[1]);
    580	else
    581		pr_debug("Calling CRDA to update world regulatory domain\n");
    582
    583	ret = kobject_uevent_env(&reg_pdev->dev.kobj, KOBJ_CHANGE, env);
    584	if (ret)
    585		return ret;
    586
    587	queue_delayed_work(system_power_efficient_wq,
    588			   &crda_timeout, msecs_to_jiffies(3142));
    589	return 0;
    590}
    591#else
    592static inline void cancel_crda_timeout(void) {}
    593static inline void cancel_crda_timeout_sync(void) {}
    594static inline void reset_crda_timeouts(void) {}
    595static inline int call_crda(const char *alpha2)
    596{
    597	return -ENODATA;
    598}
    599#endif /* CONFIG_CFG80211_CRDA_SUPPORT */
    600
    601/* code to directly load a firmware database through request_firmware */
    602static const struct fwdb_header *regdb;
    603
    604struct fwdb_country {
    605	u8 alpha2[2];
    606	__be16 coll_ptr;
    607	/* this struct cannot be extended */
    608} __packed __aligned(4);
    609
    610struct fwdb_collection {
    611	u8 len;
    612	u8 n_rules;
    613	u8 dfs_region;
    614	/* no optional data yet */
    615	/* aligned to 2, then followed by __be16 array of rule pointers */
    616} __packed __aligned(4);
    617
    618enum fwdb_flags {
    619	FWDB_FLAG_NO_OFDM	= BIT(0),
    620	FWDB_FLAG_NO_OUTDOOR	= BIT(1),
    621	FWDB_FLAG_DFS		= BIT(2),
    622	FWDB_FLAG_NO_IR		= BIT(3),
    623	FWDB_FLAG_AUTO_BW	= BIT(4),
    624};
    625
    626struct fwdb_wmm_ac {
    627	u8 ecw;
    628	u8 aifsn;
    629	__be16 cot;
    630} __packed;
    631
    632struct fwdb_wmm_rule {
    633	struct fwdb_wmm_ac client[IEEE80211_NUM_ACS];
    634	struct fwdb_wmm_ac ap[IEEE80211_NUM_ACS];
    635} __packed;
    636
    637struct fwdb_rule {
    638	u8 len;
    639	u8 flags;
    640	__be16 max_eirp;
    641	__be32 start, end, max_bw;
    642	/* start of optional data */
    643	__be16 cac_timeout;
    644	__be16 wmm_ptr;
    645} __packed __aligned(4);
    646
    647#define FWDB_MAGIC 0x52474442
    648#define FWDB_VERSION 20
    649
    650struct fwdb_header {
    651	__be32 magic;
    652	__be32 version;
    653	struct fwdb_country country[];
    654} __packed __aligned(4);
    655
    656static int ecw2cw(int ecw)
    657{
    658	return (1 << ecw) - 1;
    659}
    660
    661static bool valid_wmm(struct fwdb_wmm_rule *rule)
    662{
    663	struct fwdb_wmm_ac *ac = (struct fwdb_wmm_ac *)rule;
    664	int i;
    665
    666	for (i = 0; i < IEEE80211_NUM_ACS * 2; i++) {
    667		u16 cw_min = ecw2cw((ac[i].ecw & 0xf0) >> 4);
    668		u16 cw_max = ecw2cw(ac[i].ecw & 0x0f);
    669		u8 aifsn = ac[i].aifsn;
    670
    671		if (cw_min >= cw_max)
    672			return false;
    673
    674		if (aifsn < 1)
    675			return false;
    676	}
    677
    678	return true;
    679}
    680
    681static bool valid_rule(const u8 *data, unsigned int size, u16 rule_ptr)
    682{
    683	struct fwdb_rule *rule = (void *)(data + (rule_ptr << 2));
    684
    685	if ((u8 *)rule + sizeof(rule->len) > data + size)
    686		return false;
    687
    688	/* mandatory fields */
    689	if (rule->len < offsetofend(struct fwdb_rule, max_bw))
    690		return false;
    691	if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) {
    692		u32 wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2;
    693		struct fwdb_wmm_rule *wmm;
    694
    695		if (wmm_ptr + sizeof(struct fwdb_wmm_rule) > size)
    696			return false;
    697
    698		wmm = (void *)(data + wmm_ptr);
    699
    700		if (!valid_wmm(wmm))
    701			return false;
    702	}
    703	return true;
    704}
    705
    706static bool valid_country(const u8 *data, unsigned int size,
    707			  const struct fwdb_country *country)
    708{
    709	unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
    710	struct fwdb_collection *coll = (void *)(data + ptr);
    711	__be16 *rules_ptr;
    712	unsigned int i;
    713
    714	/* make sure we can read len/n_rules */
    715	if ((u8 *)coll + offsetofend(typeof(*coll), n_rules) > data + size)
    716		return false;
    717
    718	/* make sure base struct and all rules fit */
    719	if ((u8 *)coll + ALIGN(coll->len, 2) +
    720	    (coll->n_rules * 2) > data + size)
    721		return false;
    722
    723	/* mandatory fields must exist */
    724	if (coll->len < offsetofend(struct fwdb_collection, dfs_region))
    725		return false;
    726
    727	rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
    728
    729	for (i = 0; i < coll->n_rules; i++) {
    730		u16 rule_ptr = be16_to_cpu(rules_ptr[i]);
    731
    732		if (!valid_rule(data, size, rule_ptr))
    733			return false;
    734	}
    735
    736	return true;
    737}
    738
    739#ifdef CONFIG_CFG80211_REQUIRE_SIGNED_REGDB
    740static struct key *builtin_regdb_keys;
    741
    742static void __init load_keys_from_buffer(const u8 *p, unsigned int buflen)
    743{
    744	const u8 *end = p + buflen;
    745	size_t plen;
    746	key_ref_t key;
    747
    748	while (p < end) {
    749		/* Each cert begins with an ASN.1 SEQUENCE tag and must be more
    750		 * than 256 bytes in size.
    751		 */
    752		if (end - p < 4)
    753			goto dodgy_cert;
    754		if (p[0] != 0x30 &&
    755		    p[1] != 0x82)
    756			goto dodgy_cert;
    757		plen = (p[2] << 8) | p[3];
    758		plen += 4;
    759		if (plen > end - p)
    760			goto dodgy_cert;
    761
    762		key = key_create_or_update(make_key_ref(builtin_regdb_keys, 1),
    763					   "asymmetric", NULL, p, plen,
    764					   ((KEY_POS_ALL & ~KEY_POS_SETATTR) |
    765					    KEY_USR_VIEW | KEY_USR_READ),
    766					   KEY_ALLOC_NOT_IN_QUOTA |
    767					   KEY_ALLOC_BUILT_IN |
    768					   KEY_ALLOC_BYPASS_RESTRICTION);
    769		if (IS_ERR(key)) {
    770			pr_err("Problem loading in-kernel X.509 certificate (%ld)\n",
    771			       PTR_ERR(key));
    772		} else {
    773			pr_notice("Loaded X.509 cert '%s'\n",
    774				  key_ref_to_ptr(key)->description);
    775			key_ref_put(key);
    776		}
    777		p += plen;
    778	}
    779
    780	return;
    781
    782dodgy_cert:
    783	pr_err("Problem parsing in-kernel X.509 certificate list\n");
    784}
    785
    786static int __init load_builtin_regdb_keys(void)
    787{
    788	builtin_regdb_keys =
    789		keyring_alloc(".builtin_regdb_keys",
    790			      KUIDT_INIT(0), KGIDT_INIT(0), current_cred(),
    791			      ((KEY_POS_ALL & ~KEY_POS_SETATTR) |
    792			      KEY_USR_VIEW | KEY_USR_READ | KEY_USR_SEARCH),
    793			      KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
    794	if (IS_ERR(builtin_regdb_keys))
    795		return PTR_ERR(builtin_regdb_keys);
    796
    797	pr_notice("Loading compiled-in X.509 certificates for regulatory database\n");
    798
    799#ifdef CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS
    800	load_keys_from_buffer(shipped_regdb_certs, shipped_regdb_certs_len);
    801#endif
    802#ifdef CONFIG_CFG80211_EXTRA_REGDB_KEYDIR
    803	if (CONFIG_CFG80211_EXTRA_REGDB_KEYDIR[0] != '\0')
    804		load_keys_from_buffer(extra_regdb_certs, extra_regdb_certs_len);
    805#endif
    806
    807	return 0;
    808}
    809
    810MODULE_FIRMWARE("regulatory.db.p7s");
    811
    812static bool regdb_has_valid_signature(const u8 *data, unsigned int size)
    813{
    814	const struct firmware *sig;
    815	bool result;
    816
    817	if (request_firmware(&sig, "regulatory.db.p7s", &reg_pdev->dev))
    818		return false;
    819
    820	result = verify_pkcs7_signature(data, size, sig->data, sig->size,
    821					builtin_regdb_keys,
    822					VERIFYING_UNSPECIFIED_SIGNATURE,
    823					NULL, NULL) == 0;
    824
    825	release_firmware(sig);
    826
    827	return result;
    828}
    829
    830static void free_regdb_keyring(void)
    831{
    832	key_put(builtin_regdb_keys);
    833}
    834#else
    835static int load_builtin_regdb_keys(void)
    836{
    837	return 0;
    838}
    839
    840static bool regdb_has_valid_signature(const u8 *data, unsigned int size)
    841{
    842	return true;
    843}
    844
    845static void free_regdb_keyring(void)
    846{
    847}
    848#endif /* CONFIG_CFG80211_REQUIRE_SIGNED_REGDB */
    849
    850static bool valid_regdb(const u8 *data, unsigned int size)
    851{
    852	const struct fwdb_header *hdr = (void *)data;
    853	const struct fwdb_country *country;
    854
    855	if (size < sizeof(*hdr))
    856		return false;
    857
    858	if (hdr->magic != cpu_to_be32(FWDB_MAGIC))
    859		return false;
    860
    861	if (hdr->version != cpu_to_be32(FWDB_VERSION))
    862		return false;
    863
    864	if (!regdb_has_valid_signature(data, size))
    865		return false;
    866
    867	country = &hdr->country[0];
    868	while ((u8 *)(country + 1) <= data + size) {
    869		if (!country->coll_ptr)
    870			break;
    871		if (!valid_country(data, size, country))
    872			return false;
    873		country++;
    874	}
    875
    876	return true;
    877}
    878
    879static void set_wmm_rule(const struct fwdb_header *db,
    880			 const struct fwdb_country *country,
    881			 const struct fwdb_rule *rule,
    882			 struct ieee80211_reg_rule *rrule)
    883{
    884	struct ieee80211_wmm_rule *wmm_rule = &rrule->wmm_rule;
    885	struct fwdb_wmm_rule *wmm;
    886	unsigned int i, wmm_ptr;
    887
    888	wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2;
    889	wmm = (void *)((u8 *)db + wmm_ptr);
    890
    891	if (!valid_wmm(wmm)) {
    892		pr_err("Invalid regulatory WMM rule %u-%u in domain %c%c\n",
    893		       be32_to_cpu(rule->start), be32_to_cpu(rule->end),
    894		       country->alpha2[0], country->alpha2[1]);
    895		return;
    896	}
    897
    898	for (i = 0; i < IEEE80211_NUM_ACS; i++) {
    899		wmm_rule->client[i].cw_min =
    900			ecw2cw((wmm->client[i].ecw & 0xf0) >> 4);
    901		wmm_rule->client[i].cw_max = ecw2cw(wmm->client[i].ecw & 0x0f);
    902		wmm_rule->client[i].aifsn =  wmm->client[i].aifsn;
    903		wmm_rule->client[i].cot =
    904			1000 * be16_to_cpu(wmm->client[i].cot);
    905		wmm_rule->ap[i].cw_min = ecw2cw((wmm->ap[i].ecw & 0xf0) >> 4);
    906		wmm_rule->ap[i].cw_max = ecw2cw(wmm->ap[i].ecw & 0x0f);
    907		wmm_rule->ap[i].aifsn = wmm->ap[i].aifsn;
    908		wmm_rule->ap[i].cot = 1000 * be16_to_cpu(wmm->ap[i].cot);
    909	}
    910
    911	rrule->has_wmm = true;
    912}
    913
    914static int __regdb_query_wmm(const struct fwdb_header *db,
    915			     const struct fwdb_country *country, int freq,
    916			     struct ieee80211_reg_rule *rrule)
    917{
    918	unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
    919	struct fwdb_collection *coll = (void *)((u8 *)db + ptr);
    920	int i;
    921
    922	for (i = 0; i < coll->n_rules; i++) {
    923		__be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
    924		unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2;
    925		struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr);
    926
    927		if (rule->len < offsetofend(struct fwdb_rule, wmm_ptr))
    928			continue;
    929
    930		if (freq >= KHZ_TO_MHZ(be32_to_cpu(rule->start)) &&
    931		    freq <= KHZ_TO_MHZ(be32_to_cpu(rule->end))) {
    932			set_wmm_rule(db, country, rule, rrule);
    933			return 0;
    934		}
    935	}
    936
    937	return -ENODATA;
    938}
    939
    940int reg_query_regdb_wmm(char *alpha2, int freq, struct ieee80211_reg_rule *rule)
    941{
    942	const struct fwdb_header *hdr = regdb;
    943	const struct fwdb_country *country;
    944
    945	if (!regdb)
    946		return -ENODATA;
    947
    948	if (IS_ERR(regdb))
    949		return PTR_ERR(regdb);
    950
    951	country = &hdr->country[0];
    952	while (country->coll_ptr) {
    953		if (alpha2_equal(alpha2, country->alpha2))
    954			return __regdb_query_wmm(regdb, country, freq, rule);
    955
    956		country++;
    957	}
    958
    959	return -ENODATA;
    960}
    961EXPORT_SYMBOL(reg_query_regdb_wmm);
    962
    963static int regdb_query_country(const struct fwdb_header *db,
    964			       const struct fwdb_country *country)
    965{
    966	unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
    967	struct fwdb_collection *coll = (void *)((u8 *)db + ptr);
    968	struct ieee80211_regdomain *regdom;
    969	unsigned int i;
    970
    971	regdom = kzalloc(struct_size(regdom, reg_rules, coll->n_rules),
    972			 GFP_KERNEL);
    973	if (!regdom)
    974		return -ENOMEM;
    975
    976	regdom->n_reg_rules = coll->n_rules;
    977	regdom->alpha2[0] = country->alpha2[0];
    978	regdom->alpha2[1] = country->alpha2[1];
    979	regdom->dfs_region = coll->dfs_region;
    980
    981	for (i = 0; i < regdom->n_reg_rules; i++) {
    982		__be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
    983		unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2;
    984		struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr);
    985		struct ieee80211_reg_rule *rrule = &regdom->reg_rules[i];
    986
    987		rrule->freq_range.start_freq_khz = be32_to_cpu(rule->start);
    988		rrule->freq_range.end_freq_khz = be32_to_cpu(rule->end);
    989		rrule->freq_range.max_bandwidth_khz = be32_to_cpu(rule->max_bw);
    990
    991		rrule->power_rule.max_antenna_gain = 0;
    992		rrule->power_rule.max_eirp = be16_to_cpu(rule->max_eirp);
    993
    994		rrule->flags = 0;
    995		if (rule->flags & FWDB_FLAG_NO_OFDM)
    996			rrule->flags |= NL80211_RRF_NO_OFDM;
    997		if (rule->flags & FWDB_FLAG_NO_OUTDOOR)
    998			rrule->flags |= NL80211_RRF_NO_OUTDOOR;
    999		if (rule->flags & FWDB_FLAG_DFS)
   1000			rrule->flags |= NL80211_RRF_DFS;
   1001		if (rule->flags & FWDB_FLAG_NO_IR)
   1002			rrule->flags |= NL80211_RRF_NO_IR;
   1003		if (rule->flags & FWDB_FLAG_AUTO_BW)
   1004			rrule->flags |= NL80211_RRF_AUTO_BW;
   1005
   1006		rrule->dfs_cac_ms = 0;
   1007
   1008		/* handle optional data */
   1009		if (rule->len >= offsetofend(struct fwdb_rule, cac_timeout))
   1010			rrule->dfs_cac_ms =
   1011				1000 * be16_to_cpu(rule->cac_timeout);
   1012		if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr))
   1013			set_wmm_rule(db, country, rule, rrule);
   1014	}
   1015
   1016	return reg_schedule_apply(regdom);
   1017}
   1018
   1019static int query_regdb(const char *alpha2)
   1020{
   1021	const struct fwdb_header *hdr = regdb;
   1022	const struct fwdb_country *country;
   1023
   1024	ASSERT_RTNL();
   1025
   1026	if (IS_ERR(regdb))
   1027		return PTR_ERR(regdb);
   1028
   1029	country = &hdr->country[0];
   1030	while (country->coll_ptr) {
   1031		if (alpha2_equal(alpha2, country->alpha2))
   1032			return regdb_query_country(regdb, country);
   1033		country++;
   1034	}
   1035
   1036	return -ENODATA;
   1037}
   1038
   1039static void regdb_fw_cb(const struct firmware *fw, void *context)
   1040{
   1041	int set_error = 0;
   1042	bool restore = true;
   1043	void *db;
   1044
   1045	if (!fw) {
   1046		pr_info("failed to load regulatory.db\n");
   1047		set_error = -ENODATA;
   1048	} else if (!valid_regdb(fw->data, fw->size)) {
   1049		pr_info("loaded regulatory.db is malformed or signature is missing/invalid\n");
   1050		set_error = -EINVAL;
   1051	}
   1052
   1053	rtnl_lock();
   1054	if (regdb && !IS_ERR(regdb)) {
   1055		/* negative case - a bug
   1056		 * positive case - can happen due to race in case of multiple cb's in
   1057		 * queue, due to usage of asynchronous callback
   1058		 *
   1059		 * Either case, just restore and free new db.
   1060		 */
   1061	} else if (set_error) {
   1062		regdb = ERR_PTR(set_error);
   1063	} else if (fw) {
   1064		db = kmemdup(fw->data, fw->size, GFP_KERNEL);
   1065		if (db) {
   1066			regdb = db;
   1067			restore = context && query_regdb(context);
   1068		} else {
   1069			restore = true;
   1070		}
   1071	}
   1072
   1073	if (restore)
   1074		restore_regulatory_settings(true, false);
   1075
   1076	rtnl_unlock();
   1077
   1078	kfree(context);
   1079
   1080	release_firmware(fw);
   1081}
   1082
   1083MODULE_FIRMWARE("regulatory.db");
   1084
   1085static int query_regdb_file(const char *alpha2)
   1086{
   1087	ASSERT_RTNL();
   1088
   1089	if (regdb)
   1090		return query_regdb(alpha2);
   1091
   1092	alpha2 = kmemdup(alpha2, 2, GFP_KERNEL);
   1093	if (!alpha2)
   1094		return -ENOMEM;
   1095
   1096	return request_firmware_nowait(THIS_MODULE, true, "regulatory.db",
   1097				       &reg_pdev->dev, GFP_KERNEL,
   1098				       (void *)alpha2, regdb_fw_cb);
   1099}
   1100
   1101int reg_reload_regdb(void)
   1102{
   1103	const struct firmware *fw;
   1104	void *db;
   1105	int err;
   1106	const struct ieee80211_regdomain *current_regdomain;
   1107	struct regulatory_request *request;
   1108
   1109	err = request_firmware(&fw, "regulatory.db", &reg_pdev->dev);
   1110	if (err)
   1111		return err;
   1112
   1113	if (!valid_regdb(fw->data, fw->size)) {
   1114		err = -ENODATA;
   1115		goto out;
   1116	}
   1117
   1118	db = kmemdup(fw->data, fw->size, GFP_KERNEL);
   1119	if (!db) {
   1120		err = -ENOMEM;
   1121		goto out;
   1122	}
   1123
   1124	rtnl_lock();
   1125	if (!IS_ERR_OR_NULL(regdb))
   1126		kfree(regdb);
   1127	regdb = db;
   1128
   1129	/* reset regulatory domain */
   1130	current_regdomain = get_cfg80211_regdom();
   1131
   1132	request = kzalloc(sizeof(*request), GFP_KERNEL);
   1133	if (!request) {
   1134		err = -ENOMEM;
   1135		goto out_unlock;
   1136	}
   1137
   1138	request->wiphy_idx = WIPHY_IDX_INVALID;
   1139	request->alpha2[0] = current_regdomain->alpha2[0];
   1140	request->alpha2[1] = current_regdomain->alpha2[1];
   1141	request->initiator = NL80211_REGDOM_SET_BY_CORE;
   1142	request->user_reg_hint_type = NL80211_USER_REG_HINT_USER;
   1143
   1144	reg_process_hint(request);
   1145
   1146out_unlock:
   1147	rtnl_unlock();
   1148 out:
   1149	release_firmware(fw);
   1150	return err;
   1151}
   1152
   1153static bool reg_query_database(struct regulatory_request *request)
   1154{
   1155	if (query_regdb_file(request->alpha2) == 0)
   1156		return true;
   1157
   1158	if (call_crda(request->alpha2) == 0)
   1159		return true;
   1160
   1161	return false;
   1162}
   1163
   1164bool reg_is_valid_request(const char *alpha2)
   1165{
   1166	struct regulatory_request *lr = get_last_request();
   1167
   1168	if (!lr || lr->processed)
   1169		return false;
   1170
   1171	return alpha2_equal(lr->alpha2, alpha2);
   1172}
   1173
   1174static const struct ieee80211_regdomain *reg_get_regdomain(struct wiphy *wiphy)
   1175{
   1176	struct regulatory_request *lr = get_last_request();
   1177
   1178	/*
   1179	 * Follow the driver's regulatory domain, if present, unless a country
   1180	 * IE has been processed or a user wants to help complaince further
   1181	 */
   1182	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
   1183	    lr->initiator != NL80211_REGDOM_SET_BY_USER &&
   1184	    wiphy->regd)
   1185		return get_wiphy_regdom(wiphy);
   1186
   1187	return get_cfg80211_regdom();
   1188}
   1189
   1190static unsigned int
   1191reg_get_max_bandwidth_from_range(const struct ieee80211_regdomain *rd,
   1192				 const struct ieee80211_reg_rule *rule)
   1193{
   1194	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
   1195	const struct ieee80211_freq_range *freq_range_tmp;
   1196	const struct ieee80211_reg_rule *tmp;
   1197	u32 start_freq, end_freq, idx, no;
   1198
   1199	for (idx = 0; idx < rd->n_reg_rules; idx++)
   1200		if (rule == &rd->reg_rules[idx])
   1201			break;
   1202
   1203	if (idx == rd->n_reg_rules)
   1204		return 0;
   1205
   1206	/* get start_freq */
   1207	no = idx;
   1208
   1209	while (no) {
   1210		tmp = &rd->reg_rules[--no];
   1211		freq_range_tmp = &tmp->freq_range;
   1212
   1213		if (freq_range_tmp->end_freq_khz < freq_range->start_freq_khz)
   1214			break;
   1215
   1216		freq_range = freq_range_tmp;
   1217	}
   1218
   1219	start_freq = freq_range->start_freq_khz;
   1220
   1221	/* get end_freq */
   1222	freq_range = &rule->freq_range;
   1223	no = idx;
   1224
   1225	while (no < rd->n_reg_rules - 1) {
   1226		tmp = &rd->reg_rules[++no];
   1227		freq_range_tmp = &tmp->freq_range;
   1228
   1229		if (freq_range_tmp->start_freq_khz > freq_range->end_freq_khz)
   1230			break;
   1231
   1232		freq_range = freq_range_tmp;
   1233	}
   1234
   1235	end_freq = freq_range->end_freq_khz;
   1236
   1237	return end_freq - start_freq;
   1238}
   1239
   1240unsigned int reg_get_max_bandwidth(const struct ieee80211_regdomain *rd,
   1241				   const struct ieee80211_reg_rule *rule)
   1242{
   1243	unsigned int bw = reg_get_max_bandwidth_from_range(rd, rule);
   1244
   1245	if (rule->flags & NL80211_RRF_NO_320MHZ)
   1246		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(160));
   1247	if (rule->flags & NL80211_RRF_NO_160MHZ)
   1248		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(80));
   1249	if (rule->flags & NL80211_RRF_NO_80MHZ)
   1250		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(40));
   1251
   1252	/*
   1253	 * HT40+/HT40- limits are handled per-channel. Only limit BW if both
   1254	 * are not allowed.
   1255	 */
   1256	if (rule->flags & NL80211_RRF_NO_HT40MINUS &&
   1257	    rule->flags & NL80211_RRF_NO_HT40PLUS)
   1258		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(20));
   1259
   1260	return bw;
   1261}
   1262
   1263/* Sanity check on a regulatory rule */
   1264static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
   1265{
   1266	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
   1267	u32 freq_diff;
   1268
   1269	if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0)
   1270		return false;
   1271
   1272	if (freq_range->start_freq_khz > freq_range->end_freq_khz)
   1273		return false;
   1274
   1275	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
   1276
   1277	if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
   1278	    freq_range->max_bandwidth_khz > freq_diff)
   1279		return false;
   1280
   1281	return true;
   1282}
   1283
   1284static bool is_valid_rd(const struct ieee80211_regdomain *rd)
   1285{
   1286	const struct ieee80211_reg_rule *reg_rule = NULL;
   1287	unsigned int i;
   1288
   1289	if (!rd->n_reg_rules)
   1290		return false;
   1291
   1292	if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
   1293		return false;
   1294
   1295	for (i = 0; i < rd->n_reg_rules; i++) {
   1296		reg_rule = &rd->reg_rules[i];
   1297		if (!is_valid_reg_rule(reg_rule))
   1298			return false;
   1299	}
   1300
   1301	return true;
   1302}
   1303
   1304/**
   1305 * freq_in_rule_band - tells us if a frequency is in a frequency band
   1306 * @freq_range: frequency rule we want to query
   1307 * @freq_khz: frequency we are inquiring about
   1308 *
   1309 * This lets us know if a specific frequency rule is or is not relevant to
   1310 * a specific frequency's band. Bands are device specific and artificial
   1311 * definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"),
   1312 * however it is safe for now to assume that a frequency rule should not be
   1313 * part of a frequency's band if the start freq or end freq are off by more
   1314 * than 2 GHz for the 2.4 and 5 GHz bands, and by more than 20 GHz for the
   1315 * 60 GHz band.
   1316 * This resolution can be lowered and should be considered as we add
   1317 * regulatory rule support for other "bands".
   1318 **/
   1319static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
   1320			      u32 freq_khz)
   1321{
   1322#define ONE_GHZ_IN_KHZ	1000000
   1323	/*
   1324	 * From 802.11ad: directional multi-gigabit (DMG):
   1325	 * Pertaining to operation in a frequency band containing a channel
   1326	 * with the Channel starting frequency above 45 GHz.
   1327	 */
   1328	u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ?
   1329			20 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ;
   1330	if (abs(freq_khz - freq_range->start_freq_khz) <= limit)
   1331		return true;
   1332	if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
   1333		return true;
   1334	return false;
   1335#undef ONE_GHZ_IN_KHZ
   1336}
   1337
   1338/*
   1339 * Later on we can perhaps use the more restrictive DFS
   1340 * region but we don't have information for that yet so
   1341 * for now simply disallow conflicts.
   1342 */
   1343static enum nl80211_dfs_regions
   1344reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1,
   1345			 const enum nl80211_dfs_regions dfs_region2)
   1346{
   1347	if (dfs_region1 != dfs_region2)
   1348		return NL80211_DFS_UNSET;
   1349	return dfs_region1;
   1350}
   1351
   1352static void reg_wmm_rules_intersect(const struct ieee80211_wmm_ac *wmm_ac1,
   1353				    const struct ieee80211_wmm_ac *wmm_ac2,
   1354				    struct ieee80211_wmm_ac *intersect)
   1355{
   1356	intersect->cw_min = max_t(u16, wmm_ac1->cw_min, wmm_ac2->cw_min);
   1357	intersect->cw_max = max_t(u16, wmm_ac1->cw_max, wmm_ac2->cw_max);
   1358	intersect->cot = min_t(u16, wmm_ac1->cot, wmm_ac2->cot);
   1359	intersect->aifsn = max_t(u8, wmm_ac1->aifsn, wmm_ac2->aifsn);
   1360}
   1361
   1362/*
   1363 * Helper for regdom_intersect(), this does the real
   1364 * mathematical intersection fun
   1365 */
   1366static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
   1367			       const struct ieee80211_regdomain *rd2,
   1368			       const struct ieee80211_reg_rule *rule1,
   1369			       const struct ieee80211_reg_rule *rule2,
   1370			       struct ieee80211_reg_rule *intersected_rule)
   1371{
   1372	const struct ieee80211_freq_range *freq_range1, *freq_range2;
   1373	struct ieee80211_freq_range *freq_range;
   1374	const struct ieee80211_power_rule *power_rule1, *power_rule2;
   1375	struct ieee80211_power_rule *power_rule;
   1376	const struct ieee80211_wmm_rule *wmm_rule1, *wmm_rule2;
   1377	struct ieee80211_wmm_rule *wmm_rule;
   1378	u32 freq_diff, max_bandwidth1, max_bandwidth2;
   1379
   1380	freq_range1 = &rule1->freq_range;
   1381	freq_range2 = &rule2->freq_range;
   1382	freq_range = &intersected_rule->freq_range;
   1383
   1384	power_rule1 = &rule1->power_rule;
   1385	power_rule2 = &rule2->power_rule;
   1386	power_rule = &intersected_rule->power_rule;
   1387
   1388	wmm_rule1 = &rule1->wmm_rule;
   1389	wmm_rule2 = &rule2->wmm_rule;
   1390	wmm_rule = &intersected_rule->wmm_rule;
   1391
   1392	freq_range->start_freq_khz = max(freq_range1->start_freq_khz,
   1393					 freq_range2->start_freq_khz);
   1394	freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
   1395				       freq_range2->end_freq_khz);
   1396
   1397	max_bandwidth1 = freq_range1->max_bandwidth_khz;
   1398	max_bandwidth2 = freq_range2->max_bandwidth_khz;
   1399
   1400	if (rule1->flags & NL80211_RRF_AUTO_BW)
   1401		max_bandwidth1 = reg_get_max_bandwidth(rd1, rule1);
   1402	if (rule2->flags & NL80211_RRF_AUTO_BW)
   1403		max_bandwidth2 = reg_get_max_bandwidth(rd2, rule2);
   1404
   1405	freq_range->max_bandwidth_khz = min(max_bandwidth1, max_bandwidth2);
   1406
   1407	intersected_rule->flags = rule1->flags | rule2->flags;
   1408
   1409	/*
   1410	 * In case NL80211_RRF_AUTO_BW requested for both rules
   1411	 * set AUTO_BW in intersected rule also. Next we will
   1412	 * calculate BW correctly in handle_channel function.
   1413	 * In other case remove AUTO_BW flag while we calculate
   1414	 * maximum bandwidth correctly and auto calculation is
   1415	 * not required.
   1416	 */
   1417	if ((rule1->flags & NL80211_RRF_AUTO_BW) &&
   1418	    (rule2->flags & NL80211_RRF_AUTO_BW))
   1419		intersected_rule->flags |= NL80211_RRF_AUTO_BW;
   1420	else
   1421		intersected_rule->flags &= ~NL80211_RRF_AUTO_BW;
   1422
   1423	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
   1424	if (freq_range->max_bandwidth_khz > freq_diff)
   1425		freq_range->max_bandwidth_khz = freq_diff;
   1426
   1427	power_rule->max_eirp = min(power_rule1->max_eirp,
   1428		power_rule2->max_eirp);
   1429	power_rule->max_antenna_gain = min(power_rule1->max_antenna_gain,
   1430		power_rule2->max_antenna_gain);
   1431
   1432	intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms,
   1433					   rule2->dfs_cac_ms);
   1434
   1435	if (rule1->has_wmm && rule2->has_wmm) {
   1436		u8 ac;
   1437
   1438		for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
   1439			reg_wmm_rules_intersect(&wmm_rule1->client[ac],
   1440						&wmm_rule2->client[ac],
   1441						&wmm_rule->client[ac]);
   1442			reg_wmm_rules_intersect(&wmm_rule1->ap[ac],
   1443						&wmm_rule2->ap[ac],
   1444						&wmm_rule->ap[ac]);
   1445		}
   1446
   1447		intersected_rule->has_wmm = true;
   1448	} else if (rule1->has_wmm) {
   1449		*wmm_rule = *wmm_rule1;
   1450		intersected_rule->has_wmm = true;
   1451	} else if (rule2->has_wmm) {
   1452		*wmm_rule = *wmm_rule2;
   1453		intersected_rule->has_wmm = true;
   1454	} else {
   1455		intersected_rule->has_wmm = false;
   1456	}
   1457
   1458	if (!is_valid_reg_rule(intersected_rule))
   1459		return -EINVAL;
   1460
   1461	return 0;
   1462}
   1463
   1464/* check whether old rule contains new rule */
   1465static bool rule_contains(struct ieee80211_reg_rule *r1,
   1466			  struct ieee80211_reg_rule *r2)
   1467{
   1468	/* for simplicity, currently consider only same flags */
   1469	if (r1->flags != r2->flags)
   1470		return false;
   1471
   1472	/* verify r1 is more restrictive */
   1473	if ((r1->power_rule.max_antenna_gain >
   1474	     r2->power_rule.max_antenna_gain) ||
   1475	    r1->power_rule.max_eirp > r2->power_rule.max_eirp)
   1476		return false;
   1477
   1478	/* make sure r2's range is contained within r1 */
   1479	if (r1->freq_range.start_freq_khz > r2->freq_range.start_freq_khz ||
   1480	    r1->freq_range.end_freq_khz < r2->freq_range.end_freq_khz)
   1481		return false;
   1482
   1483	/* and finally verify that r1.max_bw >= r2.max_bw */
   1484	if (r1->freq_range.max_bandwidth_khz <
   1485	    r2->freq_range.max_bandwidth_khz)
   1486		return false;
   1487
   1488	return true;
   1489}
   1490
   1491/* add or extend current rules. do nothing if rule is already contained */
   1492static void add_rule(struct ieee80211_reg_rule *rule,
   1493		     struct ieee80211_reg_rule *reg_rules, u32 *n_rules)
   1494{
   1495	struct ieee80211_reg_rule *tmp_rule;
   1496	int i;
   1497
   1498	for (i = 0; i < *n_rules; i++) {
   1499		tmp_rule = &reg_rules[i];
   1500		/* rule is already contained - do nothing */
   1501		if (rule_contains(tmp_rule, rule))
   1502			return;
   1503
   1504		/* extend rule if possible */
   1505		if (rule_contains(rule, tmp_rule)) {
   1506			memcpy(tmp_rule, rule, sizeof(*rule));
   1507			return;
   1508		}
   1509	}
   1510
   1511	memcpy(&reg_rules[*n_rules], rule, sizeof(*rule));
   1512	(*n_rules)++;
   1513}
   1514
   1515/**
   1516 * regdom_intersect - do the intersection between two regulatory domains
   1517 * @rd1: first regulatory domain
   1518 * @rd2: second regulatory domain
   1519 *
   1520 * Use this function to get the intersection between two regulatory domains.
   1521 * Once completed we will mark the alpha2 for the rd as intersected, "98",
   1522 * as no one single alpha2 can represent this regulatory domain.
   1523 *
   1524 * Returns a pointer to the regulatory domain structure which will hold the
   1525 * resulting intersection of rules between rd1 and rd2. We will
   1526 * kzalloc() this structure for you.
   1527 */
   1528static struct ieee80211_regdomain *
   1529regdom_intersect(const struct ieee80211_regdomain *rd1,
   1530		 const struct ieee80211_regdomain *rd2)
   1531{
   1532	int r;
   1533	unsigned int x, y;
   1534	unsigned int num_rules = 0;
   1535	const struct ieee80211_reg_rule *rule1, *rule2;
   1536	struct ieee80211_reg_rule intersected_rule;
   1537	struct ieee80211_regdomain *rd;
   1538
   1539	if (!rd1 || !rd2)
   1540		return NULL;
   1541
   1542	/*
   1543	 * First we get a count of the rules we'll need, then we actually
   1544	 * build them. This is to so we can malloc() and free() a
   1545	 * regdomain once. The reason we use reg_rules_intersect() here
   1546	 * is it will return -EINVAL if the rule computed makes no sense.
   1547	 * All rules that do check out OK are valid.
   1548	 */
   1549
   1550	for (x = 0; x < rd1->n_reg_rules; x++) {
   1551		rule1 = &rd1->reg_rules[x];
   1552		for (y = 0; y < rd2->n_reg_rules; y++) {
   1553			rule2 = &rd2->reg_rules[y];
   1554			if (!reg_rules_intersect(rd1, rd2, rule1, rule2,
   1555						 &intersected_rule))
   1556				num_rules++;
   1557		}
   1558	}
   1559
   1560	if (!num_rules)
   1561		return NULL;
   1562
   1563	rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
   1564	if (!rd)
   1565		return NULL;
   1566
   1567	for (x = 0; x < rd1->n_reg_rules; x++) {
   1568		rule1 = &rd1->reg_rules[x];
   1569		for (y = 0; y < rd2->n_reg_rules; y++) {
   1570			rule2 = &rd2->reg_rules[y];
   1571			r = reg_rules_intersect(rd1, rd2, rule1, rule2,
   1572						&intersected_rule);
   1573			/*
   1574			 * No need to memset here the intersected rule here as
   1575			 * we're not using the stack anymore
   1576			 */
   1577			if (r)
   1578				continue;
   1579
   1580			add_rule(&intersected_rule, rd->reg_rules,
   1581				 &rd->n_reg_rules);
   1582		}
   1583	}
   1584
   1585	rd->alpha2[0] = '9';
   1586	rd->alpha2[1] = '8';
   1587	rd->dfs_region = reg_intersect_dfs_region(rd1->dfs_region,
   1588						  rd2->dfs_region);
   1589
   1590	return rd;
   1591}
   1592
   1593/*
   1594 * XXX: add support for the rest of enum nl80211_reg_rule_flags, we may
   1595 * want to just have the channel structure use these
   1596 */
   1597static u32 map_regdom_flags(u32 rd_flags)
   1598{
   1599	u32 channel_flags = 0;
   1600	if (rd_flags & NL80211_RRF_NO_IR_ALL)
   1601		channel_flags |= IEEE80211_CHAN_NO_IR;
   1602	if (rd_flags & NL80211_RRF_DFS)
   1603		channel_flags |= IEEE80211_CHAN_RADAR;
   1604	if (rd_flags & NL80211_RRF_NO_OFDM)
   1605		channel_flags |= IEEE80211_CHAN_NO_OFDM;
   1606	if (rd_flags & NL80211_RRF_NO_OUTDOOR)
   1607		channel_flags |= IEEE80211_CHAN_INDOOR_ONLY;
   1608	if (rd_flags & NL80211_RRF_IR_CONCURRENT)
   1609		channel_flags |= IEEE80211_CHAN_IR_CONCURRENT;
   1610	if (rd_flags & NL80211_RRF_NO_HT40MINUS)
   1611		channel_flags |= IEEE80211_CHAN_NO_HT40MINUS;
   1612	if (rd_flags & NL80211_RRF_NO_HT40PLUS)
   1613		channel_flags |= IEEE80211_CHAN_NO_HT40PLUS;
   1614	if (rd_flags & NL80211_RRF_NO_80MHZ)
   1615		channel_flags |= IEEE80211_CHAN_NO_80MHZ;
   1616	if (rd_flags & NL80211_RRF_NO_160MHZ)
   1617		channel_flags |= IEEE80211_CHAN_NO_160MHZ;
   1618	if (rd_flags & NL80211_RRF_NO_HE)
   1619		channel_flags |= IEEE80211_CHAN_NO_HE;
   1620	if (rd_flags & NL80211_RRF_NO_320MHZ)
   1621		channel_flags |= IEEE80211_CHAN_NO_320MHZ;
   1622	return channel_flags;
   1623}
   1624
   1625static const struct ieee80211_reg_rule *
   1626freq_reg_info_regd(u32 center_freq,
   1627		   const struct ieee80211_regdomain *regd, u32 bw)
   1628{
   1629	int i;
   1630	bool band_rule_found = false;
   1631	bool bw_fits = false;
   1632
   1633	if (!regd)
   1634		return ERR_PTR(-EINVAL);
   1635
   1636	for (i = 0; i < regd->n_reg_rules; i++) {
   1637		const struct ieee80211_reg_rule *rr;
   1638		const struct ieee80211_freq_range *fr = NULL;
   1639
   1640		rr = &regd->reg_rules[i];
   1641		fr = &rr->freq_range;
   1642
   1643		/*
   1644		 * We only need to know if one frequency rule was
   1645		 * in center_freq's band, that's enough, so let's
   1646		 * not overwrite it once found
   1647		 */
   1648		if (!band_rule_found)
   1649			band_rule_found = freq_in_rule_band(fr, center_freq);
   1650
   1651		bw_fits = cfg80211_does_bw_fit_range(fr, center_freq, bw);
   1652
   1653		if (band_rule_found && bw_fits)
   1654			return rr;
   1655	}
   1656
   1657	if (!band_rule_found)
   1658		return ERR_PTR(-ERANGE);
   1659
   1660	return ERR_PTR(-EINVAL);
   1661}
   1662
   1663static const struct ieee80211_reg_rule *
   1664__freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 min_bw)
   1665{
   1666	const struct ieee80211_regdomain *regd = reg_get_regdomain(wiphy);
   1667	static const u32 bws[] = {0, 1, 2, 4, 5, 8, 10, 16, 20};
   1668	const struct ieee80211_reg_rule *reg_rule = ERR_PTR(-ERANGE);
   1669	int i = ARRAY_SIZE(bws) - 1;
   1670	u32 bw;
   1671
   1672	for (bw = MHZ_TO_KHZ(bws[i]); bw >= min_bw; bw = MHZ_TO_KHZ(bws[i--])) {
   1673		reg_rule = freq_reg_info_regd(center_freq, regd, bw);
   1674		if (!IS_ERR(reg_rule))
   1675			return reg_rule;
   1676	}
   1677
   1678	return reg_rule;
   1679}
   1680
   1681const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
   1682					       u32 center_freq)
   1683{
   1684	u32 min_bw = center_freq < MHZ_TO_KHZ(1000) ? 1 : 20;
   1685
   1686	return __freq_reg_info(wiphy, center_freq, MHZ_TO_KHZ(min_bw));
   1687}
   1688EXPORT_SYMBOL(freq_reg_info);
   1689
   1690const char *reg_initiator_name(enum nl80211_reg_initiator initiator)
   1691{
   1692	switch (initiator) {
   1693	case NL80211_REGDOM_SET_BY_CORE:
   1694		return "core";
   1695	case NL80211_REGDOM_SET_BY_USER:
   1696		return "user";
   1697	case NL80211_REGDOM_SET_BY_DRIVER:
   1698		return "driver";
   1699	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
   1700		return "country element";
   1701	default:
   1702		WARN_ON(1);
   1703		return "bug";
   1704	}
   1705}
   1706EXPORT_SYMBOL(reg_initiator_name);
   1707
   1708static uint32_t reg_rule_to_chan_bw_flags(const struct ieee80211_regdomain *regd,
   1709					  const struct ieee80211_reg_rule *reg_rule,
   1710					  const struct ieee80211_channel *chan)
   1711{
   1712	const struct ieee80211_freq_range *freq_range = NULL;
   1713	u32 max_bandwidth_khz, center_freq_khz, bw_flags = 0;
   1714	bool is_s1g = chan->band == NL80211_BAND_S1GHZ;
   1715
   1716	freq_range = &reg_rule->freq_range;
   1717
   1718	max_bandwidth_khz = freq_range->max_bandwidth_khz;
   1719	center_freq_khz = ieee80211_channel_to_khz(chan);
   1720	/* Check if auto calculation requested */
   1721	if (reg_rule->flags & NL80211_RRF_AUTO_BW)
   1722		max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);
   1723
   1724	/* If we get a reg_rule we can assume that at least 5Mhz fit */
   1725	if (!cfg80211_does_bw_fit_range(freq_range,
   1726					center_freq_khz,
   1727					MHZ_TO_KHZ(10)))
   1728		bw_flags |= IEEE80211_CHAN_NO_10MHZ;
   1729	if (!cfg80211_does_bw_fit_range(freq_range,
   1730					center_freq_khz,
   1731					MHZ_TO_KHZ(20)))
   1732		bw_flags |= IEEE80211_CHAN_NO_20MHZ;
   1733
   1734	if (is_s1g) {
   1735		/* S1G is strict about non overlapping channels. We can
   1736		 * calculate which bandwidth is allowed per channel by finding
   1737		 * the largest bandwidth which cleanly divides the freq_range.
   1738		 */
   1739		int edge_offset;
   1740		int ch_bw = max_bandwidth_khz;
   1741
   1742		while (ch_bw) {
   1743			edge_offset = (center_freq_khz - ch_bw / 2) -
   1744				      freq_range->start_freq_khz;
   1745			if (edge_offset % ch_bw == 0) {
   1746				switch (KHZ_TO_MHZ(ch_bw)) {
   1747				case 1:
   1748					bw_flags |= IEEE80211_CHAN_1MHZ;
   1749					break;
   1750				case 2:
   1751					bw_flags |= IEEE80211_CHAN_2MHZ;
   1752					break;
   1753				case 4:
   1754					bw_flags |= IEEE80211_CHAN_4MHZ;
   1755					break;
   1756				case 8:
   1757					bw_flags |= IEEE80211_CHAN_8MHZ;
   1758					break;
   1759				case 16:
   1760					bw_flags |= IEEE80211_CHAN_16MHZ;
   1761					break;
   1762				default:
   1763					/* If we got here, no bandwidths fit on
   1764					 * this frequency, ie. band edge.
   1765					 */
   1766					bw_flags |= IEEE80211_CHAN_DISABLED;
   1767					break;
   1768				}
   1769				break;
   1770			}
   1771			ch_bw /= 2;
   1772		}
   1773	} else {
   1774		if (max_bandwidth_khz < MHZ_TO_KHZ(10))
   1775			bw_flags |= IEEE80211_CHAN_NO_10MHZ;
   1776		if (max_bandwidth_khz < MHZ_TO_KHZ(20))
   1777			bw_flags |= IEEE80211_CHAN_NO_20MHZ;
   1778		if (max_bandwidth_khz < MHZ_TO_KHZ(40))
   1779			bw_flags |= IEEE80211_CHAN_NO_HT40;
   1780		if (max_bandwidth_khz < MHZ_TO_KHZ(80))
   1781			bw_flags |= IEEE80211_CHAN_NO_80MHZ;
   1782		if (max_bandwidth_khz < MHZ_TO_KHZ(160))
   1783			bw_flags |= IEEE80211_CHAN_NO_160MHZ;
   1784		if (max_bandwidth_khz < MHZ_TO_KHZ(320))
   1785			bw_flags |= IEEE80211_CHAN_NO_320MHZ;
   1786	}
   1787	return bw_flags;
   1788}
   1789
   1790static void handle_channel_single_rule(struct wiphy *wiphy,
   1791				       enum nl80211_reg_initiator initiator,
   1792				       struct ieee80211_channel *chan,
   1793				       u32 flags,
   1794				       struct regulatory_request *lr,
   1795				       struct wiphy *request_wiphy,
   1796				       const struct ieee80211_reg_rule *reg_rule)
   1797{
   1798	u32 bw_flags = 0;
   1799	const struct ieee80211_power_rule *power_rule = NULL;
   1800	const struct ieee80211_regdomain *regd;
   1801
   1802	regd = reg_get_regdomain(wiphy);
   1803
   1804	power_rule = &reg_rule->power_rule;
   1805	bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
   1806
   1807	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
   1808	    request_wiphy && request_wiphy == wiphy &&
   1809	    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
   1810		/*
   1811		 * This guarantees the driver's requested regulatory domain
   1812		 * will always be used as a base for further regulatory
   1813		 * settings
   1814		 */
   1815		chan->flags = chan->orig_flags =
   1816			map_regdom_flags(reg_rule->flags) | bw_flags;
   1817		chan->max_antenna_gain = chan->orig_mag =
   1818			(int) MBI_TO_DBI(power_rule->max_antenna_gain);
   1819		chan->max_reg_power = chan->max_power = chan->orig_mpwr =
   1820			(int) MBM_TO_DBM(power_rule->max_eirp);
   1821
   1822		if (chan->flags & IEEE80211_CHAN_RADAR) {
   1823			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
   1824			if (reg_rule->dfs_cac_ms)
   1825				chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
   1826		}
   1827
   1828		return;
   1829	}
   1830
   1831	chan->dfs_state = NL80211_DFS_USABLE;
   1832	chan->dfs_state_entered = jiffies;
   1833
   1834	chan->beacon_found = false;
   1835	chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
   1836	chan->max_antenna_gain =
   1837		min_t(int, chan->orig_mag,
   1838		      MBI_TO_DBI(power_rule->max_antenna_gain));
   1839	chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
   1840
   1841	if (chan->flags & IEEE80211_CHAN_RADAR) {
   1842		if (reg_rule->dfs_cac_ms)
   1843			chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
   1844		else
   1845			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
   1846	}
   1847
   1848	if (chan->orig_mpwr) {
   1849		/*
   1850		 * Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER
   1851		 * will always follow the passed country IE power settings.
   1852		 */
   1853		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
   1854		    wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
   1855			chan->max_power = chan->max_reg_power;
   1856		else
   1857			chan->max_power = min(chan->orig_mpwr,
   1858					      chan->max_reg_power);
   1859	} else
   1860		chan->max_power = chan->max_reg_power;
   1861}
   1862
   1863static void handle_channel_adjacent_rules(struct wiphy *wiphy,
   1864					  enum nl80211_reg_initiator initiator,
   1865					  struct ieee80211_channel *chan,
   1866					  u32 flags,
   1867					  struct regulatory_request *lr,
   1868					  struct wiphy *request_wiphy,
   1869					  const struct ieee80211_reg_rule *rrule1,
   1870					  const struct ieee80211_reg_rule *rrule2,
   1871					  struct ieee80211_freq_range *comb_range)
   1872{
   1873	u32 bw_flags1 = 0;
   1874	u32 bw_flags2 = 0;
   1875	const struct ieee80211_power_rule *power_rule1 = NULL;
   1876	const struct ieee80211_power_rule *power_rule2 = NULL;
   1877	const struct ieee80211_regdomain *regd;
   1878
   1879	regd = reg_get_regdomain(wiphy);
   1880
   1881	power_rule1 = &rrule1->power_rule;
   1882	power_rule2 = &rrule2->power_rule;
   1883	bw_flags1 = reg_rule_to_chan_bw_flags(regd, rrule1, chan);
   1884	bw_flags2 = reg_rule_to_chan_bw_flags(regd, rrule2, chan);
   1885
   1886	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
   1887	    request_wiphy && request_wiphy == wiphy &&
   1888	    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
   1889		/* This guarantees the driver's requested regulatory domain
   1890		 * will always be used as a base for further regulatory
   1891		 * settings
   1892		 */
   1893		chan->flags =
   1894			map_regdom_flags(rrule1->flags) |
   1895			map_regdom_flags(rrule2->flags) |
   1896			bw_flags1 |
   1897			bw_flags2;
   1898		chan->orig_flags = chan->flags;
   1899		chan->max_antenna_gain =
   1900			min_t(int, MBI_TO_DBI(power_rule1->max_antenna_gain),
   1901			      MBI_TO_DBI(power_rule2->max_antenna_gain));
   1902		chan->orig_mag = chan->max_antenna_gain;
   1903		chan->max_reg_power =
   1904			min_t(int, MBM_TO_DBM(power_rule1->max_eirp),
   1905			      MBM_TO_DBM(power_rule2->max_eirp));
   1906		chan->max_power = chan->max_reg_power;
   1907		chan->orig_mpwr = chan->max_reg_power;
   1908
   1909		if (chan->flags & IEEE80211_CHAN_RADAR) {
   1910			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
   1911			if (rrule1->dfs_cac_ms || rrule2->dfs_cac_ms)
   1912				chan->dfs_cac_ms = max_t(unsigned int,
   1913							 rrule1->dfs_cac_ms,
   1914							 rrule2->dfs_cac_ms);
   1915		}
   1916
   1917		return;
   1918	}
   1919
   1920	chan->dfs_state = NL80211_DFS_USABLE;
   1921	chan->dfs_state_entered = jiffies;
   1922
   1923	chan->beacon_found = false;
   1924	chan->flags = flags | bw_flags1 | bw_flags2 |
   1925		      map_regdom_flags(rrule1->flags) |
   1926		      map_regdom_flags(rrule2->flags);
   1927
   1928	/* reg_rule_to_chan_bw_flags may forbids 10 and forbids 20 MHz
   1929	 * (otherwise no adj. rule case), recheck therefore
   1930	 */
   1931	if (cfg80211_does_bw_fit_range(comb_range,
   1932				       ieee80211_channel_to_khz(chan),
   1933				       MHZ_TO_KHZ(10)))
   1934		chan->flags &= ~IEEE80211_CHAN_NO_10MHZ;
   1935	if (cfg80211_does_bw_fit_range(comb_range,
   1936				       ieee80211_channel_to_khz(chan),
   1937				       MHZ_TO_KHZ(20)))
   1938		chan->flags &= ~IEEE80211_CHAN_NO_20MHZ;
   1939
   1940	chan->max_antenna_gain =
   1941		min_t(int, chan->orig_mag,
   1942		      min_t(int,
   1943			    MBI_TO_DBI(power_rule1->max_antenna_gain),
   1944			    MBI_TO_DBI(power_rule2->max_antenna_gain)));
   1945	chan->max_reg_power = min_t(int,
   1946				    MBM_TO_DBM(power_rule1->max_eirp),
   1947				    MBM_TO_DBM(power_rule2->max_eirp));
   1948
   1949	if (chan->flags & IEEE80211_CHAN_RADAR) {
   1950		if (rrule1->dfs_cac_ms || rrule2->dfs_cac_ms)
   1951			chan->dfs_cac_ms = max_t(unsigned int,
   1952						 rrule1->dfs_cac_ms,
   1953						 rrule2->dfs_cac_ms);
   1954		else
   1955			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
   1956	}
   1957
   1958	if (chan->orig_mpwr) {
   1959		/* Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER
   1960		 * will always follow the passed country IE power settings.
   1961		 */
   1962		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
   1963		    wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
   1964			chan->max_power = chan->max_reg_power;
   1965		else
   1966			chan->max_power = min(chan->orig_mpwr,
   1967					      chan->max_reg_power);
   1968	} else {
   1969		chan->max_power = chan->max_reg_power;
   1970	}
   1971}
   1972
   1973/* Note that right now we assume the desired channel bandwidth
   1974 * is always 20 MHz for each individual channel (HT40 uses 20 MHz
   1975 * per channel, the primary and the extension channel).
   1976 */
   1977static void handle_channel(struct wiphy *wiphy,
   1978			   enum nl80211_reg_initiator initiator,
   1979			   struct ieee80211_channel *chan)
   1980{
   1981	const u32 orig_chan_freq = ieee80211_channel_to_khz(chan);
   1982	struct regulatory_request *lr = get_last_request();
   1983	struct wiphy *request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
   1984	const struct ieee80211_reg_rule *rrule = NULL;
   1985	const struct ieee80211_reg_rule *rrule1 = NULL;
   1986	const struct ieee80211_reg_rule *rrule2 = NULL;
   1987
   1988	u32 flags = chan->orig_flags;
   1989
   1990	rrule = freq_reg_info(wiphy, orig_chan_freq);
   1991	if (IS_ERR(rrule)) {
   1992		/* check for adjacent match, therefore get rules for
   1993		 * chan - 20 MHz and chan + 20 MHz and test
   1994		 * if reg rules are adjacent
   1995		 */
   1996		rrule1 = freq_reg_info(wiphy,
   1997				       orig_chan_freq - MHZ_TO_KHZ(20));
   1998		rrule2 = freq_reg_info(wiphy,
   1999				       orig_chan_freq + MHZ_TO_KHZ(20));
   2000		if (!IS_ERR(rrule1) && !IS_ERR(rrule2)) {
   2001			struct ieee80211_freq_range comb_range;
   2002
   2003			if (rrule1->freq_range.end_freq_khz !=
   2004			    rrule2->freq_range.start_freq_khz)
   2005				goto disable_chan;
   2006
   2007			comb_range.start_freq_khz =
   2008				rrule1->freq_range.start_freq_khz;
   2009			comb_range.end_freq_khz =
   2010				rrule2->freq_range.end_freq_khz;
   2011			comb_range.max_bandwidth_khz =
   2012				min_t(u32,
   2013				      rrule1->freq_range.max_bandwidth_khz,
   2014				      rrule2->freq_range.max_bandwidth_khz);
   2015
   2016			if (!cfg80211_does_bw_fit_range(&comb_range,
   2017							orig_chan_freq,
   2018							MHZ_TO_KHZ(20)))
   2019				goto disable_chan;
   2020
   2021			handle_channel_adjacent_rules(wiphy, initiator, chan,
   2022						      flags, lr, request_wiphy,
   2023						      rrule1, rrule2,
   2024						      &comb_range);
   2025			return;
   2026		}
   2027
   2028disable_chan:
   2029		/* We will disable all channels that do not match our
   2030		 * received regulatory rule unless the hint is coming
   2031		 * from a Country IE and the Country IE had no information
   2032		 * about a band. The IEEE 802.11 spec allows for an AP
   2033		 * to send only a subset of the regulatory rules allowed,
   2034		 * so an AP in the US that only supports 2.4 GHz may only send
   2035		 * a country IE with information for the 2.4 GHz band
   2036		 * while 5 GHz is still supported.
   2037		 */
   2038		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
   2039		    PTR_ERR(rrule) == -ERANGE)
   2040			return;
   2041
   2042		if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
   2043		    request_wiphy && request_wiphy == wiphy &&
   2044		    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
   2045			pr_debug("Disabling freq %d.%03d MHz for good\n",
   2046				 chan->center_freq, chan->freq_offset);
   2047			chan->orig_flags |= IEEE80211_CHAN_DISABLED;
   2048			chan->flags = chan->orig_flags;
   2049		} else {
   2050			pr_debug("Disabling freq %d.%03d MHz\n",
   2051				 chan->center_freq, chan->freq_offset);
   2052			chan->flags |= IEEE80211_CHAN_DISABLED;
   2053		}
   2054		return;
   2055	}
   2056
   2057	handle_channel_single_rule(wiphy, initiator, chan, flags, lr,
   2058				   request_wiphy, rrule);
   2059}
   2060
   2061static void handle_band(struct wiphy *wiphy,
   2062			enum nl80211_reg_initiator initiator,
   2063			struct ieee80211_supported_band *sband)
   2064{
   2065	unsigned int i;
   2066
   2067	if (!sband)
   2068		return;
   2069
   2070	for (i = 0; i < sband->n_channels; i++)
   2071		handle_channel(wiphy, initiator, &sband->channels[i]);
   2072}
   2073
   2074static bool reg_request_cell_base(struct regulatory_request *request)
   2075{
   2076	if (request->initiator != NL80211_REGDOM_SET_BY_USER)
   2077		return false;
   2078	return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE;
   2079}
   2080
   2081bool reg_last_request_cell_base(void)
   2082{
   2083	return reg_request_cell_base(get_last_request());
   2084}
   2085
   2086#ifdef CONFIG_CFG80211_REG_CELLULAR_HINTS
   2087/* Core specific check */
   2088static enum reg_request_treatment
   2089reg_ignore_cell_hint(struct regulatory_request *pending_request)
   2090{
   2091	struct regulatory_request *lr = get_last_request();
   2092
   2093	if (!reg_num_devs_support_basehint)
   2094		return REG_REQ_IGNORE;
   2095
   2096	if (reg_request_cell_base(lr) &&
   2097	    !regdom_changes(pending_request->alpha2))
   2098		return REG_REQ_ALREADY_SET;
   2099
   2100	return REG_REQ_OK;
   2101}
   2102
   2103/* Device specific check */
   2104static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
   2105{
   2106	return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS);
   2107}
   2108#else
   2109static enum reg_request_treatment
   2110reg_ignore_cell_hint(struct regulatory_request *pending_request)
   2111{
   2112	return REG_REQ_IGNORE;
   2113}
   2114
   2115static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
   2116{
   2117	return true;
   2118}
   2119#endif
   2120
   2121static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy)
   2122{
   2123	if (wiphy->regulatory_flags & REGULATORY_STRICT_REG &&
   2124	    !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG))
   2125		return true;
   2126	return false;
   2127}
   2128
   2129static bool ignore_reg_update(struct wiphy *wiphy,
   2130			      enum nl80211_reg_initiator initiator)
   2131{
   2132	struct regulatory_request *lr = get_last_request();
   2133
   2134	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
   2135		return true;
   2136
   2137	if (!lr) {
   2138		pr_debug("Ignoring regulatory request set by %s since last_request is not set\n",
   2139			 reg_initiator_name(initiator));
   2140		return true;
   2141	}
   2142
   2143	if (initiator == NL80211_REGDOM_SET_BY_CORE &&
   2144	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
   2145		pr_debug("Ignoring regulatory request set by %s since the driver uses its own custom regulatory domain\n",
   2146			 reg_initiator_name(initiator));
   2147		return true;
   2148	}
   2149
   2150	/*
   2151	 * wiphy->regd will be set once the device has its own
   2152	 * desired regulatory domain set
   2153	 */
   2154	if (wiphy_strict_alpha2_regd(wiphy) && !wiphy->regd &&
   2155	    initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
   2156	    !is_world_regdom(lr->alpha2)) {
   2157		pr_debug("Ignoring regulatory request set by %s since the driver requires its own regulatory domain to be set first\n",
   2158			 reg_initiator_name(initiator));
   2159		return true;
   2160	}
   2161
   2162	if (reg_request_cell_base(lr))
   2163		return reg_dev_ignore_cell_hint(wiphy);
   2164
   2165	return false;
   2166}
   2167
   2168static bool reg_is_world_roaming(struct wiphy *wiphy)
   2169{
   2170	const struct ieee80211_regdomain *cr = get_cfg80211_regdom();
   2171	const struct ieee80211_regdomain *wr = get_wiphy_regdom(wiphy);
   2172	struct regulatory_request *lr = get_last_request();
   2173
   2174	if (is_world_regdom(cr->alpha2) || (wr && is_world_regdom(wr->alpha2)))
   2175		return true;
   2176
   2177	if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
   2178	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
   2179		return true;
   2180
   2181	return false;
   2182}
   2183
   2184static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
   2185			      struct reg_beacon *reg_beacon)
   2186{
   2187	struct ieee80211_supported_band *sband;
   2188	struct ieee80211_channel *chan;
   2189	bool channel_changed = false;
   2190	struct ieee80211_channel chan_before;
   2191
   2192	sband = wiphy->bands[reg_beacon->chan.band];
   2193	chan = &sband->channels[chan_idx];
   2194
   2195	if (likely(!ieee80211_channel_equal(chan, &reg_beacon->chan)))
   2196		return;
   2197
   2198	if (chan->beacon_found)
   2199		return;
   2200
   2201	chan->beacon_found = true;
   2202
   2203	if (!reg_is_world_roaming(wiphy))
   2204		return;
   2205
   2206	if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS)
   2207		return;
   2208
   2209	chan_before = *chan;
   2210
   2211	if (chan->flags & IEEE80211_CHAN_NO_IR) {
   2212		chan->flags &= ~IEEE80211_CHAN_NO_IR;
   2213		channel_changed = true;
   2214	}
   2215
   2216	if (channel_changed)
   2217		nl80211_send_beacon_hint_event(wiphy, &chan_before, chan);
   2218}
   2219
   2220/*
   2221 * Called when a scan on a wiphy finds a beacon on
   2222 * new channel
   2223 */
   2224static void wiphy_update_new_beacon(struct wiphy *wiphy,
   2225				    struct reg_beacon *reg_beacon)
   2226{
   2227	unsigned int i;
   2228	struct ieee80211_supported_band *sband;
   2229
   2230	if (!wiphy->bands[reg_beacon->chan.band])
   2231		return;
   2232
   2233	sband = wiphy->bands[reg_beacon->chan.band];
   2234
   2235	for (i = 0; i < sband->n_channels; i++)
   2236		handle_reg_beacon(wiphy, i, reg_beacon);
   2237}
   2238
   2239/*
   2240 * Called upon reg changes or a new wiphy is added
   2241 */
   2242static void wiphy_update_beacon_reg(struct wiphy *wiphy)
   2243{
   2244	unsigned int i;
   2245	struct ieee80211_supported_band *sband;
   2246	struct reg_beacon *reg_beacon;
   2247
   2248	list_for_each_entry(reg_beacon, &reg_beacon_list, list) {
   2249		if (!wiphy->bands[reg_beacon->chan.band])
   2250			continue;
   2251		sband = wiphy->bands[reg_beacon->chan.band];
   2252		for (i = 0; i < sband->n_channels; i++)
   2253			handle_reg_beacon(wiphy, i, reg_beacon);
   2254	}
   2255}
   2256
   2257/* Reap the advantages of previously found beacons */
   2258static void reg_process_beacons(struct wiphy *wiphy)
   2259{
   2260	/*
   2261	 * Means we are just firing up cfg80211, so no beacons would
   2262	 * have been processed yet.
   2263	 */
   2264	if (!last_request)
   2265		return;
   2266	wiphy_update_beacon_reg(wiphy);
   2267}
   2268
   2269static bool is_ht40_allowed(struct ieee80211_channel *chan)
   2270{
   2271	if (!chan)
   2272		return false;
   2273	if (chan->flags & IEEE80211_CHAN_DISABLED)
   2274		return false;
   2275	/* This would happen when regulatory rules disallow HT40 completely */
   2276	if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
   2277		return false;
   2278	return true;
   2279}
   2280
   2281static void reg_process_ht_flags_channel(struct wiphy *wiphy,
   2282					 struct ieee80211_channel *channel)
   2283{
   2284	struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
   2285	struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
   2286	const struct ieee80211_regdomain *regd;
   2287	unsigned int i;
   2288	u32 flags;
   2289
   2290	if (!is_ht40_allowed(channel)) {
   2291		channel->flags |= IEEE80211_CHAN_NO_HT40;
   2292		return;
   2293	}
   2294
   2295	/*
   2296	 * We need to ensure the extension channels exist to
   2297	 * be able to use HT40- or HT40+, this finds them (or not)
   2298	 */
   2299	for (i = 0; i < sband->n_channels; i++) {
   2300		struct ieee80211_channel *c = &sband->channels[i];
   2301
   2302		if (c->center_freq == (channel->center_freq - 20))
   2303			channel_before = c;
   2304		if (c->center_freq == (channel->center_freq + 20))
   2305			channel_after = c;
   2306	}
   2307
   2308	flags = 0;
   2309	regd = get_wiphy_regdom(wiphy);
   2310	if (regd) {
   2311		const struct ieee80211_reg_rule *reg_rule =
   2312			freq_reg_info_regd(MHZ_TO_KHZ(channel->center_freq),
   2313					   regd, MHZ_TO_KHZ(20));
   2314
   2315		if (!IS_ERR(reg_rule))
   2316			flags = reg_rule->flags;
   2317	}
   2318
   2319	/*
   2320	 * Please note that this assumes target bandwidth is 20 MHz,
   2321	 * if that ever changes we also need to change the below logic
   2322	 * to include that as well.
   2323	 */
   2324	if (!is_ht40_allowed(channel_before) ||
   2325	    flags & NL80211_RRF_NO_HT40MINUS)
   2326		channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
   2327	else
   2328		channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
   2329
   2330	if (!is_ht40_allowed(channel_after) ||
   2331	    flags & NL80211_RRF_NO_HT40PLUS)
   2332		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
   2333	else
   2334		channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
   2335}
   2336
   2337static void reg_process_ht_flags_band(struct wiphy *wiphy,
   2338				      struct ieee80211_supported_band *sband)
   2339{
   2340	unsigned int i;
   2341
   2342	if (!sband)
   2343		return;
   2344
   2345	for (i = 0; i < sband->n_channels; i++)
   2346		reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
   2347}
   2348
   2349static void reg_process_ht_flags(struct wiphy *wiphy)
   2350{
   2351	enum nl80211_band band;
   2352
   2353	if (!wiphy)
   2354		return;
   2355
   2356	for (band = 0; band < NUM_NL80211_BANDS; band++)
   2357		reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
   2358}
   2359
   2360static void reg_call_notifier(struct wiphy *wiphy,
   2361			      struct regulatory_request *request)
   2362{
   2363	if (wiphy->reg_notifier)
   2364		wiphy->reg_notifier(wiphy, request);
   2365}
   2366
   2367static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
   2368{
   2369	struct cfg80211_chan_def chandef = {};
   2370	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
   2371	enum nl80211_iftype iftype;
   2372	bool ret;
   2373
   2374	wdev_lock(wdev);
   2375	iftype = wdev->iftype;
   2376
   2377	/* make sure the interface is active */
   2378	if (!wdev->netdev || !netif_running(wdev->netdev))
   2379		goto wdev_inactive_unlock;
   2380
   2381	switch (iftype) {
   2382	case NL80211_IFTYPE_AP:
   2383	case NL80211_IFTYPE_P2P_GO:
   2384	case NL80211_IFTYPE_MESH_POINT:
   2385		if (!wdev->beacon_interval)
   2386			goto wdev_inactive_unlock;
   2387		chandef = wdev->chandef;
   2388		break;
   2389	case NL80211_IFTYPE_ADHOC:
   2390		if (!wdev->ssid_len)
   2391			goto wdev_inactive_unlock;
   2392		chandef = wdev->chandef;
   2393		break;
   2394	case NL80211_IFTYPE_STATION:
   2395	case NL80211_IFTYPE_P2P_CLIENT:
   2396		if (!wdev->current_bss ||
   2397		    !wdev->current_bss->pub.channel)
   2398			goto wdev_inactive_unlock;
   2399
   2400		if (!rdev->ops->get_channel ||
   2401		    rdev_get_channel(rdev, wdev, &chandef))
   2402			cfg80211_chandef_create(&chandef,
   2403						wdev->current_bss->pub.channel,
   2404						NL80211_CHAN_NO_HT);
   2405		break;
   2406	case NL80211_IFTYPE_MONITOR:
   2407	case NL80211_IFTYPE_AP_VLAN:
   2408	case NL80211_IFTYPE_P2P_DEVICE:
   2409		/* no enforcement required */
   2410		break;
   2411	default:
   2412		/* others not implemented for now */
   2413		WARN_ON(1);
   2414		break;
   2415	}
   2416
   2417	wdev_unlock(wdev);
   2418
   2419	switch (iftype) {
   2420	case NL80211_IFTYPE_AP:
   2421	case NL80211_IFTYPE_P2P_GO:
   2422	case NL80211_IFTYPE_ADHOC:
   2423	case NL80211_IFTYPE_MESH_POINT:
   2424		wiphy_lock(wiphy);
   2425		ret = cfg80211_reg_can_beacon_relax(wiphy, &chandef, iftype);
   2426		wiphy_unlock(wiphy);
   2427
   2428		return ret;
   2429	case NL80211_IFTYPE_STATION:
   2430	case NL80211_IFTYPE_P2P_CLIENT:
   2431		return cfg80211_chandef_usable(wiphy, &chandef,
   2432					       IEEE80211_CHAN_DISABLED);
   2433	default:
   2434		break;
   2435	}
   2436
   2437	return true;
   2438
   2439wdev_inactive_unlock:
   2440	wdev_unlock(wdev);
   2441	return true;
   2442}
   2443
   2444static void reg_leave_invalid_chans(struct wiphy *wiphy)
   2445{
   2446	struct wireless_dev *wdev;
   2447	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
   2448
   2449	ASSERT_RTNL();
   2450
   2451	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
   2452		if (!reg_wdev_chan_valid(wiphy, wdev))
   2453			cfg80211_leave(rdev, wdev);
   2454}
   2455
   2456static void reg_check_chans_work(struct work_struct *work)
   2457{
   2458	struct cfg80211_registered_device *rdev;
   2459
   2460	pr_debug("Verifying active interfaces after reg change\n");
   2461	rtnl_lock();
   2462
   2463	list_for_each_entry(rdev, &cfg80211_rdev_list, list)
   2464		if (!(rdev->wiphy.regulatory_flags &
   2465		      REGULATORY_IGNORE_STALE_KICKOFF))
   2466			reg_leave_invalid_chans(&rdev->wiphy);
   2467
   2468	rtnl_unlock();
   2469}
   2470
   2471static void reg_check_channels(void)
   2472{
   2473	/*
   2474	 * Give usermode a chance to do something nicer (move to another
   2475	 * channel, orderly disconnection), before forcing a disconnection.
   2476	 */
   2477	mod_delayed_work(system_power_efficient_wq,
   2478			 &reg_check_chans,
   2479			 msecs_to_jiffies(REG_ENFORCE_GRACE_MS));
   2480}
   2481
   2482static void wiphy_update_regulatory(struct wiphy *wiphy,
   2483				    enum nl80211_reg_initiator initiator)
   2484{
   2485	enum nl80211_band band;
   2486	struct regulatory_request *lr = get_last_request();
   2487
   2488	if (ignore_reg_update(wiphy, initiator)) {
   2489		/*
   2490		 * Regulatory updates set by CORE are ignored for custom
   2491		 * regulatory cards. Let us notify the changes to the driver,
   2492		 * as some drivers used this to restore its orig_* reg domain.
   2493		 */
   2494		if (initiator == NL80211_REGDOM_SET_BY_CORE &&
   2495		    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG &&
   2496		    !(wiphy->regulatory_flags &
   2497		      REGULATORY_WIPHY_SELF_MANAGED))
   2498			reg_call_notifier(wiphy, lr);
   2499		return;
   2500	}
   2501
   2502	lr->dfs_region = get_cfg80211_regdom()->dfs_region;
   2503
   2504	for (band = 0; band < NUM_NL80211_BANDS; band++)
   2505		handle_band(wiphy, initiator, wiphy->bands[band]);
   2506
   2507	reg_process_beacons(wiphy);
   2508	reg_process_ht_flags(wiphy);
   2509	reg_call_notifier(wiphy, lr);
   2510}
   2511
   2512static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
   2513{
   2514	struct cfg80211_registered_device *rdev;
   2515	struct wiphy *wiphy;
   2516
   2517	ASSERT_RTNL();
   2518
   2519	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
   2520		wiphy = &rdev->wiphy;
   2521		wiphy_update_regulatory(wiphy, initiator);
   2522	}
   2523
   2524	reg_check_channels();
   2525}
   2526
   2527static void handle_channel_custom(struct wiphy *wiphy,
   2528				  struct ieee80211_channel *chan,
   2529				  const struct ieee80211_regdomain *regd,
   2530				  u32 min_bw)
   2531{
   2532	u32 bw_flags = 0;
   2533	const struct ieee80211_reg_rule *reg_rule = NULL;
   2534	const struct ieee80211_power_rule *power_rule = NULL;
   2535	u32 bw, center_freq_khz;
   2536
   2537	center_freq_khz = ieee80211_channel_to_khz(chan);
   2538	for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) {
   2539		reg_rule = freq_reg_info_regd(center_freq_khz, regd, bw);
   2540		if (!IS_ERR(reg_rule))
   2541			break;
   2542	}
   2543
   2544	if (IS_ERR_OR_NULL(reg_rule)) {
   2545		pr_debug("Disabling freq %d.%03d MHz as custom regd has no rule that fits it\n",
   2546			 chan->center_freq, chan->freq_offset);
   2547		if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
   2548			chan->flags |= IEEE80211_CHAN_DISABLED;
   2549		} else {
   2550			chan->orig_flags |= IEEE80211_CHAN_DISABLED;
   2551			chan->flags = chan->orig_flags;
   2552		}
   2553		return;
   2554	}
   2555
   2556	power_rule = &reg_rule->power_rule;
   2557	bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
   2558
   2559	chan->dfs_state_entered = jiffies;
   2560	chan->dfs_state = NL80211_DFS_USABLE;
   2561
   2562	chan->beacon_found = false;
   2563
   2564	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
   2565		chan->flags = chan->orig_flags | bw_flags |
   2566			      map_regdom_flags(reg_rule->flags);
   2567	else
   2568		chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
   2569
   2570	chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
   2571	chan->max_reg_power = chan->max_power =
   2572		(int) MBM_TO_DBM(power_rule->max_eirp);
   2573
   2574	if (chan->flags & IEEE80211_CHAN_RADAR) {
   2575		if (reg_rule->dfs_cac_ms)
   2576			chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
   2577		else
   2578			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
   2579	}
   2580
   2581	chan->max_power = chan->max_reg_power;
   2582}
   2583
   2584static void handle_band_custom(struct wiphy *wiphy,
   2585			       struct ieee80211_supported_band *sband,
   2586			       const struct ieee80211_regdomain *regd)
   2587{
   2588	unsigned int i;
   2589
   2590	if (!sband)
   2591		return;
   2592
   2593	/*
   2594	 * We currently assume that you always want at least 20 MHz,
   2595	 * otherwise channel 12 might get enabled if this rule is
   2596	 * compatible to US, which permits 2402 - 2472 MHz.
   2597	 */
   2598	for (i = 0; i < sband->n_channels; i++)
   2599		handle_channel_custom(wiphy, &sband->channels[i], regd,
   2600				      MHZ_TO_KHZ(20));
   2601}
   2602
   2603/* Used by drivers prior to wiphy registration */
   2604void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
   2605				   const struct ieee80211_regdomain *regd)
   2606{
   2607	const struct ieee80211_regdomain *new_regd, *tmp;
   2608	enum nl80211_band band;
   2609	unsigned int bands_set = 0;
   2610
   2611	WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG),
   2612	     "wiphy should have REGULATORY_CUSTOM_REG\n");
   2613	wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
   2614
   2615	for (band = 0; band < NUM_NL80211_BANDS; band++) {
   2616		if (!wiphy->bands[band])
   2617			continue;
   2618		handle_band_custom(wiphy, wiphy->bands[band], regd);
   2619		bands_set++;
   2620	}
   2621
   2622	/*
   2623	 * no point in calling this if it won't have any effect
   2624	 * on your device's supported bands.
   2625	 */
   2626	WARN_ON(!bands_set);
   2627	new_regd = reg_copy_regd(regd);
   2628	if (IS_ERR(new_regd))
   2629		return;
   2630
   2631	rtnl_lock();
   2632	wiphy_lock(wiphy);
   2633
   2634	tmp = get_wiphy_regdom(wiphy);
   2635	rcu_assign_pointer(wiphy->regd, new_regd);
   2636	rcu_free_regdom(tmp);
   2637
   2638	wiphy_unlock(wiphy);
   2639	rtnl_unlock();
   2640}
   2641EXPORT_SYMBOL(wiphy_apply_custom_regulatory);
   2642
   2643static void reg_set_request_processed(void)
   2644{
   2645	bool need_more_processing = false;
   2646	struct regulatory_request *lr = get_last_request();
   2647
   2648	lr->processed = true;
   2649
   2650	spin_lock(&reg_requests_lock);
   2651	if (!list_empty(&reg_requests_list))
   2652		need_more_processing = true;
   2653	spin_unlock(&reg_requests_lock);
   2654
   2655	cancel_crda_timeout();
   2656
   2657	if (need_more_processing)
   2658		schedule_work(&reg_work);
   2659}
   2660
   2661/**
   2662 * reg_process_hint_core - process core regulatory requests
   2663 * @core_request: a pending core regulatory request
   2664 *
   2665 * The wireless subsystem can use this function to process
   2666 * a regulatory request issued by the regulatory core.
   2667 */
   2668static enum reg_request_treatment
   2669reg_process_hint_core(struct regulatory_request *core_request)
   2670{
   2671	if (reg_query_database(core_request)) {
   2672		core_request->intersect = false;
   2673		core_request->processed = false;
   2674		reg_update_last_request(core_request);
   2675		return REG_REQ_OK;
   2676	}
   2677
   2678	return REG_REQ_IGNORE;
   2679}
   2680
   2681static enum reg_request_treatment
   2682__reg_process_hint_user(struct regulatory_request *user_request)
   2683{
   2684	struct regulatory_request *lr = get_last_request();
   2685
   2686	if (reg_request_cell_base(user_request))
   2687		return reg_ignore_cell_hint(user_request);
   2688
   2689	if (reg_request_cell_base(lr))
   2690		return REG_REQ_IGNORE;
   2691
   2692	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
   2693		return REG_REQ_INTERSECT;
   2694	/*
   2695	 * If the user knows better the user should set the regdom
   2696	 * to their country before the IE is picked up
   2697	 */
   2698	if (lr->initiator == NL80211_REGDOM_SET_BY_USER &&
   2699	    lr->intersect)
   2700		return REG_REQ_IGNORE;
   2701	/*
   2702	 * Process user requests only after previous user/driver/core
   2703	 * requests have been processed
   2704	 */
   2705	if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE ||
   2706	     lr->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
   2707	     lr->initiator == NL80211_REGDOM_SET_BY_USER) &&
   2708	    regdom_changes(lr->alpha2))
   2709		return REG_REQ_IGNORE;
   2710
   2711	if (!regdom_changes(user_request->alpha2))
   2712		return REG_REQ_ALREADY_SET;
   2713
   2714	return REG_REQ_OK;
   2715}
   2716
   2717/**
   2718 * reg_process_hint_user - process user regulatory requests
   2719 * @user_request: a pending user regulatory request
   2720 *
   2721 * The wireless subsystem can use this function to process
   2722 * a regulatory request initiated by userspace.
   2723 */
   2724static enum reg_request_treatment
   2725reg_process_hint_user(struct regulatory_request *user_request)
   2726{
   2727	enum reg_request_treatment treatment;
   2728
   2729	treatment = __reg_process_hint_user(user_request);
   2730	if (treatment == REG_REQ_IGNORE ||
   2731	    treatment == REG_REQ_ALREADY_SET)
   2732		return REG_REQ_IGNORE;
   2733
   2734	user_request->intersect = treatment == REG_REQ_INTERSECT;
   2735	user_request->processed = false;
   2736
   2737	if (reg_query_database(user_request)) {
   2738		reg_update_last_request(user_request);
   2739		user_alpha2[0] = user_request->alpha2[0];
   2740		user_alpha2[1] = user_request->alpha2[1];
   2741		return REG_REQ_OK;
   2742	}
   2743
   2744	return REG_REQ_IGNORE;
   2745}
   2746
   2747static enum reg_request_treatment
   2748__reg_process_hint_driver(struct regulatory_request *driver_request)
   2749{
   2750	struct regulatory_request *lr = get_last_request();
   2751
   2752	if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) {
   2753		if (regdom_changes(driver_request->alpha2))
   2754			return REG_REQ_OK;
   2755		return REG_REQ_ALREADY_SET;
   2756	}
   2757
   2758	/*
   2759	 * This would happen if you unplug and plug your card
   2760	 * back in or if you add a new device for which the previously
   2761	 * loaded card also agrees on the regulatory domain.
   2762	 */
   2763	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
   2764	    !regdom_changes(driver_request->alpha2))
   2765		return REG_REQ_ALREADY_SET;
   2766
   2767	return REG_REQ_INTERSECT;
   2768}
   2769
   2770/**
   2771 * reg_process_hint_driver - process driver regulatory requests
   2772 * @wiphy: the wireless device for the regulatory request
   2773 * @driver_request: a pending driver regulatory request
   2774 *
   2775 * The wireless subsystem can use this function to process
   2776 * a regulatory request issued by an 802.11 driver.
   2777 *
   2778 * Returns one of the different reg request treatment values.
   2779 */
   2780static enum reg_request_treatment
   2781reg_process_hint_driver(struct wiphy *wiphy,
   2782			struct regulatory_request *driver_request)
   2783{
   2784	const struct ieee80211_regdomain *regd, *tmp;
   2785	enum reg_request_treatment treatment;
   2786
   2787	treatment = __reg_process_hint_driver(driver_request);
   2788
   2789	switch (treatment) {
   2790	case REG_REQ_OK:
   2791		break;
   2792	case REG_REQ_IGNORE:
   2793		return REG_REQ_IGNORE;
   2794	case REG_REQ_INTERSECT:
   2795	case REG_REQ_ALREADY_SET:
   2796		regd = reg_copy_regd(get_cfg80211_regdom());
   2797		if (IS_ERR(regd))
   2798			return REG_REQ_IGNORE;
   2799
   2800		tmp = get_wiphy_regdom(wiphy);
   2801		ASSERT_RTNL();
   2802		wiphy_lock(wiphy);
   2803		rcu_assign_pointer(wiphy->regd, regd);
   2804		wiphy_unlock(wiphy);
   2805		rcu_free_regdom(tmp);
   2806	}
   2807
   2808
   2809	driver_request->intersect = treatment == REG_REQ_INTERSECT;
   2810	driver_request->processed = false;
   2811
   2812	/*
   2813	 * Since CRDA will not be called in this case as we already
   2814	 * have applied the requested regulatory domain before we just
   2815	 * inform userspace we have processed the request
   2816	 */
   2817	if (treatment == REG_REQ_ALREADY_SET) {
   2818		nl80211_send_reg_change_event(driver_request);
   2819		reg_update_last_request(driver_request);
   2820		reg_set_request_processed();
   2821		return REG_REQ_ALREADY_SET;
   2822	}
   2823
   2824	if (reg_query_database(driver_request)) {
   2825		reg_update_last_request(driver_request);
   2826		return REG_REQ_OK;
   2827	}
   2828
   2829	return REG_REQ_IGNORE;
   2830}
   2831
   2832static enum reg_request_treatment
   2833__reg_process_hint_country_ie(struct wiphy *wiphy,
   2834			      struct regulatory_request *country_ie_request)
   2835{
   2836	struct wiphy *last_wiphy = NULL;
   2837	struct regulatory_request *lr = get_last_request();
   2838
   2839	if (reg_request_cell_base(lr)) {
   2840		/* Trust a Cell base station over the AP's country IE */
   2841		if (regdom_changes(country_ie_request->alpha2))
   2842			return REG_REQ_IGNORE;
   2843		return REG_REQ_ALREADY_SET;
   2844	} else {
   2845		if (wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)
   2846			return REG_REQ_IGNORE;
   2847	}
   2848
   2849	if (unlikely(!is_an_alpha2(country_ie_request->alpha2)))
   2850		return -EINVAL;
   2851
   2852	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE)
   2853		return REG_REQ_OK;
   2854
   2855	last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
   2856
   2857	if (last_wiphy != wiphy) {
   2858		/*
   2859		 * Two cards with two APs claiming different
   2860		 * Country IE alpha2s. We could
   2861		 * intersect them, but that seems unlikely
   2862		 * to be correct. Reject second one for now.
   2863		 */
   2864		if (regdom_changes(country_ie_request->alpha2))
   2865			return REG_REQ_IGNORE;
   2866		return REG_REQ_ALREADY_SET;
   2867	}
   2868
   2869	if (regdom_changes(country_ie_request->alpha2))
   2870		return REG_REQ_OK;
   2871	return REG_REQ_ALREADY_SET;
   2872}
   2873
   2874/**
   2875 * reg_process_hint_country_ie - process regulatory requests from country IEs
   2876 * @wiphy: the wireless device for the regulatory request
   2877 * @country_ie_request: a regulatory request from a country IE
   2878 *
   2879 * The wireless subsystem can use this function to process
   2880 * a regulatory request issued by a country Information Element.
   2881 *
   2882 * Returns one of the different reg request treatment values.
   2883 */
   2884static enum reg_request_treatment
   2885reg_process_hint_country_ie(struct wiphy *wiphy,
   2886			    struct regulatory_request *country_ie_request)
   2887{
   2888	enum reg_request_treatment treatment;
   2889
   2890	treatment = __reg_process_hint_country_ie(wiphy, country_ie_request);
   2891
   2892	switch (treatment) {
   2893	case REG_REQ_OK:
   2894		break;
   2895	case REG_REQ_IGNORE:
   2896		return REG_REQ_IGNORE;
   2897	case REG_REQ_ALREADY_SET:
   2898		reg_free_request(country_ie_request);
   2899		return REG_REQ_ALREADY_SET;
   2900	case REG_REQ_INTERSECT:
   2901		/*
   2902		 * This doesn't happen yet, not sure we
   2903		 * ever want to support it for this case.
   2904		 */
   2905		WARN_ONCE(1, "Unexpected intersection for country elements");
   2906		return REG_REQ_IGNORE;
   2907	}
   2908
   2909	country_ie_request->intersect = false;
   2910	country_ie_request->processed = false;
   2911
   2912	if (reg_query_database(country_ie_request)) {
   2913		reg_update_last_request(country_ie_request);
   2914		return REG_REQ_OK;
   2915	}
   2916
   2917	return REG_REQ_IGNORE;
   2918}
   2919
   2920bool reg_dfs_domain_same(struct wiphy *wiphy1, struct wiphy *wiphy2)
   2921{
   2922	const struct ieee80211_regdomain *wiphy1_regd = NULL;
   2923	const struct ieee80211_regdomain *wiphy2_regd = NULL;
   2924	const struct ieee80211_regdomain *cfg80211_regd = NULL;
   2925	bool dfs_domain_same;
   2926
   2927	rcu_read_lock();
   2928
   2929	cfg80211_regd = rcu_dereference(cfg80211_regdomain);
   2930	wiphy1_regd = rcu_dereference(wiphy1->regd);
   2931	if (!wiphy1_regd)
   2932		wiphy1_regd = cfg80211_regd;
   2933
   2934	wiphy2_regd = rcu_dereference(wiphy2->regd);
   2935	if (!wiphy2_regd)
   2936		wiphy2_regd = cfg80211_regd;
   2937
   2938	dfs_domain_same = wiphy1_regd->dfs_region == wiphy2_regd->dfs_region;
   2939
   2940	rcu_read_unlock();
   2941
   2942	return dfs_domain_same;
   2943}
   2944
   2945static void reg_copy_dfs_chan_state(struct ieee80211_channel *dst_chan,
   2946				    struct ieee80211_channel *src_chan)
   2947{
   2948	if (!(dst_chan->flags & IEEE80211_CHAN_RADAR) ||
   2949	    !(src_chan->flags & IEEE80211_CHAN_RADAR))
   2950		return;
   2951
   2952	if (dst_chan->flags & IEEE80211_CHAN_DISABLED ||
   2953	    src_chan->flags & IEEE80211_CHAN_DISABLED)
   2954		return;
   2955
   2956	if (src_chan->center_freq == dst_chan->center_freq &&
   2957	    dst_chan->dfs_state == NL80211_DFS_USABLE) {
   2958		dst_chan->dfs_state = src_chan->dfs_state;
   2959		dst_chan->dfs_state_entered = src_chan->dfs_state_entered;
   2960	}
   2961}
   2962
   2963static void wiphy_share_dfs_chan_state(struct wiphy *dst_wiphy,
   2964				       struct wiphy *src_wiphy)
   2965{
   2966	struct ieee80211_supported_band *src_sband, *dst_sband;
   2967	struct ieee80211_channel *src_chan, *dst_chan;
   2968	int i, j, band;
   2969
   2970	if (!reg_dfs_domain_same(dst_wiphy, src_wiphy))
   2971		return;
   2972
   2973	for (band = 0; band < NUM_NL80211_BANDS; band++) {
   2974		dst_sband = dst_wiphy->bands[band];
   2975		src_sband = src_wiphy->bands[band];
   2976		if (!dst_sband || !src_sband)
   2977			continue;
   2978
   2979		for (i = 0; i < dst_sband->n_channels; i++) {
   2980			dst_chan = &dst_sband->channels[i];
   2981			for (j = 0; j < src_sband->n_channels; j++) {
   2982				src_chan = &src_sband->channels[j];
   2983				reg_copy_dfs_chan_state(dst_chan, src_chan);
   2984			}
   2985		}
   2986	}
   2987}
   2988
   2989static void wiphy_all_share_dfs_chan_state(struct wiphy *wiphy)
   2990{
   2991	struct cfg80211_registered_device *rdev;
   2992
   2993	ASSERT_RTNL();
   2994
   2995	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
   2996		if (wiphy == &rdev->wiphy)
   2997			continue;
   2998		wiphy_share_dfs_chan_state(wiphy, &rdev->wiphy);
   2999	}
   3000}
   3001
   3002/* This processes *all* regulatory hints */
   3003static void reg_process_hint(struct regulatory_request *reg_request)
   3004{
   3005	struct wiphy *wiphy = NULL;
   3006	enum reg_request_treatment treatment;
   3007	enum nl80211_reg_initiator initiator = reg_request->initiator;
   3008
   3009	if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
   3010		wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
   3011
   3012	switch (initiator) {
   3013	case NL80211_REGDOM_SET_BY_CORE:
   3014		treatment = reg_process_hint_core(reg_request);
   3015		break;
   3016	case NL80211_REGDOM_SET_BY_USER:
   3017		treatment = reg_process_hint_user(reg_request);
   3018		break;
   3019	case NL80211_REGDOM_SET_BY_DRIVER:
   3020		if (!wiphy)
   3021			goto out_free;
   3022		treatment = reg_process_hint_driver(wiphy, reg_request);
   3023		break;
   3024	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
   3025		if (!wiphy)
   3026			goto out_free;
   3027		treatment = reg_process_hint_country_ie(wiphy, reg_request);
   3028		break;
   3029	default:
   3030		WARN(1, "invalid initiator %d\n", initiator);
   3031		goto out_free;
   3032	}
   3033
   3034	if (treatment == REG_REQ_IGNORE)
   3035		goto out_free;
   3036
   3037	WARN(treatment != REG_REQ_OK && treatment != REG_REQ_ALREADY_SET,
   3038	     "unexpected treatment value %d\n", treatment);
   3039
   3040	/* This is required so that the orig_* parameters are saved.
   3041	 * NOTE: treatment must be set for any case that reaches here!
   3042	 */
   3043	if (treatment == REG_REQ_ALREADY_SET && wiphy &&
   3044	    wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
   3045		wiphy_update_regulatory(wiphy, initiator);
   3046		wiphy_all_share_dfs_chan_state(wiphy);
   3047		reg_check_channels();
   3048	}
   3049
   3050	return;
   3051
   3052out_free:
   3053	reg_free_request(reg_request);
   3054}
   3055
   3056static void notify_self_managed_wiphys(struct regulatory_request *request)
   3057{
   3058	struct cfg80211_registered_device *rdev;
   3059	struct wiphy *wiphy;
   3060
   3061	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
   3062		wiphy = &rdev->wiphy;
   3063		if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
   3064		    request->initiator == NL80211_REGDOM_SET_BY_USER)
   3065			reg_call_notifier(wiphy, request);
   3066	}
   3067}
   3068
   3069/*
   3070 * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_*
   3071 * Regulatory hints come on a first come first serve basis and we
   3072 * must process each one atomically.
   3073 */
   3074static void reg_process_pending_hints(void)
   3075{
   3076	struct regulatory_request *reg_request, *lr;
   3077
   3078	lr = get_last_request();
   3079
   3080	/* When last_request->processed becomes true this will be rescheduled */
   3081	if (lr && !lr->processed) {
   3082		pr_debug("Pending regulatory request, waiting for it to be processed...\n");
   3083		return;
   3084	}
   3085
   3086	spin_lock(&reg_requests_lock);
   3087
   3088	if (list_empty(&reg_requests_list)) {
   3089		spin_unlock(&reg_requests_lock);
   3090		return;
   3091	}
   3092
   3093	reg_request = list_first_entry(&reg_requests_list,
   3094				       struct regulatory_request,
   3095				       list);
   3096	list_del_init(&reg_request->list);
   3097
   3098	spin_unlock(&reg_requests_lock);
   3099
   3100	notify_self_managed_wiphys(reg_request);
   3101
   3102	reg_process_hint(reg_request);
   3103
   3104	lr = get_last_request();
   3105
   3106	spin_lock(&reg_requests_lock);
   3107	if (!list_empty(&reg_requests_list) && lr && lr->processed)
   3108		schedule_work(&reg_work);
   3109	spin_unlock(&reg_requests_lock);
   3110}
   3111
   3112/* Processes beacon hints -- this has nothing to do with country IEs */
   3113static void reg_process_pending_beacon_hints(void)
   3114{
   3115	struct cfg80211_registered_device *rdev;
   3116	struct reg_beacon *pending_beacon, *tmp;
   3117
   3118	/* This goes through the _pending_ beacon list */
   3119	spin_lock_bh(&reg_pending_beacons_lock);
   3120
   3121	list_for_each_entry_safe(pending_beacon, tmp,
   3122				 &reg_pending_beacons, list) {
   3123		list_del_init(&pending_beacon->list);
   3124
   3125		/* Applies the beacon hint to current wiphys */
   3126		list_for_each_entry(rdev, &cfg80211_rdev_list, list)
   3127			wiphy_update_new_beacon(&rdev->wiphy, pending_beacon);
   3128
   3129		/* Remembers the beacon hint for new wiphys or reg changes */
   3130		list_add_tail(&pending_beacon->list, &reg_beacon_list);
   3131	}
   3132
   3133	spin_unlock_bh(&reg_pending_beacons_lock);
   3134}
   3135
   3136static void reg_process_self_managed_hint(struct wiphy *wiphy)
   3137{
   3138	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
   3139	const struct ieee80211_regdomain *tmp;
   3140	const struct ieee80211_regdomain *regd;
   3141	enum nl80211_band band;
   3142	struct regulatory_request request = {};
   3143
   3144	ASSERT_RTNL();
   3145	lockdep_assert_wiphy(wiphy);
   3146
   3147	spin_lock(&reg_requests_lock);
   3148	regd = rdev->requested_regd;
   3149	rdev->requested_regd = NULL;
   3150	spin_unlock(&reg_requests_lock);
   3151
   3152	if (!regd)
   3153		return;
   3154
   3155	tmp = get_wiphy_regdom(wiphy);
   3156	rcu_assign_pointer(wiphy->regd, regd);
   3157	rcu_free_regdom(tmp);
   3158
   3159	for (band = 0; band < NUM_NL80211_BANDS; band++)
   3160		handle_band_custom(wiphy, wiphy->bands[band], regd);
   3161
   3162	reg_process_ht_flags(wiphy);
   3163
   3164	request.wiphy_idx = get_wiphy_idx(wiphy);
   3165	request.alpha2[0] = regd->alpha2[0];
   3166	request.alpha2[1] = regd->alpha2[1];
   3167	request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
   3168
   3169	nl80211_send_wiphy_reg_change_event(&request);
   3170}
   3171
   3172static void reg_process_self_managed_hints(void)
   3173{
   3174	struct cfg80211_registered_device *rdev;
   3175
   3176	ASSERT_RTNL();
   3177
   3178	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
   3179		wiphy_lock(&rdev->wiphy);
   3180		reg_process_self_managed_hint(&rdev->wiphy);
   3181		wiphy_unlock(&rdev->wiphy);
   3182	}
   3183
   3184	reg_check_channels();
   3185}
   3186
   3187static void reg_todo(struct work_struct *work)
   3188{
   3189	rtnl_lock();
   3190	reg_process_pending_hints();
   3191	reg_process_pending_beacon_hints();
   3192	reg_process_self_managed_hints();
   3193	rtnl_unlock();
   3194}
   3195
   3196static void queue_regulatory_request(struct regulatory_request *request)
   3197{
   3198	request->alpha2[0] = toupper(request->alpha2[0]);
   3199	request->alpha2[1] = toupper(request->alpha2[1]);
   3200
   3201	spin_lock(&reg_requests_lock);
   3202	list_add_tail(&request->list, &reg_requests_list);
   3203	spin_unlock(&reg_requests_lock);
   3204
   3205	schedule_work(&reg_work);
   3206}
   3207
   3208/*
   3209 * Core regulatory hint -- happens during cfg80211_init()
   3210 * and when we restore regulatory settings.
   3211 */
   3212static int regulatory_hint_core(const char *alpha2)
   3213{
   3214	struct regulatory_request *request;
   3215
   3216	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
   3217	if (!request)
   3218		return -ENOMEM;
   3219
   3220	request->alpha2[0] = alpha2[0];
   3221	request->alpha2[1] = alpha2[1];
   3222	request->initiator = NL80211_REGDOM_SET_BY_CORE;
   3223	request->wiphy_idx = WIPHY_IDX_INVALID;
   3224
   3225	queue_regulatory_request(request);
   3226
   3227	return 0;
   3228}
   3229
   3230/* User hints */
   3231int regulatory_hint_user(const char *alpha2,
   3232			 enum nl80211_user_reg_hint_type user_reg_hint_type)
   3233{
   3234	struct regulatory_request *request;
   3235
   3236	if (WARN_ON(!alpha2))
   3237		return -EINVAL;
   3238
   3239	if (!is_world_regdom(alpha2) && !is_an_alpha2(alpha2))
   3240		return -EINVAL;
   3241
   3242	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
   3243	if (!request)
   3244		return -ENOMEM;
   3245
   3246	request->wiphy_idx = WIPHY_IDX_INVALID;
   3247	request->alpha2[0] = alpha2[0];
   3248	request->alpha2[1] = alpha2[1];
   3249	request->initiator = NL80211_REGDOM_SET_BY_USER;
   3250	request->user_reg_hint_type = user_reg_hint_type;
   3251
   3252	/* Allow calling CRDA again */
   3253	reset_crda_timeouts();
   3254
   3255	queue_regulatory_request(request);
   3256
   3257	return 0;
   3258}
   3259
   3260int regulatory_hint_indoor(bool is_indoor, u32 portid)
   3261{
   3262	spin_lock(&reg_indoor_lock);
   3263
   3264	/* It is possible that more than one user space process is trying to
   3265	 * configure the indoor setting. To handle such cases, clear the indoor
   3266	 * setting in case that some process does not think that the device
   3267	 * is operating in an indoor environment. In addition, if a user space
   3268	 * process indicates that it is controlling the indoor setting, save its
   3269	 * portid, i.e., make it the owner.
   3270	 */
   3271	reg_is_indoor = is_indoor;
   3272	if (reg_is_indoor) {
   3273		if (!reg_is_indoor_portid)
   3274			reg_is_indoor_portid = portid;
   3275	} else {
   3276		reg_is_indoor_portid = 0;
   3277	}
   3278
   3279	spin_unlock(&reg_indoor_lock);
   3280
   3281	if (!is_indoor)
   3282		reg_check_channels();
   3283
   3284	return 0;
   3285}
   3286
   3287void regulatory_netlink_notify(u32 portid)
   3288{
   3289	spin_lock(&reg_indoor_lock);
   3290
   3291	if (reg_is_indoor_portid != portid) {
   3292		spin_unlock(&reg_indoor_lock);
   3293		return;
   3294	}
   3295
   3296	reg_is_indoor = false;
   3297	reg_is_indoor_portid = 0;
   3298
   3299	spin_unlock(&reg_indoor_lock);
   3300
   3301	reg_check_channels();
   3302}
   3303
   3304/* Driver hints */
   3305int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
   3306{
   3307	struct regulatory_request *request;
   3308
   3309	if (WARN_ON(!alpha2 || !wiphy))
   3310		return -EINVAL;
   3311
   3312	wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG;
   3313
   3314	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
   3315	if (!request)
   3316		return -ENOMEM;
   3317
   3318	request->wiphy_idx = get_wiphy_idx(wiphy);
   3319
   3320	request->alpha2[0] = alpha2[0];
   3321	request->alpha2[1] = alpha2[1];
   3322	request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
   3323
   3324	/* Allow calling CRDA again */
   3325	reset_crda_timeouts();
   3326
   3327	queue_regulatory_request(request);
   3328
   3329	return 0;
   3330}
   3331EXPORT_SYMBOL(regulatory_hint);
   3332
   3333void regulatory_hint_country_ie(struct wiphy *wiphy, enum nl80211_band band,
   3334				const u8 *country_ie, u8 country_ie_len)
   3335{
   3336	char alpha2[2];
   3337	enum environment_cap env = ENVIRON_ANY;
   3338	struct regulatory_request *request = NULL, *lr;
   3339
   3340	/* IE len must be evenly divisible by 2 */
   3341	if (country_ie_len & 0x01)
   3342		return;
   3343
   3344	if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
   3345		return;
   3346
   3347	request = kzalloc(sizeof(*request), GFP_KERNEL);
   3348	if (!request)
   3349		return;
   3350
   3351	alpha2[0] = country_ie[0];
   3352	alpha2[1] = country_ie[1];
   3353
   3354	if (country_ie[2] == 'I')
   3355		env = ENVIRON_INDOOR;
   3356	else if (country_ie[2] == 'O')
   3357		env = ENVIRON_OUTDOOR;
   3358
   3359	rcu_read_lock();
   3360	lr = get_last_request();
   3361
   3362	if (unlikely(!lr))
   3363		goto out;
   3364
   3365	/*
   3366	 * We will run this only upon a successful connection on cfg80211.
   3367	 * We leave conflict resolution to the workqueue, where can hold
   3368	 * the RTNL.
   3369	 */
   3370	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
   3371	    lr->wiphy_idx != WIPHY_IDX_INVALID)
   3372		goto out;
   3373
   3374	request->wiphy_idx = get_wiphy_idx(wiphy);
   3375	request->alpha2[0] = alpha2[0];
   3376	request->alpha2[1] = alpha2[1];
   3377	request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
   3378	request->country_ie_env = env;
   3379
   3380	/* Allow calling CRDA again */
   3381	reset_crda_timeouts();
   3382
   3383	queue_regulatory_request(request);
   3384	request = NULL;
   3385out:
   3386	kfree(request);
   3387	rcu_read_unlock();
   3388}
   3389
   3390static void restore_alpha2(char *alpha2, bool reset_user)
   3391{
   3392	/* indicates there is no alpha2 to consider for restoration */
   3393	alpha2[0] = '9';
   3394	alpha2[1] = '7';
   3395
   3396	/* The user setting has precedence over the module parameter */
   3397	if (is_user_regdom_saved()) {
   3398		/* Unless we're asked to ignore it and reset it */
   3399		if (reset_user) {
   3400			pr_debug("Restoring regulatory settings including user preference\n");
   3401			user_alpha2[0] = '9';
   3402			user_alpha2[1] = '7';
   3403
   3404			/*
   3405			 * If we're ignoring user settings, we still need to
   3406			 * check the module parameter to ensure we put things
   3407			 * back as they were for a full restore.
   3408			 */
   3409			if (!is_world_regdom(ieee80211_regdom)) {
   3410				pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
   3411					 ieee80211_regdom[0], ieee80211_regdom[1]);
   3412				alpha2[0] = ieee80211_regdom[0];
   3413				alpha2[1] = ieee80211_regdom[1];
   3414			}
   3415		} else {
   3416			pr_debug("Restoring regulatory settings while preserving user preference for: %c%c\n",
   3417				 user_alpha2[0], user_alpha2[1]);
   3418			alpha2[0] = user_alpha2[0];
   3419			alpha2[1] = user_alpha2[1];
   3420		}
   3421	} else if (!is_world_regdom(ieee80211_regdom)) {
   3422		pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
   3423			 ieee80211_regdom[0], ieee80211_regdom[1]);
   3424		alpha2[0] = ieee80211_regdom[0];
   3425		alpha2[1] = ieee80211_regdom[1];
   3426	} else
   3427		pr_debug("Restoring regulatory settings\n");
   3428}
   3429
   3430static void restore_custom_reg_settings(struct wiphy *wiphy)
   3431{
   3432	struct ieee80211_supported_band *sband;
   3433	enum nl80211_band band;
   3434	struct ieee80211_channel *chan;
   3435	int i;
   3436
   3437	for (band = 0; band < NUM_NL80211_BANDS; band++) {
   3438		sband = wiphy->bands[band];
   3439		if (!sband)
   3440			continue;
   3441		for (i = 0; i < sband->n_channels; i++) {
   3442			chan = &sband->channels[i];
   3443			chan->flags = chan->orig_flags;
   3444			chan->max_antenna_gain = chan->orig_mag;
   3445			chan->max_power = chan->orig_mpwr;
   3446			chan->beacon_found = false;
   3447		}
   3448	}
   3449}
   3450
   3451/*
   3452 * Restoring regulatory settings involves ignoring any
   3453 * possibly stale country IE information and user regulatory
   3454 * settings if so desired, this includes any beacon hints
   3455 * learned as we could have traveled outside to another country
   3456 * after disconnection. To restore regulatory settings we do
   3457 * exactly what we did at bootup:
   3458 *
   3459 *   - send a core regulatory hint
   3460 *   - send a user regulatory hint if applicable
   3461 *
   3462 * Device drivers that send a regulatory hint for a specific country
   3463 * keep their own regulatory domain on wiphy->regd so that does
   3464 * not need to be remembered.
   3465 */
   3466static void restore_regulatory_settings(bool reset_user, bool cached)
   3467{
   3468	char alpha2[2];
   3469	char world_alpha2[2];
   3470	struct reg_beacon *reg_beacon, *btmp;
   3471	LIST_HEAD(tmp_reg_req_list);
   3472	struct cfg80211_registered_device *rdev;
   3473
   3474	ASSERT_RTNL();
   3475
   3476	/*
   3477	 * Clear the indoor setting in case that it is not controlled by user
   3478	 * space, as otherwise there is no guarantee that the device is still
   3479	 * operating in an indoor environment.
   3480	 */
   3481	spin_lock(&reg_indoor_lock);
   3482	if (reg_is_indoor && !reg_is_indoor_portid) {
   3483		reg_is_indoor = false;
   3484		reg_check_channels();
   3485	}
   3486	spin_unlock(&reg_indoor_lock);
   3487
   3488	reset_regdomains(true, &world_regdom);
   3489	restore_alpha2(alpha2, reset_user);
   3490
   3491	/*
   3492	 * If there's any pending requests we simply
   3493	 * stash them to a temporary pending queue and
   3494	 * add then after we've restored regulatory
   3495	 * settings.
   3496	 */
   3497	spin_lock(&reg_requests_lock);
   3498	list_splice_tail_init(&reg_requests_list, &tmp_reg_req_list);
   3499	spin_unlock(&reg_requests_lock);
   3500
   3501	/* Clear beacon hints */
   3502	spin_lock_bh(&reg_pending_beacons_lock);
   3503	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
   3504		list_del(&reg_beacon->list);
   3505		kfree(reg_beacon);
   3506	}
   3507	spin_unlock_bh(&reg_pending_beacons_lock);
   3508
   3509	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
   3510		list_del(&reg_beacon->list);
   3511		kfree(reg_beacon);
   3512	}
   3513
   3514	/* First restore to the basic regulatory settings */
   3515	world_alpha2[0] = cfg80211_world_regdom->alpha2[0];
   3516	world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
   3517
   3518	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
   3519		if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
   3520			continue;
   3521		if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG)
   3522			restore_custom_reg_settings(&rdev->wiphy);
   3523	}
   3524
   3525	if (cached && (!is_an_alpha2(alpha2) ||
   3526		       !IS_ERR_OR_NULL(cfg80211_user_regdom))) {
   3527		reset_regdomains(false, cfg80211_world_regdom);
   3528		update_all_wiphy_regulatory(NL80211_REGDOM_SET_BY_CORE);
   3529		print_regdomain(get_cfg80211_regdom());
   3530		nl80211_send_reg_change_event(&core_request_world);
   3531		reg_set_request_processed();
   3532
   3533		if (is_an_alpha2(alpha2) &&
   3534		    !regulatory_hint_user(alpha2, NL80211_USER_REG_HINT_USER)) {
   3535			struct regulatory_request *ureq;
   3536
   3537			spin_lock(&reg_requests_lock);
   3538			ureq = list_last_entry(&reg_requests_list,
   3539					       struct regulatory_request,
   3540					       list);
   3541			list_del(&ureq->list);
   3542			spin_unlock(&reg_requests_lock);
   3543
   3544			notify_self_managed_wiphys(ureq);
   3545			reg_update_last_request(ureq);
   3546			set_regdom(reg_copy_regd(cfg80211_user_regdom),
   3547				   REGD_SOURCE_CACHED);
   3548		}
   3549	} else {
   3550		regulatory_hint_core(world_alpha2);
   3551
   3552		/*
   3553		 * This restores the ieee80211_regdom module parameter
   3554		 * preference or the last user requested regulatory
   3555		 * settings, user regulatory settings takes precedence.
   3556		 */
   3557		if (is_an_alpha2(alpha2))
   3558			regulatory_hint_user(alpha2, NL80211_USER_REG_HINT_USER);
   3559	}
   3560
   3561	spin_lock(&reg_requests_lock);
   3562	list_splice_tail_init(&tmp_reg_req_list, &reg_requests_list);
   3563	spin_unlock(&reg_requests_lock);
   3564
   3565	pr_debug("Kicking the queue\n");
   3566
   3567	schedule_work(&reg_work);
   3568}
   3569
   3570static bool is_wiphy_all_set_reg_flag(enum ieee80211_regulatory_flags flag)
   3571{
   3572	struct cfg80211_registered_device *rdev;
   3573	struct wireless_dev *wdev;
   3574
   3575	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
   3576		list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
   3577			wdev_lock(wdev);
   3578			if (!(wdev->wiphy->regulatory_flags & flag)) {
   3579				wdev_unlock(wdev);
   3580				return false;
   3581			}
   3582			wdev_unlock(wdev);
   3583		}
   3584	}
   3585
   3586	return true;
   3587}
   3588
   3589void regulatory_hint_disconnect(void)
   3590{
   3591	/* Restore of regulatory settings is not required when wiphy(s)
   3592	 * ignore IE from connected access point but clearance of beacon hints
   3593	 * is required when wiphy(s) supports beacon hints.
   3594	 */
   3595	if (is_wiphy_all_set_reg_flag(REGULATORY_COUNTRY_IE_IGNORE)) {
   3596		struct reg_beacon *reg_beacon, *btmp;
   3597
   3598		if (is_wiphy_all_set_reg_flag(REGULATORY_DISABLE_BEACON_HINTS))
   3599			return;
   3600
   3601		spin_lock_bh(&reg_pending_beacons_lock);
   3602		list_for_each_entry_safe(reg_beacon, btmp,
   3603					 &reg_pending_beacons, list) {
   3604			list_del(&reg_beacon->list);
   3605			kfree(reg_beacon);
   3606		}
   3607		spin_unlock_bh(&reg_pending_beacons_lock);
   3608
   3609		list_for_each_entry_safe(reg_beacon, btmp,
   3610					 &reg_beacon_list, list) {
   3611			list_del(&reg_beacon->list);
   3612			kfree(reg_beacon);
   3613		}
   3614
   3615		return;
   3616	}
   3617
   3618	pr_debug("All devices are disconnected, going to restore regulatory settings\n");
   3619	restore_regulatory_settings(false, true);
   3620}
   3621
   3622static bool freq_is_chan_12_13_14(u32 freq)
   3623{
   3624	if (freq == ieee80211_channel_to_frequency(12, NL80211_BAND_2GHZ) ||
   3625	    freq == ieee80211_channel_to_frequency(13, NL80211_BAND_2GHZ) ||
   3626	    freq == ieee80211_channel_to_frequency(14, NL80211_BAND_2GHZ))
   3627		return true;
   3628	return false;
   3629}
   3630
   3631static bool pending_reg_beacon(struct ieee80211_channel *beacon_chan)
   3632{
   3633	struct reg_beacon *pending_beacon;
   3634
   3635	list_for_each_entry(pending_beacon, &reg_pending_beacons, list)
   3636		if (ieee80211_channel_equal(beacon_chan,
   3637					    &pending_beacon->chan))
   3638			return true;
   3639	return false;
   3640}
   3641
   3642int regulatory_hint_found_beacon(struct wiphy *wiphy,
   3643				 struct ieee80211_channel *beacon_chan,
   3644				 gfp_t gfp)
   3645{
   3646	struct reg_beacon *reg_beacon;
   3647	bool processing;
   3648
   3649	if (beacon_chan->beacon_found ||
   3650	    beacon_chan->flags & IEEE80211_CHAN_RADAR ||
   3651	    (beacon_chan->band == NL80211_BAND_2GHZ &&
   3652	     !freq_is_chan_12_13_14(beacon_chan->center_freq)))
   3653		return 0;
   3654
   3655	spin_lock_bh(&reg_pending_beacons_lock);
   3656	processing = pending_reg_beacon(beacon_chan);
   3657	spin_unlock_bh(&reg_pending_beacons_lock);
   3658
   3659	if (processing)
   3660		return 0;
   3661
   3662	reg_beacon = kzalloc(sizeof(struct reg_beacon), gfp);
   3663	if (!reg_beacon)
   3664		return -ENOMEM;
   3665
   3666	pr_debug("Found new beacon on frequency: %d.%03d MHz (Ch %d) on %s\n",
   3667		 beacon_chan->center_freq, beacon_chan->freq_offset,
   3668		 ieee80211_freq_khz_to_channel(
   3669			 ieee80211_channel_to_khz(beacon_chan)),
   3670		 wiphy_name(wiphy));
   3671
   3672	memcpy(&reg_beacon->chan, beacon_chan,
   3673	       sizeof(struct ieee80211_channel));
   3674
   3675	/*
   3676	 * Since we can be called from BH or and non-BH context
   3677	 * we must use spin_lock_bh()
   3678	 */
   3679	spin_lock_bh(&reg_pending_beacons_lock);
   3680	list_add_tail(&reg_beacon->list, &reg_pending_beacons);
   3681	spin_unlock_bh(&reg_pending_beacons_lock);
   3682
   3683	schedule_work(&reg_work);
   3684
   3685	return 0;
   3686}
   3687
   3688static void print_rd_rules(const struct ieee80211_regdomain *rd)
   3689{
   3690	unsigned int i;
   3691	const struct ieee80211_reg_rule *reg_rule = NULL;
   3692	const struct ieee80211_freq_range *freq_range = NULL;
   3693	const struct ieee80211_power_rule *power_rule = NULL;
   3694	char bw[32], cac_time[32];
   3695
   3696	pr_debug("  (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n");
   3697
   3698	for (i = 0; i < rd->n_reg_rules; i++) {
   3699		reg_rule = &rd->reg_rules[i];
   3700		freq_range = &reg_rule->freq_range;
   3701		power_rule = &reg_rule->power_rule;
   3702
   3703		if (reg_rule->flags & NL80211_RRF_AUTO_BW)
   3704			snprintf(bw, sizeof(bw), "%d KHz, %u KHz AUTO",
   3705				 freq_range->max_bandwidth_khz,
   3706				 reg_get_max_bandwidth(rd, reg_rule));
   3707		else
   3708			snprintf(bw, sizeof(bw), "%d KHz",
   3709				 freq_range->max_bandwidth_khz);
   3710
   3711		if (reg_rule->flags & NL80211_RRF_DFS)
   3712			scnprintf(cac_time, sizeof(cac_time), "%u s",
   3713				  reg_rule->dfs_cac_ms/1000);
   3714		else
   3715			scnprintf(cac_time, sizeof(cac_time), "N/A");
   3716
   3717
   3718		/*
   3719		 * There may not be documentation for max antenna gain
   3720		 * in certain regions
   3721		 */
   3722		if (power_rule->max_antenna_gain)
   3723			pr_debug("  (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n",
   3724				freq_range->start_freq_khz,
   3725				freq_range->end_freq_khz,
   3726				bw,
   3727				power_rule->max_antenna_gain,
   3728				power_rule->max_eirp,
   3729				cac_time);
   3730		else
   3731			pr_debug("  (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n",
   3732				freq_range->start_freq_khz,
   3733				freq_range->end_freq_khz,
   3734				bw,
   3735				power_rule->max_eirp,
   3736				cac_time);
   3737	}
   3738}
   3739
   3740bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region)
   3741{
   3742	switch (dfs_region) {
   3743	case NL80211_DFS_UNSET:
   3744	case NL80211_DFS_FCC:
   3745	case NL80211_DFS_ETSI:
   3746	case NL80211_DFS_JP:
   3747		return true;
   3748	default:
   3749		pr_debug("Ignoring unknown DFS master region: %d\n", dfs_region);
   3750		return false;
   3751	}
   3752}
   3753
   3754static void print_regdomain(const struct ieee80211_regdomain *rd)
   3755{
   3756	struct regulatory_request *lr = get_last_request();
   3757
   3758	if (is_intersected_alpha2(rd->alpha2)) {
   3759		if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
   3760			struct cfg80211_registered_device *rdev;
   3761			rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
   3762			if (rdev) {
   3763				pr_debug("Current regulatory domain updated by AP to: %c%c\n",
   3764					rdev->country_ie_alpha2[0],
   3765					rdev->country_ie_alpha2[1]);
   3766			} else
   3767				pr_debug("Current regulatory domain intersected:\n");
   3768		} else
   3769			pr_debug("Current regulatory domain intersected:\n");
   3770	} else if (is_world_regdom(rd->alpha2)) {
   3771		pr_debug("World regulatory domain updated:\n");
   3772	} else {
   3773		if (is_unknown_alpha2(rd->alpha2))
   3774			pr_debug("Regulatory domain changed to driver built-in settings (unknown country)\n");
   3775		else {
   3776			if (reg_request_cell_base(lr))
   3777				pr_debug("Regulatory domain changed to country: %c%c by Cell Station\n",
   3778					rd->alpha2[0], rd->alpha2[1]);
   3779			else
   3780				pr_debug("Regulatory domain changed to country: %c%c\n",
   3781					rd->alpha2[0], rd->alpha2[1]);
   3782		}
   3783	}
   3784
   3785	pr_debug(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
   3786	print_rd_rules(rd);
   3787}
   3788
   3789static void print_regdomain_info(const struct ieee80211_regdomain *rd)
   3790{
   3791	pr_debug("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
   3792	print_rd_rules(rd);
   3793}
   3794
   3795static int reg_set_rd_core(const struct ieee80211_regdomain *rd)
   3796{
   3797	if (!is_world_regdom(rd->alpha2))
   3798		return -EINVAL;
   3799	update_world_regdomain(rd);
   3800	return 0;
   3801}
   3802
   3803static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
   3804			   struct regulatory_request *user_request)
   3805{
   3806	const struct ieee80211_regdomain *intersected_rd = NULL;
   3807
   3808	if (!regdom_changes(rd->alpha2))
   3809		return -EALREADY;
   3810
   3811	if (!is_valid_rd(rd)) {
   3812		pr_err("Invalid regulatory domain detected: %c%c\n",
   3813		       rd->alpha2[0], rd->alpha2[1]);
   3814		print_regdomain_info(rd);
   3815		return -EINVAL;
   3816	}
   3817
   3818	if (!user_request->intersect) {
   3819		reset_regdomains(false, rd);
   3820		return 0;
   3821	}
   3822
   3823	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
   3824	if (!intersected_rd)
   3825		return -EINVAL;
   3826
   3827	kfree(rd);
   3828	rd = NULL;
   3829	reset_regdomains(false, intersected_rd);
   3830
   3831	return 0;
   3832}
   3833
   3834static int reg_set_rd_driver(const struct ieee80211_regdomain *rd,
   3835			     struct regulatory_request *driver_request)
   3836{
   3837	const struct ieee80211_regdomain *regd;
   3838	const struct ieee80211_regdomain *intersected_rd = NULL;
   3839	const struct ieee80211_regdomain *tmp;
   3840	struct wiphy *request_wiphy;
   3841
   3842	if (is_world_regdom(rd->alpha2))
   3843		return -EINVAL;
   3844
   3845	if (!regdom_changes(rd->alpha2))
   3846		return -EALREADY;
   3847
   3848	if (!is_valid_rd(rd)) {
   3849		pr_err("Invalid regulatory domain detected: %c%c\n",
   3850		       rd->alpha2[0], rd->alpha2[1]);
   3851		print_regdomain_info(rd);
   3852		return -EINVAL;
   3853	}
   3854
   3855	request_wiphy = wiphy_idx_to_wiphy(driver_request->wiphy_idx);
   3856	if (!request_wiphy)
   3857		return -ENODEV;
   3858
   3859	if (!driver_request->intersect) {
   3860		ASSERT_RTNL();
   3861		wiphy_lock(request_wiphy);
   3862		if (request_wiphy->regd) {
   3863			wiphy_unlock(request_wiphy);
   3864			return -EALREADY;
   3865		}
   3866
   3867		regd = reg_copy_regd(rd);
   3868		if (IS_ERR(regd)) {
   3869			wiphy_unlock(request_wiphy);
   3870			return PTR_ERR(regd);
   3871		}
   3872
   3873		rcu_assign_pointer(request_wiphy->regd, regd);
   3874		wiphy_unlock(request_wiphy);
   3875		reset_regdomains(false, rd);
   3876		return 0;
   3877	}
   3878
   3879	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
   3880	if (!intersected_rd)
   3881		return -EINVAL;
   3882
   3883	/*
   3884	 * We can trash what CRDA provided now.
   3885	 * However if a driver requested this specific regulatory
   3886	 * domain we keep it for its private use
   3887	 */
   3888	tmp = get_wiphy_regdom(request_wiphy);
   3889	rcu_assign_pointer(request_wiphy->regd, rd);
   3890	rcu_free_regdom(tmp);
   3891
   3892	rd = NULL;
   3893
   3894	reset_regdomains(false, intersected_rd);
   3895
   3896	return 0;
   3897}
   3898
   3899static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
   3900				 struct regulatory_request *country_ie_request)
   3901{
   3902	struct wiphy *request_wiphy;
   3903
   3904	if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
   3905	    !is_unknown_alpha2(rd->alpha2))
   3906		return -EINVAL;
   3907
   3908	/*
   3909	 * Lets only bother proceeding on the same alpha2 if the current
   3910	 * rd is non static (it means CRDA was present and was used last)
   3911	 * and the pending request came in from a country IE
   3912	 */
   3913
   3914	if (!is_valid_rd(rd)) {
   3915		pr_err("Invalid regulatory domain detected: %c%c\n",
   3916		       rd->alpha2[0], rd->alpha2[1]);
   3917		print_regdomain_info(rd);
   3918		return -EINVAL;
   3919	}
   3920
   3921	request_wiphy = wiphy_idx_to_wiphy(country_ie_request->wiphy_idx);
   3922	if (!request_wiphy)
   3923		return -ENODEV;
   3924
   3925	if (country_ie_request->intersect)
   3926		return -EINVAL;
   3927
   3928	reset_regdomains(false, rd);
   3929	return 0;
   3930}
   3931
   3932/*
   3933 * Use this call to set the current regulatory domain. Conflicts with
   3934 * multiple drivers can be ironed out later. Caller must've already
   3935 * kmalloc'd the rd structure.
   3936 */
   3937int set_regdom(const struct ieee80211_regdomain *rd,
   3938	       enum ieee80211_regd_source regd_src)
   3939{
   3940	struct regulatory_request *lr;
   3941	bool user_reset = false;
   3942	int r;
   3943
   3944	if (IS_ERR_OR_NULL(rd))
   3945		return -ENODATA;
   3946
   3947	if (!reg_is_valid_request(rd->alpha2)) {
   3948		kfree(rd);
   3949		return -EINVAL;
   3950	}
   3951
   3952	if (regd_src == REGD_SOURCE_CRDA)
   3953		reset_crda_timeouts();
   3954
   3955	lr = get_last_request();
   3956
   3957	/* Note that this doesn't update the wiphys, this is done below */
   3958	switch (lr->initiator) {
   3959	case NL80211_REGDOM_SET_BY_CORE:
   3960		r = reg_set_rd_core(rd);
   3961		break;
   3962	case NL80211_REGDOM_SET_BY_USER:
   3963		cfg80211_save_user_regdom(rd);
   3964		r = reg_set_rd_user(rd, lr);
   3965		user_reset = true;
   3966		break;
   3967	case NL80211_REGDOM_SET_BY_DRIVER:
   3968		r = reg_set_rd_driver(rd, lr);
   3969		break;
   3970	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
   3971		r = reg_set_rd_country_ie(rd, lr);
   3972		break;
   3973	default:
   3974		WARN(1, "invalid initiator %d\n", lr->initiator);
   3975		kfree(rd);
   3976		return -EINVAL;
   3977	}
   3978
   3979	if (r) {
   3980		switch (r) {
   3981		case -EALREADY:
   3982			reg_set_request_processed();
   3983			break;
   3984		default:
   3985			/* Back to world regulatory in case of errors */
   3986			restore_regulatory_settings(user_reset, false);
   3987		}
   3988
   3989		kfree(rd);
   3990		return r;
   3991	}
   3992
   3993	/* This would make this whole thing pointless */
   3994	if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom()))
   3995		return -EINVAL;
   3996
   3997	/* update all wiphys now with the new established regulatory domain */
   3998	update_all_wiphy_regulatory(lr->initiator);
   3999
   4000	print_regdomain(get_cfg80211_regdom());
   4001
   4002	nl80211_send_reg_change_event(lr);
   4003
   4004	reg_set_request_processed();
   4005
   4006	return 0;
   4007}
   4008
   4009static int __regulatory_set_wiphy_regd(struct wiphy *wiphy,
   4010				       struct ieee80211_regdomain *rd)
   4011{
   4012	const struct ieee80211_regdomain *regd;
   4013	const struct ieee80211_regdomain *prev_regd;
   4014	struct cfg80211_registered_device *rdev;
   4015
   4016	if (WARN_ON(!wiphy || !rd))
   4017		return -EINVAL;
   4018
   4019	if (WARN(!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED),
   4020		 "wiphy should have REGULATORY_WIPHY_SELF_MANAGED\n"))
   4021		return -EPERM;
   4022
   4023	if (WARN(!is_valid_rd(rd),
   4024		 "Invalid regulatory domain detected: %c%c\n",
   4025		 rd->alpha2[0], rd->alpha2[1])) {
   4026		print_regdomain_info(rd);
   4027		return -EINVAL;
   4028	}
   4029
   4030	regd = reg_copy_regd(rd);
   4031	if (IS_ERR(regd))
   4032		return PTR_ERR(regd);
   4033
   4034	rdev = wiphy_to_rdev(wiphy);
   4035
   4036	spin_lock(&reg_requests_lock);
   4037	prev_regd = rdev->requested_regd;
   4038	rdev->requested_regd = regd;
   4039	spin_unlock(&reg_requests_lock);
   4040
   4041	kfree(prev_regd);
   4042	return 0;
   4043}
   4044
   4045int regulatory_set_wiphy_regd(struct wiphy *wiphy,
   4046			      struct ieee80211_regdomain *rd)
   4047{
   4048	int ret = __regulatory_set_wiphy_regd(wiphy, rd);
   4049
   4050	if (ret)
   4051		return ret;
   4052
   4053	schedule_work(&reg_work);
   4054	return 0;
   4055}
   4056EXPORT_SYMBOL(regulatory_set_wiphy_regd);
   4057
   4058int regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
   4059				   struct ieee80211_regdomain *rd)
   4060{
   4061	int ret;
   4062
   4063	ASSERT_RTNL();
   4064
   4065	ret = __regulatory_set_wiphy_regd(wiphy, rd);
   4066	if (ret)
   4067		return ret;
   4068
   4069	/* process the request immediately */
   4070	reg_process_self_managed_hint(wiphy);
   4071	reg_check_channels();
   4072	return 0;
   4073}
   4074EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync);
   4075
   4076void wiphy_regulatory_register(struct wiphy *wiphy)
   4077{
   4078	struct regulatory_request *lr = get_last_request();
   4079
   4080	/* self-managed devices ignore beacon hints and country IE */
   4081	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
   4082		wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS |
   4083					   REGULATORY_COUNTRY_IE_IGNORE;
   4084
   4085		/*
   4086		 * The last request may have been received before this
   4087		 * registration call. Call the driver notifier if
   4088		 * initiator is USER.
   4089		 */
   4090		if (lr->initiator == NL80211_REGDOM_SET_BY_USER)
   4091			reg_call_notifier(wiphy, lr);
   4092	}
   4093
   4094	if (!reg_dev_ignore_cell_hint(wiphy))
   4095		reg_num_devs_support_basehint++;
   4096
   4097	wiphy_update_regulatory(wiphy, lr->initiator);
   4098	wiphy_all_share_dfs_chan_state(wiphy);
   4099	reg_process_self_managed_hints();
   4100}
   4101
   4102void wiphy_regulatory_deregister(struct wiphy *wiphy)
   4103{
   4104	struct wiphy *request_wiphy = NULL;
   4105	struct regulatory_request *lr;
   4106
   4107	lr = get_last_request();
   4108
   4109	if (!reg_dev_ignore_cell_hint(wiphy))
   4110		reg_num_devs_support_basehint--;
   4111
   4112	rcu_free_regdom(get_wiphy_regdom(wiphy));
   4113	RCU_INIT_POINTER(wiphy->regd, NULL);
   4114
   4115	if (lr)
   4116		request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
   4117
   4118	if (!request_wiphy || request_wiphy != wiphy)
   4119		return;
   4120
   4121	lr->wiphy_idx = WIPHY_IDX_INVALID;
   4122	lr->country_ie_env = ENVIRON_ANY;
   4123}
   4124
   4125/*
   4126 * See FCC notices for UNII band definitions
   4127 *  5GHz: https://www.fcc.gov/document/5-ghz-unlicensed-spectrum-unii
   4128 *  6GHz: https://www.fcc.gov/document/fcc-proposes-more-spectrum-unlicensed-use-0
   4129 */
   4130int cfg80211_get_unii(int freq)
   4131{
   4132	/* UNII-1 */
   4133	if (freq >= 5150 && freq <= 5250)
   4134		return 0;
   4135
   4136	/* UNII-2A */
   4137	if (freq > 5250 && freq <= 5350)
   4138		return 1;
   4139
   4140	/* UNII-2B */
   4141	if (freq > 5350 && freq <= 5470)
   4142		return 2;
   4143
   4144	/* UNII-2C */
   4145	if (freq > 5470 && freq <= 5725)
   4146		return 3;
   4147
   4148	/* UNII-3 */
   4149	if (freq > 5725 && freq <= 5825)
   4150		return 4;
   4151
   4152	/* UNII-5 */
   4153	if (freq > 5925 && freq <= 6425)
   4154		return 5;
   4155
   4156	/* UNII-6 */
   4157	if (freq > 6425 && freq <= 6525)
   4158		return 6;
   4159
   4160	/* UNII-7 */
   4161	if (freq > 6525 && freq <= 6875)
   4162		return 7;
   4163
   4164	/* UNII-8 */
   4165	if (freq > 6875 && freq <= 7125)
   4166		return 8;
   4167
   4168	return -EINVAL;
   4169}
   4170
   4171bool regulatory_indoor_allowed(void)
   4172{
   4173	return reg_is_indoor;
   4174}
   4175
   4176bool regulatory_pre_cac_allowed(struct wiphy *wiphy)
   4177{
   4178	const struct ieee80211_regdomain *regd = NULL;
   4179	const struct ieee80211_regdomain *wiphy_regd = NULL;
   4180	bool pre_cac_allowed = false;
   4181
   4182	rcu_read_lock();
   4183
   4184	regd = rcu_dereference(cfg80211_regdomain);
   4185	wiphy_regd = rcu_dereference(wiphy->regd);
   4186	if (!wiphy_regd) {
   4187		if (regd->dfs_region == NL80211_DFS_ETSI)
   4188			pre_cac_allowed = true;
   4189
   4190		rcu_read_unlock();
   4191
   4192		return pre_cac_allowed;
   4193	}
   4194
   4195	if (regd->dfs_region == wiphy_regd->dfs_region &&
   4196	    wiphy_regd->dfs_region == NL80211_DFS_ETSI)
   4197		pre_cac_allowed = true;
   4198
   4199	rcu_read_unlock();
   4200
   4201	return pre_cac_allowed;
   4202}
   4203EXPORT_SYMBOL(regulatory_pre_cac_allowed);
   4204
   4205static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev)
   4206{
   4207	struct wireless_dev *wdev;
   4208	/* If we finished CAC or received radar, we should end any
   4209	 * CAC running on the same channels.
   4210	 * the check !cfg80211_chandef_dfs_usable contain 2 options:
   4211	 * either all channels are available - those the CAC_FINISHED
   4212	 * event has effected another wdev state, or there is a channel
   4213	 * in unavailable state in wdev chandef - those the RADAR_DETECTED
   4214	 * event has effected another wdev state.
   4215	 * In both cases we should end the CAC on the wdev.
   4216	 */
   4217	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
   4218		if (wdev->cac_started &&
   4219		    !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef))
   4220			rdev_end_cac(rdev, wdev->netdev);
   4221	}
   4222}
   4223
   4224void regulatory_propagate_dfs_state(struct wiphy *wiphy,
   4225				    struct cfg80211_chan_def *chandef,
   4226				    enum nl80211_dfs_state dfs_state,
   4227				    enum nl80211_radar_event event)
   4228{
   4229	struct cfg80211_registered_device *rdev;
   4230
   4231	ASSERT_RTNL();
   4232
   4233	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
   4234		return;
   4235
   4236	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
   4237		if (wiphy == &rdev->wiphy)
   4238			continue;
   4239
   4240		if (!reg_dfs_domain_same(wiphy, &rdev->wiphy))
   4241			continue;
   4242
   4243		if (!ieee80211_get_channel(&rdev->wiphy,
   4244					   chandef->chan->center_freq))
   4245			continue;
   4246
   4247		cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state);
   4248
   4249		if (event == NL80211_RADAR_DETECTED ||
   4250		    event == NL80211_RADAR_CAC_FINISHED) {
   4251			cfg80211_sched_dfs_chan_update(rdev);
   4252			cfg80211_check_and_end_cac(rdev);
   4253		}
   4254
   4255		nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL);
   4256	}
   4257}
   4258
   4259static int __init regulatory_init_db(void)
   4260{
   4261	int err;
   4262
   4263	/*
   4264	 * It's possible that - due to other bugs/issues - cfg80211
   4265	 * never called regulatory_init() below, or that it failed;
   4266	 * in that case, don't try to do any further work here as
   4267	 * it's doomed to lead to crashes.
   4268	 */
   4269	if (IS_ERR_OR_NULL(reg_pdev))
   4270		return -EINVAL;
   4271
   4272	err = load_builtin_regdb_keys();
   4273	if (err)
   4274		return err;
   4275
   4276	/* We always try to get an update for the static regdomain */
   4277	err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
   4278	if (err) {
   4279		if (err == -ENOMEM) {
   4280			platform_device_unregister(reg_pdev);
   4281			return err;
   4282		}
   4283		/*
   4284		 * N.B. kobject_uevent_env() can fail mainly for when we're out
   4285		 * memory which is handled and propagated appropriately above
   4286		 * but it can also fail during a netlink_broadcast() or during
   4287		 * early boot for call_usermodehelper(). For now treat these
   4288		 * errors as non-fatal.
   4289		 */
   4290		pr_err("kobject_uevent_env() was unable to call CRDA during init\n");
   4291	}
   4292
   4293	/*
   4294	 * Finally, if the user set the module parameter treat it
   4295	 * as a user hint.
   4296	 */
   4297	if (!is_world_regdom(ieee80211_regdom))
   4298		regulatory_hint_user(ieee80211_regdom,
   4299				     NL80211_USER_REG_HINT_USER);
   4300
   4301	return 0;
   4302}
   4303#ifndef MODULE
   4304late_initcall(regulatory_init_db);
   4305#endif
   4306
   4307int __init regulatory_init(void)
   4308{
   4309	reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
   4310	if (IS_ERR(reg_pdev))
   4311		return PTR_ERR(reg_pdev);
   4312
   4313	rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
   4314
   4315	user_alpha2[0] = '9';
   4316	user_alpha2[1] = '7';
   4317
   4318#ifdef MODULE
   4319	return regulatory_init_db();
   4320#else
   4321	return 0;
   4322#endif
   4323}
   4324
   4325void regulatory_exit(void)
   4326{
   4327	struct regulatory_request *reg_request, *tmp;
   4328	struct reg_beacon *reg_beacon, *btmp;
   4329
   4330	cancel_work_sync(&reg_work);
   4331	cancel_crda_timeout_sync();
   4332	cancel_delayed_work_sync(&reg_check_chans);
   4333
   4334	/* Lock to suppress warnings */
   4335	rtnl_lock();
   4336	reset_regdomains(true, NULL);
   4337	rtnl_unlock();
   4338
   4339	dev_set_uevent_suppress(&reg_pdev->dev, true);
   4340
   4341	platform_device_unregister(reg_pdev);
   4342
   4343	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
   4344		list_del(&reg_beacon->list);
   4345		kfree(reg_beacon);
   4346	}
   4347
   4348	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
   4349		list_del(&reg_beacon->list);
   4350		kfree(reg_beacon);
   4351	}
   4352
   4353	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
   4354		list_del(&reg_request->list);
   4355		kfree(reg_request);
   4356	}
   4357
   4358	if (!IS_ERR_OR_NULL(regdb))
   4359		kfree(regdb);
   4360	if (!IS_ERR_OR_NULL(cfg80211_user_regdom))
   4361		kfree(cfg80211_user_regdom);
   4362
   4363	free_regdb_keyring();
   4364}