reg.c 81.4 KB
Newer Older
1 2 3 4
/*
 * Copyright 2002-2005, Instant802 Networks, Inc.
 * Copyright 2005-2006, Devicescape Software, Inc.
 * 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
 *
8 9 10 11 12 13 14 15 16 17 18
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 20
 */

21

22 23
/**
 * DOC: Wireless regulatory infrastructure
24 25 26 27 28 29
 *
 * The usual implementation is for a driver to read a device EEPROM to
 * determine which regulatory domain it should be operating under, then
 * looking up the allowable channels in a driver-local table and finally
 * registering those channels in the wiphy structure.
 *
30 31 32 33 34 35 36 37 38 39 40 41 42 43
 * Another set of compliance enforcement is for drivers to use their
 * own compliance limits which can be stored on the EEPROM. The host
 * driver or firmware may ensure these are used.
 *
 * In addition to all this we provide an extra layer of regulatory
 * conformance. For drivers which do not have any regulatory
 * information CRDA provides the complete regulatory solution.
 * For others it provides a community effort on further restrictions
 * to enhance compliance.
 *
 * Note: When number of rules --> infinity we will not be able to
 * index on alpha2 any more, instead we'll probably have to
 * rely on some SHA1 checksum of the regdomain for example.
 *
44
 */
45 46 47

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

48
#include <linux/kernel.h>
49
#include <linux/export.h>
50
#include <linux/slab.h>
51
#include <linux/list.h>
52
#include <linux/ctype.h>
53 54
#include <linux/nl80211.h>
#include <linux/platform_device.h>
55
#include <linux/moduleparam.h>
56
#include <net/cfg80211.h>
57
#include "core.h"
58
#include "reg.h"
59
#include "rdev-ops.h"
60
#include "regdb.h"
61
#include "nl80211.h"
62

63
#ifdef CONFIG_CFG80211_REG_DEBUG
64 65
#define REG_DBG_PRINT(format, args...)			\
	printk(KERN_DEBUG pr_fmt(format), ##args)
66
#else
67
#define REG_DBG_PRINT(args...)
68 69
#endif

70 71 72 73 74 75
/*
 * Grace period we give before making sure all current interfaces reside on
 * channels allowed by the current regulatory domain.
 */
#define REG_ENFORCE_GRACE_MS 60000

76 77 78 79 80 81 82 83 84 85
/**
 * enum reg_request_treatment - regulatory request treatment
 *
 * @REG_REQ_OK: continue processing the regulatory request
 * @REG_REQ_IGNORE: ignore the regulatory request
 * @REG_REQ_INTERSECT: the regulatory domain resulting from this request should
 *	be intersected with the current one.
 * @REG_REQ_ALREADY_SET: the regulatory request will not change the current
 *	regulatory settings, and no further processing is required.
 */
86 87 88 89 90 91 92
enum reg_request_treatment {
	REG_REQ_OK,
	REG_REQ_IGNORE,
	REG_REQ_INTERSECT,
	REG_REQ_ALREADY_SET,
};

93 94 95 96 97 98 99 100 101
static struct regulatory_request core_request_world = {
	.initiator = NL80211_REGDOM_SET_BY_CORE,
	.alpha2[0] = '0',
	.alpha2[1] = '0',
	.intersect = false,
	.processed = true,
	.country_ie_env = ENVIRON_ANY,
};

J
Johannes Berg 已提交
102 103 104 105
/*
 * Receipt of information from last regulatory request,
 * protected by RTNL (and can be accessed with RCU protection)
 */
106
static struct regulatory_request __rcu *last_request =
107
	(void __force __rcu *)&core_request_world;
108

109 110
/* To trigger userspace events */
static struct platform_device *reg_pdev;
111

112 113
/*
 * Central wireless core regulatory domains, we only need two,
114
 * the current one and a world regulatory domain in case we have no
115
 * information to give us an alpha2.
J
Johannes Berg 已提交
116
 * (protected by RTNL, can be read under RCU)
117
 */
118
const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
119

120 121 122
/*
 * Number of devices that registered to the core
 * that support cellular base station regulatory hints
J
Johannes Berg 已提交
123
 * (protected by RTNL)
124 125 126
 */
static int reg_num_devs_support_basehint;

127 128 129 130 131 132 133 134
/*
 * State variable indicating if the platform on which the devices
 * are attached is operating in an indoor environment. The state variable
 * is relevant for all registered devices.
 * (protected by RTNL)
 */
static bool reg_is_indoor;

135 136
static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
{
J
Johannes Berg 已提交
137
	return rtnl_dereference(cfg80211_regdomain);
138 139
}

140
const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
141
{
J
Johannes Berg 已提交
142
	return rtnl_dereference(wiphy->regd);
143 144
}

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region)
{
	switch (dfs_region) {
	case NL80211_DFS_UNSET:
		return "unset";
	case NL80211_DFS_FCC:
		return "FCC";
	case NL80211_DFS_ETSI:
		return "ETSI";
	case NL80211_DFS_JP:
		return "JP";
	}
	return "Unknown";
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy)
{
	const struct ieee80211_regdomain *regd = NULL;
	const struct ieee80211_regdomain *wiphy_regd = NULL;

	regd = get_cfg80211_regdom();
	if (!wiphy)
		goto out;

	wiphy_regd = get_wiphy_regdom(wiphy);
	if (!wiphy_regd)
		goto out;

	if (wiphy_regd->dfs_region == regd->dfs_region)
		goto out;

	REG_DBG_PRINT("%s: device specific dfs_region "
		      "(%s) disagrees with cfg80211's "
		      "central dfs_region (%s)\n",
		      dev_name(&wiphy->dev),
		      reg_dfs_region_str(wiphy_regd->dfs_region),
		      reg_dfs_region_str(regd->dfs_region));

out:
	return regd->dfs_region;
}

187 188 189 190 191 192 193
static void rcu_free_regdom(const struct ieee80211_regdomain *r)
{
	if (!r)
		return;
	kfree_rcu((struct ieee80211_regdomain *)r, rcu_head);
}

194 195
static struct regulatory_request *get_last_request(void)
{
J
Johannes Berg 已提交
196
	return rcu_dereference_rtnl(last_request);
197 198
}

199
/* Used to queue up regulatory hints */
200 201 202
static LIST_HEAD(reg_requests_list);
static spinlock_t reg_requests_lock;

203 204 205 206 207 208 209 210 211 212 213 214
/* Used to queue up beacon hints for review */
static LIST_HEAD(reg_pending_beacons);
static spinlock_t reg_pending_beacons_lock;

/* Used to keep track of processed beacon hints */
static LIST_HEAD(reg_beacon_list);

struct reg_beacon {
	struct list_head list;
	struct ieee80211_channel chan;
};

215 216 217
static void reg_check_chans_work(struct work_struct *work);
static DECLARE_DELAYED_WORK(reg_check_chans, reg_check_chans_work);

218 219 220
static void reg_todo(struct work_struct *work);
static DECLARE_WORK(reg_work, reg_todo);

221 222 223
static void reg_timeout_work(struct work_struct *work);
static DECLARE_DELAYED_WORK(reg_timeout, reg_timeout_work);

224 225
/* We keep a static world regulatory domain in case of the absence of CRDA */
static const struct ieee80211_regdomain world_regdom = {
226
	.n_reg_rules = 6,
227 228
	.alpha2 =  "00",
	.reg_rules = {
229 230
		/* IEEE 802.11b/g, channels 1..11 */
		REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
231 232
		/* IEEE 802.11b/g, channels 12..13. */
		REG_RULE(2467-10, 2472+10, 40, 6, 20,
233
			NL80211_RRF_NO_IR),
234 235 236
		/* IEEE 802.11 channel 14 - Only JP enables
		 * this and for 802.11b only */
		REG_RULE(2484-10, 2484+10, 20, 6, 20,
237
			NL80211_RRF_NO_IR |
238 239
			NL80211_RRF_NO_OFDM),
		/* IEEE 802.11a, channel 36..48 */
240
		REG_RULE(5180-10, 5240+10, 160, 6, 20,
241
                        NL80211_RRF_NO_IR),
242

243 244
		/* IEEE 802.11a, channel 52..64 - DFS required */
		REG_RULE(5260-10, 5320+10, 160, 6, 20,
245
			NL80211_RRF_NO_IR |
246 247 248 249
			NL80211_RRF_DFS),

		/* IEEE 802.11a, channel 100..144 - DFS required */
		REG_RULE(5500-10, 5720+10, 160, 6, 20,
250
			NL80211_RRF_NO_IR |
251
			NL80211_RRF_DFS),
252 253

		/* IEEE 802.11a, channel 149..165 */
254
		REG_RULE(5745-10, 5825+10, 80, 6, 20,
255
			NL80211_RRF_NO_IR),
256 257 258

		/* IEEE 802.11ad (60gHz), channels 1..3 */
		REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
259 260 261
	}
};

J
Johannes Berg 已提交
262
/* protected by RTNL */
263 264
static const struct ieee80211_regdomain *cfg80211_world_regdom =
	&world_regdom;
265

266
static char *ieee80211_regdom = "00";
267
static char user_alpha2[2];
268

269 270 271
module_param(ieee80211_regdom, charp, 0444);
MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");

272
static void reg_free_request(struct regulatory_request *request)
273
{
274 275 276 277 278 279 280 281
	if (request != get_last_request())
		kfree(request);
}

static void reg_free_last_request(void)
{
	struct regulatory_request *lr = get_last_request();

282 283 284 285
	if (lr != &core_request_world && lr)
		kfree_rcu(lr, rcu_head);
}

286 287
static void reg_update_last_request(struct regulatory_request *request)
{
288 289 290 291 292 293
	struct regulatory_request *lr;

	lr = get_last_request();
	if (lr == request)
		return;

294
	reg_free_last_request();
295 296 297
	rcu_assign_pointer(last_request, request);
}

298 299
static void reset_regdomains(bool full_reset,
			     const struct ieee80211_regdomain *new_regdom)
300
{
301 302
	const struct ieee80211_regdomain *r;

J
Johannes Berg 已提交
303
	ASSERT_RTNL();
304

305 306
	r = get_cfg80211_regdom();

307
	/* avoid freeing static information or freeing something twice */
308 309
	if (r == cfg80211_world_regdom)
		r = NULL;
310 311
	if (cfg80211_world_regdom == &world_regdom)
		cfg80211_world_regdom = NULL;
312 313
	if (r == &world_regdom)
		r = NULL;
314

315 316
	rcu_free_regdom(r);
	rcu_free_regdom(cfg80211_world_regdom);
317

318
	cfg80211_world_regdom = &world_regdom;
319
	rcu_assign_pointer(cfg80211_regdomain, new_regdom);
320 321 322 323

	if (!full_reset)
		return;

324
	reg_update_last_request(&core_request_world);
325 326
}

327 328 329 330
/*
 * Dynamic world regulatory domain requested by the wireless
 * core upon initialization
 */
331
static void update_world_regdomain(const struct ieee80211_regdomain *rd)
332
{
333
	struct regulatory_request *lr;
334

335 336 337
	lr = get_last_request();

	WARN_ON(!lr);
338

339
	reset_regdomains(false, rd);
340 341 342 343

	cfg80211_world_regdom = rd;
}

344
bool is_world_regdom(const char *alpha2)
345 346 347
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
348
	return alpha2[0] == '0' && alpha2[1] == '0';
349
}
350

351
static bool is_alpha2_set(const char *alpha2)
352 353 354
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
355
	return alpha2[0] && alpha2[1];
356
}
357

358
static bool is_unknown_alpha2(const char *alpha2)
359 360 361
{
	if (!alpha2)
		return false;
362 363 364 365
	/*
	 * Special case where regulatory domain was built by driver
	 * but a specific alpha2 cannot be determined
	 */
J
Johannes Berg 已提交
366
	return alpha2[0] == '9' && alpha2[1] == '9';
367
}
368

369 370 371 372
static bool is_intersected_alpha2(const char *alpha2)
{
	if (!alpha2)
		return false;
373 374
	/*
	 * Special case where regulatory domain is the
375
	 * result of an intersection between two regulatory domain
376 377
	 * structures
	 */
J
Johannes Berg 已提交
378
	return alpha2[0] == '9' && alpha2[1] == '8';
379 380
}

381
static bool is_an_alpha2(const char *alpha2)
382 383 384
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
385
	return isalpha(alpha2[0]) && isalpha(alpha2[1]);
386
}
387

388
static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
389 390 391
{
	if (!alpha2_x || !alpha2_y)
		return false;
J
Johannes Berg 已提交
392
	return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1];
393 394
}

395
static bool regdom_changes(const char *alpha2)
396
{
397
	const struct ieee80211_regdomain *r = get_cfg80211_regdom();
398

399
	if (!r)
400
		return true;
401
	return !alpha2_equal(r->alpha2, alpha2);
402 403
}

404 405 406 407 408 409 410 411 412 413 414
/*
 * The NL80211_REGDOM_SET_BY_USER regdom alpha2 is cached, this lets
 * you know if a valid regulatory hint with NL80211_REGDOM_SET_BY_USER
 * has ever been issued.
 */
static bool is_user_regdom_saved(void)
{
	if (user_alpha2[0] == '9' && user_alpha2[1] == '7')
		return false;

	/* This would indicate a mistake on the design */
J
Johannes Berg 已提交
415
	if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2),
416
		 "Unexpected user alpha2: %c%c\n",
J
Johannes Berg 已提交
417
		 user_alpha2[0], user_alpha2[1]))
418 419 420 421 422
		return false;

	return true;
}

423 424
static const struct ieee80211_regdomain *
reg_copy_regd(const struct ieee80211_regdomain *src_regd)
425 426
{
	struct ieee80211_regdomain *regd;
427
	int size_of_regd;
428 429
	unsigned int i;

430 431 432
	size_of_regd =
		sizeof(struct ieee80211_regdomain) +
		src_regd->n_reg_rules * sizeof(struct ieee80211_reg_rule);
433 434 435

	regd = kzalloc(size_of_regd, GFP_KERNEL);
	if (!regd)
436
		return ERR_PTR(-ENOMEM);
437 438 439 440 441

	memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));

	for (i = 0; i < src_regd->n_reg_rules; i++)
		memcpy(&regd->reg_rules[i], &src_regd->reg_rules[i],
442
		       sizeof(struct ieee80211_reg_rule));
443

444
	return regd;
445 446 447 448 449 450 451 452 453
}

#ifdef CONFIG_CFG80211_INTERNAL_REGDB
struct reg_regdb_search_request {
	char alpha2[2];
	struct list_head list;
};

static LIST_HEAD(reg_regdb_search_list);
454
static DEFINE_MUTEX(reg_regdb_search_mutex);
455 456 457 458

static void reg_regdb_search(struct work_struct *work)
{
	struct reg_regdb_search_request *request;
459 460
	const struct ieee80211_regdomain *curdom, *regdom = NULL;
	int i;
461

462
	rtnl_lock();
463

464
	mutex_lock(&reg_regdb_search_mutex);
465 466 467 468 469 470
	while (!list_empty(&reg_regdb_search_list)) {
		request = list_first_entry(&reg_regdb_search_list,
					   struct reg_regdb_search_request,
					   list);
		list_del(&request->list);

J
Johannes Berg 已提交
471
		for (i = 0; i < reg_regdb_size; i++) {
472 473
			curdom = reg_regdb[i];

J
Johannes Berg 已提交
474
			if (alpha2_equal(request->alpha2, curdom->alpha2)) {
475
				regdom = reg_copy_regd(curdom);
476 477 478 479 480 481
				break;
			}
		}

		kfree(request);
	}
482
	mutex_unlock(&reg_regdb_search_mutex);
483

484
	if (!IS_ERR_OR_NULL(regdom))
485 486
		set_regdom(regdom);

487
	rtnl_unlock();
488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
}

static DECLARE_WORK(reg_regdb_work, reg_regdb_search);

static void reg_regdb_query(const char *alpha2)
{
	struct reg_regdb_search_request *request;

	if (!alpha2)
		return;

	request = kzalloc(sizeof(struct reg_regdb_search_request), GFP_KERNEL);
	if (!request)
		return;

	memcpy(request->alpha2, alpha2, 2);

505
	mutex_lock(&reg_regdb_search_mutex);
506
	list_add_tail(&request->list, &reg_regdb_search_list);
507
	mutex_unlock(&reg_regdb_search_mutex);
508 509 510

	schedule_work(&reg_regdb_work);
}
511 512 513 514 515 516 517

/* Feel free to add any other sanity checks here */
static void reg_regdb_size_check(void)
{
	/* We should ideally BUILD_BUG_ON() but then random builds would fail */
	WARN_ONCE(!reg_regdb_size, "db.txt is empty, you should update it...");
}
518
#else
519
static inline void reg_regdb_size_check(void) {}
520 521 522
static inline void reg_regdb_query(const char *alpha2) {}
#endif /* CONFIG_CFG80211_INTERNAL_REGDB */

523 524
/*
 * This lets us keep regulatory code which is updated on a regulatory
525
 * basis in userspace.
526
 */
527 528
static int call_crda(const char *alpha2)
{
529 530 531 532 533 534
	char country[12];
	char *env[] = { country, NULL };

	snprintf(country, sizeof(country), "COUNTRY=%c%c",
		 alpha2[0], alpha2[1]);

535
	if (!is_world_regdom((char *) alpha2))
536
		pr_info("Calling CRDA for country: %c%c\n",
537 538
			alpha2[0], alpha2[1]);
	else
539
		pr_info("Calling CRDA to update world regulatory domain\n");
540

541 542 543
	/* query internal regulatory database (if it exists) */
	reg_regdb_query(alpha2);

544
	return kobject_uevent_env(&reg_pdev->dev.kobj, KOBJ_CHANGE, env);
545 546
}

547 548 549 550 551 552 553 554
static enum reg_request_treatment
reg_call_crda(struct regulatory_request *request)
{
	if (call_crda(request->alpha2))
		return REG_REQ_IGNORE;
	return REG_REQ_OK;
}

555
bool reg_is_valid_request(const char *alpha2)
556
{
557
	struct regulatory_request *lr = get_last_request();
558

559
	if (!lr || lr->processed)
560 561
		return false;

562
	return alpha2_equal(lr->alpha2, alpha2);
563
}
564

565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
static const struct ieee80211_regdomain *reg_get_regdomain(struct wiphy *wiphy)
{
	struct regulatory_request *lr = get_last_request();

	/*
	 * Follow the driver's regulatory domain, if present, unless a country
	 * IE has been processed or a user wants to help complaince further
	 */
	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
	    lr->initiator != NL80211_REGDOM_SET_BY_USER &&
	    wiphy->regd)
		return get_wiphy_regdom(wiphy);

	return get_cfg80211_regdom();
}

581 582 583
static unsigned int
reg_get_max_bandwidth_from_range(const struct ieee80211_regdomain *rd,
				 const struct ieee80211_reg_rule *rule)
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
{
	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
	const struct ieee80211_freq_range *freq_range_tmp;
	const struct ieee80211_reg_rule *tmp;
	u32 start_freq, end_freq, idx, no;

	for (idx = 0; idx < rd->n_reg_rules; idx++)
		if (rule == &rd->reg_rules[idx])
			break;

	if (idx == rd->n_reg_rules)
		return 0;

	/* get start_freq */
	no = idx;

	while (no) {
		tmp = &rd->reg_rules[--no];
		freq_range_tmp = &tmp->freq_range;

		if (freq_range_tmp->end_freq_khz < freq_range->start_freq_khz)
			break;

		freq_range = freq_range_tmp;
	}

	start_freq = freq_range->start_freq_khz;

	/* get end_freq */
	freq_range = &rule->freq_range;
	no = idx;

	while (no < rd->n_reg_rules - 1) {
		tmp = &rd->reg_rules[++no];
		freq_range_tmp = &tmp->freq_range;

		if (freq_range_tmp->start_freq_khz > freq_range->end_freq_khz)
			break;

		freq_range = freq_range_tmp;
	}

	end_freq = freq_range->end_freq_khz;

	return end_freq - start_freq;
}

631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
unsigned int reg_get_max_bandwidth(const struct ieee80211_regdomain *rd,
				   const struct ieee80211_reg_rule *rule)
{
	unsigned int bw = reg_get_max_bandwidth_from_range(rd, rule);

	if (rule->flags & NL80211_RRF_NO_160MHZ)
		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(80));
	if (rule->flags & NL80211_RRF_NO_80MHZ)
		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(40));

	/*
	 * HT40+/HT40- limits are handled per-channel. Only limit BW if both
	 * are not allowed.
	 */
	if (rule->flags & NL80211_RRF_NO_HT40MINUS &&
	    rule->flags & NL80211_RRF_NO_HT40PLUS)
		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(20));

	return bw;
}

652
/* Sanity check on a regulatory rule */
653
static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
654
{
655
	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
656 657
	u32 freq_diff;

658
	if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0)
659 660 661 662 663 664 665
		return false;

	if (freq_range->start_freq_khz > freq_range->end_freq_khz)
		return false;

	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;

666
	if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
J
Johannes Berg 已提交
667
	    freq_range->max_bandwidth_khz > freq_diff)
668 669 670 671 672
		return false;

	return true;
}

673
static bool is_valid_rd(const struct ieee80211_regdomain *rd)
674
{
675
	const struct ieee80211_reg_rule *reg_rule = NULL;
676
	unsigned int i;
677

678 679
	if (!rd->n_reg_rules)
		return false;
680

681 682 683
	if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
		return false;

684 685 686 687 688 689 690
	for (i = 0; i < rd->n_reg_rules; i++) {
		reg_rule = &rd->reg_rules[i];
		if (!is_valid_reg_rule(reg_rule))
			return false;
	}

	return true;
691 692
}

693
static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range,
694
			    u32 center_freq_khz, u32 bw_khz)
695
{
696 697 698 699 700 701 702 703 704 705
	u32 start_freq_khz, end_freq_khz;

	start_freq_khz = center_freq_khz - (bw_khz/2);
	end_freq_khz = center_freq_khz + (bw_khz/2);

	if (start_freq_khz >= freq_range->start_freq_khz &&
	    end_freq_khz <= freq_range->end_freq_khz)
		return true;

	return false;
706
}
707

708 709 710 711 712 713 714
/**
 * freq_in_rule_band - tells us if a frequency is in a frequency band
 * @freq_range: frequency rule we want to query
 * @freq_khz: frequency we are inquiring about
 *
 * This lets us know if a specific frequency rule is or is not relevant to
 * a specific frequency's band. Bands are device specific and artificial
715 716 717 718 719
 * definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"),
 * however it is safe for now to assume that a frequency rule should not be
 * part of a frequency's band if the start freq or end freq are off by more
 * than 2 GHz for the 2.4 and 5 GHz bands, and by more than 10 GHz for the
 * 60 GHz band.
720 721 722 723
 * This resolution can be lowered and should be considered as we add
 * regulatory rule support for other "bands".
 **/
static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
J
Johannes Berg 已提交
724
			      u32 freq_khz)
725 726
{
#define ONE_GHZ_IN_KHZ	1000000
727 728 729 730 731 732 733 734
	/*
	 * From 802.11ad: directional multi-gigabit (DMG):
	 * Pertaining to operation in a frequency band containing a channel
	 * with the Channel starting frequency above 45 GHz.
	 */
	u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ?
			10 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ;
	if (abs(freq_khz - freq_range->start_freq_khz) <= limit)
735
		return true;
736
	if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
737 738 739 740 741
		return true;
	return false;
#undef ONE_GHZ_IN_KHZ
}

742 743 744 745 746 747 748 749 750 751 752 753 754 755
/*
 * Later on we can perhaps use the more restrictive DFS
 * region but we don't have information for that yet so
 * for now simply disallow conflicts.
 */
static enum nl80211_dfs_regions
reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1,
			 const enum nl80211_dfs_regions dfs_region2)
{
	if (dfs_region1 != dfs_region2)
		return NL80211_DFS_UNSET;
	return dfs_region1;
}

756 757 758 759
/*
 * Helper for regdom_intersect(), this does the real
 * mathematical intersection fun
 */
760 761 762
static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
			       const struct ieee80211_regdomain *rd2,
			       const struct ieee80211_reg_rule *rule1,
J
Johannes Berg 已提交
763 764
			       const struct ieee80211_reg_rule *rule2,
			       struct ieee80211_reg_rule *intersected_rule)
765 766 767 768 769
{
	const struct ieee80211_freq_range *freq_range1, *freq_range2;
	struct ieee80211_freq_range *freq_range;
	const struct ieee80211_power_rule *power_rule1, *power_rule2;
	struct ieee80211_power_rule *power_rule;
770
	u32 freq_diff, max_bandwidth1, max_bandwidth2;
771 772 773 774 775 776 777 778 779 780

	freq_range1 = &rule1->freq_range;
	freq_range2 = &rule2->freq_range;
	freq_range = &intersected_rule->freq_range;

	power_rule1 = &rule1->power_rule;
	power_rule2 = &rule2->power_rule;
	power_rule = &intersected_rule->power_rule;

	freq_range->start_freq_khz = max(freq_range1->start_freq_khz,
J
Johannes Berg 已提交
781
					 freq_range2->start_freq_khz);
782
	freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
J
Johannes Berg 已提交
783
				       freq_range2->end_freq_khz);
784 785 786 787

	max_bandwidth1 = freq_range1->max_bandwidth_khz;
	max_bandwidth2 = freq_range2->max_bandwidth_khz;

788 789 790 791
	if (rule1->flags & NL80211_RRF_AUTO_BW)
		max_bandwidth1 = reg_get_max_bandwidth(rd1, rule1);
	if (rule2->flags & NL80211_RRF_AUTO_BW)
		max_bandwidth2 = reg_get_max_bandwidth(rd2, rule2);
792 793

	freq_range->max_bandwidth_khz = min(max_bandwidth1, max_bandwidth2);
794

795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810
	intersected_rule->flags = rule1->flags | rule2->flags;

	/*
	 * In case NL80211_RRF_AUTO_BW requested for both rules
	 * set AUTO_BW in intersected rule also. Next we will
	 * calculate BW correctly in handle_channel function.
	 * In other case remove AUTO_BW flag while we calculate
	 * maximum bandwidth correctly and auto calculation is
	 * not required.
	 */
	if ((rule1->flags & NL80211_RRF_AUTO_BW) &&
	    (rule2->flags & NL80211_RRF_AUTO_BW))
		intersected_rule->flags |= NL80211_RRF_AUTO_BW;
	else
		intersected_rule->flags &= ~NL80211_RRF_AUTO_BW;

811 812 813 814 815 816 817 818 819
	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
	if (freq_range->max_bandwidth_khz > freq_diff)
		freq_range->max_bandwidth_khz = freq_diff;

	power_rule->max_eirp = min(power_rule1->max_eirp,
		power_rule2->max_eirp);
	power_rule->max_antenna_gain = min(power_rule1->max_antenna_gain,
		power_rule2->max_antenna_gain);

820 821 822
	intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms,
					   rule2->dfs_cac_ms);

823 824 825 826 827 828
	if (!is_valid_reg_rule(intersected_rule))
		return -EINVAL;

	return 0;
}

829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
/* check whether old rule contains new rule */
static bool rule_contains(struct ieee80211_reg_rule *r1,
			  struct ieee80211_reg_rule *r2)
{
	/* for simplicity, currently consider only same flags */
	if (r1->flags != r2->flags)
		return false;

	/* verify r1 is more restrictive */
	if ((r1->power_rule.max_antenna_gain >
	     r2->power_rule.max_antenna_gain) ||
	    r1->power_rule.max_eirp > r2->power_rule.max_eirp)
		return false;

	/* make sure r2's range is contained within r1 */
	if (r1->freq_range.start_freq_khz > r2->freq_range.start_freq_khz ||
	    r1->freq_range.end_freq_khz < r2->freq_range.end_freq_khz)
		return false;

	/* and finally verify that r1.max_bw >= r2.max_bw */
	if (r1->freq_range.max_bandwidth_khz <
	    r2->freq_range.max_bandwidth_khz)
		return false;

	return true;
}

/* add or extend current rules. do nothing if rule is already contained */
static void add_rule(struct ieee80211_reg_rule *rule,
		     struct ieee80211_reg_rule *reg_rules, u32 *n_rules)
{
	struct ieee80211_reg_rule *tmp_rule;
	int i;

	for (i = 0; i < *n_rules; i++) {
		tmp_rule = &reg_rules[i];
		/* rule is already contained - do nothing */
		if (rule_contains(tmp_rule, rule))
			return;

		/* extend rule if possible */
		if (rule_contains(rule, tmp_rule)) {
			memcpy(tmp_rule, rule, sizeof(*rule));
			return;
		}
	}

	memcpy(&reg_rules[*n_rules], rule, sizeof(*rule));
	(*n_rules)++;
}

880 881 882 883 884 885 886 887 888 889 890 891 892
/**
 * regdom_intersect - do the intersection between two regulatory domains
 * @rd1: first regulatory domain
 * @rd2: second regulatory domain
 *
 * Use this function to get the intersection between two regulatory domains.
 * Once completed we will mark the alpha2 for the rd as intersected, "98",
 * as no one single alpha2 can represent this regulatory domain.
 *
 * Returns a pointer to the regulatory domain structure which will hold the
 * resulting intersection of rules between rd1 and rd2. We will
 * kzalloc() this structure for you.
 */
J
Johannes Berg 已提交
893 894 895
static struct ieee80211_regdomain *
regdom_intersect(const struct ieee80211_regdomain *rd1,
		 const struct ieee80211_regdomain *rd2)
896 897 898
{
	int r, size_of_regd;
	unsigned int x, y;
899
	unsigned int num_rules = 0;
900
	const struct ieee80211_reg_rule *rule1, *rule2;
901
	struct ieee80211_reg_rule intersected_rule;
902 903 904 905 906
	struct ieee80211_regdomain *rd;

	if (!rd1 || !rd2)
		return NULL;

907 908
	/*
	 * First we get a count of the rules we'll need, then we actually
909 910 911
	 * build them. This is to so we can malloc() and free() a
	 * regdomain once. The reason we use reg_rules_intersect() here
	 * is it will return -EINVAL if the rule computed makes no sense.
912 913
	 * All rules that do check out OK are valid.
	 */
914 915 916 917 918

	for (x = 0; x < rd1->n_reg_rules; x++) {
		rule1 = &rd1->reg_rules[x];
		for (y = 0; y < rd2->n_reg_rules; y++) {
			rule2 = &rd2->reg_rules[y];
919
			if (!reg_rules_intersect(rd1, rd2, rule1, rule2,
920
						 &intersected_rule))
921 922 923 924 925 926 927 928
				num_rules++;
		}
	}

	if (!num_rules)
		return NULL;

	size_of_regd = sizeof(struct ieee80211_regdomain) +
929
		       num_rules * sizeof(struct ieee80211_reg_rule);
930 931 932 933 934

	rd = kzalloc(size_of_regd, GFP_KERNEL);
	if (!rd)
		return NULL;

935
	for (x = 0; x < rd1->n_reg_rules; x++) {
936
		rule1 = &rd1->reg_rules[x];
937
		for (y = 0; y < rd2->n_reg_rules; y++) {
938
			rule2 = &rd2->reg_rules[y];
939
			r = reg_rules_intersect(rd1, rd2, rule1, rule2,
940
						&intersected_rule);
941 942 943 944
			/*
			 * No need to memset here the intersected rule here as
			 * we're not using the stack anymore
			 */
945 946 947
			if (r)
				continue;

948 949 950
			add_rule(&intersected_rule, rd->reg_rules,
				 &rd->n_reg_rules);
		}
951 952 953 954
	}

	rd->alpha2[0] = '9';
	rd->alpha2[1] = '8';
955 956
	rd->dfs_region = reg_intersect_dfs_region(rd1->dfs_region,
						  rd2->dfs_region);
957 958 959 960

	return rd;
}

961 962 963 964
/*
 * XXX: add support for the rest of enum nl80211_reg_rule_flags, we may
 * want to just have the channel structure use these
 */
965 966 967
static u32 map_regdom_flags(u32 rd_flags)
{
	u32 channel_flags = 0;
968 969
	if (rd_flags & NL80211_RRF_NO_IR_ALL)
		channel_flags |= IEEE80211_CHAN_NO_IR;
970 971
	if (rd_flags & NL80211_RRF_DFS)
		channel_flags |= IEEE80211_CHAN_RADAR;
972 973
	if (rd_flags & NL80211_RRF_NO_OFDM)
		channel_flags |= IEEE80211_CHAN_NO_OFDM;
974 975
	if (rd_flags & NL80211_RRF_NO_OUTDOOR)
		channel_flags |= IEEE80211_CHAN_INDOOR_ONLY;
976 977 978 979 980 981 982 983 984 985
	if (rd_flags & NL80211_RRF_GO_CONCURRENT)
		channel_flags |= IEEE80211_CHAN_GO_CONCURRENT;
	if (rd_flags & NL80211_RRF_NO_HT40MINUS)
		channel_flags |= IEEE80211_CHAN_NO_HT40MINUS;
	if (rd_flags & NL80211_RRF_NO_HT40PLUS)
		channel_flags |= IEEE80211_CHAN_NO_HT40PLUS;
	if (rd_flags & NL80211_RRF_NO_80MHZ)
		channel_flags |= IEEE80211_CHAN_NO_80MHZ;
	if (rd_flags & NL80211_RRF_NO_160MHZ)
		channel_flags |= IEEE80211_CHAN_NO_160MHZ;
986 987 988
	return channel_flags;
}

989 990 991
static const struct ieee80211_reg_rule *
freq_reg_info_regd(struct wiphy *wiphy, u32 center_freq,
		   const struct ieee80211_regdomain *regd)
992 993
{
	int i;
994
	bool band_rule_found = false;
995 996
	bool bw_fits = false;

997
	if (!regd)
998
		return ERR_PTR(-EINVAL);
999

1000
	for (i = 0; i < regd->n_reg_rules; i++) {
1001 1002 1003
		const struct ieee80211_reg_rule *rr;
		const struct ieee80211_freq_range *fr = NULL;

1004
		rr = &regd->reg_rules[i];
1005
		fr = &rr->freq_range;
1006

1007 1008
		/*
		 * We only need to know if one frequency rule was
1009
		 * was in center_freq's band, that's enough, so lets
1010 1011
		 * not overwrite it once found
		 */
1012 1013 1014
		if (!band_rule_found)
			band_rule_found = freq_in_rule_band(fr, center_freq);

1015
		bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(20));
1016

1017 1018
		if (band_rule_found && bw_fits)
			return rr;
1019 1020
	}

1021
	if (!band_rule_found)
1022
		return ERR_PTR(-ERANGE);
1023

1024
	return ERR_PTR(-EINVAL);
1025 1026
}

1027 1028
const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
					       u32 center_freq)
1029
{
1030
	const struct ieee80211_regdomain *regd;
J
Johannes Berg 已提交
1031

1032
	regd = reg_get_regdomain(wiphy);
1033

1034
	return freq_reg_info_regd(wiphy, center_freq, regd);
1035
}
1036
EXPORT_SYMBOL(freq_reg_info);
1037

1038
const char *reg_initiator_name(enum nl80211_reg_initiator initiator)
1039 1040 1041
{
	switch (initiator) {
	case NL80211_REGDOM_SET_BY_CORE:
1042
		return "core";
1043
	case NL80211_REGDOM_SET_BY_USER:
1044
		return "user";
1045
	case NL80211_REGDOM_SET_BY_DRIVER:
1046
		return "driver";
1047
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
1048
		return "country IE";
1049 1050
	default:
		WARN_ON(1);
1051
		return "bug";
1052 1053
	}
}
1054
EXPORT_SYMBOL(reg_initiator_name);
1055

1056
#ifdef CONFIG_CFG80211_REG_DEBUG
1057 1058
static void chan_reg_rule_print_dbg(const struct ieee80211_regdomain *regd,
				    struct ieee80211_channel *chan,
1059 1060 1061 1062
				    const struct ieee80211_reg_rule *reg_rule)
{
	const struct ieee80211_power_rule *power_rule;
	const struct ieee80211_freq_range *freq_range;
1063
	char max_antenna_gain[32], bw[32];
1064 1065 1066 1067 1068

	power_rule = &reg_rule->power_rule;
	freq_range = &reg_rule->freq_range;

	if (!power_rule->max_antenna_gain)
1069
		snprintf(max_antenna_gain, sizeof(max_antenna_gain), "N/A");
1070
	else
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
		snprintf(max_antenna_gain, sizeof(max_antenna_gain), "%d",
			 power_rule->max_antenna_gain);

	if (reg_rule->flags & NL80211_RRF_AUTO_BW)
		snprintf(bw, sizeof(bw), "%d KHz, %d KHz AUTO",
			 freq_range->max_bandwidth_khz,
			 reg_get_max_bandwidth(regd, reg_rule));
	else
		snprintf(bw, sizeof(bw), "%d KHz",
			 freq_range->max_bandwidth_khz);
1081

1082 1083
	REG_DBG_PRINT("Updating information on frequency %d MHz with regulatory rule:\n",
		      chan->center_freq);
1084

1085
	REG_DBG_PRINT("%d KHz - %d KHz @ %s), (%s mBi, %d mBm)\n",
J
Johannes Berg 已提交
1086
		      freq_range->start_freq_khz, freq_range->end_freq_khz,
1087
		      bw, max_antenna_gain,
1088 1089 1090
		      power_rule->max_eirp);
}
#else
1091 1092
static void chan_reg_rule_print_dbg(const struct ieee80211_regdomain *regd,
				    struct ieee80211_channel *chan,
1093 1094 1095 1096
				    const struct ieee80211_reg_rule *reg_rule)
{
	return;
}
1097 1098
#endif

1099 1100 1101 1102
/*
 * Note that right now we assume the desired channel bandwidth
 * is always 20 MHz for each individual channel (HT40 uses 20 MHz
 * per channel, the primary and the extension channel).
1103
 */
1104 1105
static void handle_channel(struct wiphy *wiphy,
			   enum nl80211_reg_initiator initiator,
J
Johannes Berg 已提交
1106
			   struct ieee80211_channel *chan)
1107
{
1108
	u32 flags, bw_flags = 0;
1109 1110
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
1111
	const struct ieee80211_freq_range *freq_range = NULL;
1112
	struct wiphy *request_wiphy = NULL;
1113
	struct regulatory_request *lr = get_last_request();
1114 1115
	const struct ieee80211_regdomain *regd;
	u32 max_bandwidth_khz;
1116

1117
	request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
1118 1119

	flags = chan->orig_flags;
1120

1121 1122
	reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
	if (IS_ERR(reg_rule)) {
1123 1124
		/*
		 * We will disable all channels that do not match our
L
Lucas De Marchi 已提交
1125
		 * received regulatory rule unless the hint is coming
1126 1127 1128 1129 1130 1131 1132 1133
		 * from a Country IE and the Country IE had no information
		 * about a band. The IEEE 802.11 spec allows for an AP
		 * to send only a subset of the regulatory rules allowed,
		 * so an AP in the US that only supports 2.4 GHz may only send
		 * a country IE with information for the 2.4 GHz band
		 * while 5 GHz is still supported.
		 */
		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1134
		    PTR_ERR(reg_rule) == -ERANGE)
1135 1136
			return;

1137 1138
		if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
		    request_wiphy && request_wiphy == wiphy &&
1139
		    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1140 1141 1142 1143 1144 1145 1146 1147 1148
			REG_DBG_PRINT("Disabling freq %d MHz for good\n",
				      chan->center_freq);
			chan->orig_flags |= IEEE80211_CHAN_DISABLED;
			chan->flags = chan->orig_flags;
		} else {
			REG_DBG_PRINT("Disabling freq %d MHz\n",
				      chan->center_freq);
			chan->flags |= IEEE80211_CHAN_DISABLED;
		}
1149
		return;
1150
	}
1151

1152 1153
	regd = reg_get_regdomain(wiphy);
	chan_reg_rule_print_dbg(regd, chan, reg_rule);
1154

1155
	power_rule = &reg_rule->power_rule;
1156 1157
	freq_range = &reg_rule->freq_range;

1158 1159
	max_bandwidth_khz = freq_range->max_bandwidth_khz;
	/* Check if auto calculation requested */
1160
	if (reg_rule->flags & NL80211_RRF_AUTO_BW)
1161 1162 1163
		max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);

	if (max_bandwidth_khz < MHZ_TO_KHZ(40))
1164
		bw_flags = IEEE80211_CHAN_NO_HT40;
1165
	if (max_bandwidth_khz < MHZ_TO_KHZ(80))
1166
		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
1167
	if (max_bandwidth_khz < MHZ_TO_KHZ(160))
1168
		bw_flags |= IEEE80211_CHAN_NO_160MHZ;
1169

1170
	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1171
	    request_wiphy && request_wiphy == wiphy &&
1172
	    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1173
		/*
L
Lucas De Marchi 已提交
1174
		 * This guarantees the driver's requested regulatory domain
1175
		 * will always be used as a base for further regulatory
1176 1177
		 * settings
		 */
1178
		chan->flags = chan->orig_flags =
1179
			map_regdom_flags(reg_rule->flags) | bw_flags;
1180 1181
		chan->max_antenna_gain = chan->orig_mag =
			(int) MBI_TO_DBI(power_rule->max_antenna_gain);
1182
		chan->max_reg_power = chan->max_power = chan->orig_mpwr =
1183
			(int) MBM_TO_DBM(power_rule->max_eirp);
1184 1185 1186 1187 1188 1189 1190

		if (chan->flags & IEEE80211_CHAN_RADAR) {
			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
			if (reg_rule->dfs_cac_ms)
				chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
		}

1191 1192 1193
		return;
	}

1194 1195 1196
	chan->dfs_state = NL80211_DFS_USABLE;
	chan->dfs_state_entered = jiffies;

1197
	chan->beacon_found = false;
1198
	chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
J
Johannes Berg 已提交
1199 1200 1201
	chan->max_antenna_gain =
		min_t(int, chan->orig_mag,
		      MBI_TO_DBI(power_rule->max_antenna_gain));
1202
	chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
1203 1204 1205 1206 1207 1208 1209 1210

	if (chan->flags & IEEE80211_CHAN_RADAR) {
		if (reg_rule->dfs_cac_ms)
			chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
		else
			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
	}

1211 1212
	if (chan->orig_mpwr) {
		/*
1213 1214
		 * Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER
		 * will always follow the passed country IE power settings.
1215 1216
		 */
		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1217
		    wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
1218 1219 1220 1221 1222 1223
			chan->max_power = chan->max_reg_power;
		else
			chan->max_power = min(chan->orig_mpwr,
					      chan->max_reg_power);
	} else
		chan->max_power = chan->max_reg_power;
1224 1225
}

1226
static void handle_band(struct wiphy *wiphy,
J
Johannes Berg 已提交
1227 1228
			enum nl80211_reg_initiator initiator,
			struct ieee80211_supported_band *sband)
1229
{
1230 1231
	unsigned int i;

J
Johannes Berg 已提交
1232 1233
	if (!sband)
		return;
1234 1235

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
1236
		handle_channel(wiphy, initiator, &sband->channels[i]);
1237 1238
}

1239 1240 1241 1242
static bool reg_request_cell_base(struct regulatory_request *request)
{
	if (request->initiator != NL80211_REGDOM_SET_BY_USER)
		return false;
J
Johannes Berg 已提交
1243
	return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE;
1244 1245 1246 1247
}

bool reg_last_request_cell_base(void)
{
J
Johannes Berg 已提交
1248
	return reg_request_cell_base(get_last_request());
1249 1250
}

1251
#ifdef CONFIG_CFG80211_REG_CELLULAR_HINTS
1252
/* Core specific check */
1253 1254
static enum reg_request_treatment
reg_ignore_cell_hint(struct regulatory_request *pending_request)
1255
{
1256 1257
	struct regulatory_request *lr = get_last_request();

1258
	if (!reg_num_devs_support_basehint)
1259
		return REG_REQ_IGNORE;
1260

1261
	if (reg_request_cell_base(lr) &&
J
Johannes Berg 已提交
1262
	    !regdom_changes(pending_request->alpha2))
1263
		return REG_REQ_ALREADY_SET;
J
Johannes Berg 已提交
1264

1265
	return REG_REQ_OK;
1266 1267 1268 1269 1270
}

/* Device specific check */
static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
{
J
Johannes Berg 已提交
1271
	return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS);
1272 1273 1274 1275
}
#else
static int reg_ignore_cell_hint(struct regulatory_request *pending_request)
{
1276
	return REG_REQ_IGNORE;
1277
}
J
Johannes Berg 已提交
1278 1279

static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
1280 1281 1282 1283 1284
{
	return true;
}
#endif

1285 1286
static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy)
{
1287 1288
	if (wiphy->regulatory_flags & REGULATORY_STRICT_REG &&
	    !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG))
1289 1290 1291
		return true;
	return false;
}
1292

1293 1294
static bool ignore_reg_update(struct wiphy *wiphy,
			      enum nl80211_reg_initiator initiator)
1295
{
1296 1297
	struct regulatory_request *lr = get_last_request();

1298 1299 1300
	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
		return true;

1301
	if (!lr) {
1302 1303
		REG_DBG_PRINT("Ignoring regulatory request set by %s "
			      "since last_request is not set\n",
1304
			      reg_initiator_name(initiator));
1305
		return true;
1306 1307
	}

1308
	if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1309
	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
1310 1311 1312
		REG_DBG_PRINT("Ignoring regulatory request set by %s "
			      "since the driver uses its own custom "
			      "regulatory domain\n",
1313
			      reg_initiator_name(initiator));
1314
		return true;
1315 1316
	}

1317 1318 1319 1320
	/*
	 * wiphy->regd will be set once the device has its own
	 * desired regulatory domain set
	 */
1321
	if (wiphy_strict_alpha2_regd(wiphy) && !wiphy->regd &&
1322
	    initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1323
	    !is_world_regdom(lr->alpha2)) {
1324 1325 1326
		REG_DBG_PRINT("Ignoring regulatory request set by %s "
			      "since the driver requires its own regulatory "
			      "domain to be set first\n",
1327
			      reg_initiator_name(initiator));
1328
		return true;
1329 1330
	}

1331
	if (reg_request_cell_base(lr))
1332 1333
		return reg_dev_ignore_cell_hint(wiphy);

1334 1335 1336
	return false;
}

1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
static bool reg_is_world_roaming(struct wiphy *wiphy)
{
	const struct ieee80211_regdomain *cr = get_cfg80211_regdom();
	const struct ieee80211_regdomain *wr = get_wiphy_regdom(wiphy);
	struct regulatory_request *lr = get_last_request();

	if (is_world_regdom(cr->alpha2) || (wr && is_world_regdom(wr->alpha2)))
		return true;

	if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1347
	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1348 1349 1350 1351 1352
		return true;

	return false;
}

J
Johannes Berg 已提交
1353
static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
1354 1355 1356 1357
			      struct reg_beacon *reg_beacon)
{
	struct ieee80211_supported_band *sband;
	struct ieee80211_channel *chan;
1358 1359
	bool channel_changed = false;
	struct ieee80211_channel chan_before;
1360 1361 1362 1363 1364 1365 1366

	sband = wiphy->bands[reg_beacon->chan.band];
	chan = &sband->channels[chan_idx];

	if (likely(chan->center_freq != reg_beacon->chan.center_freq))
		return;

1367 1368 1369 1370 1371
	if (chan->beacon_found)
		return;

	chan->beacon_found = true;

1372 1373 1374
	if (!reg_is_world_roaming(wiphy))
		return;

1375
	if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS)
1376 1377
		return;

1378 1379 1380
	chan_before.center_freq = chan->center_freq;
	chan_before.flags = chan->flags;

1381 1382
	if (chan->flags & IEEE80211_CHAN_NO_IR) {
		chan->flags &= ~IEEE80211_CHAN_NO_IR;
1383
		channel_changed = true;
1384 1385
	}

1386 1387
	if (channel_changed)
		nl80211_send_beacon_hint_event(wiphy, &chan_before, chan);
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
}

/*
 * Called when a scan on a wiphy finds a beacon on
 * new channel
 */
static void wiphy_update_new_beacon(struct wiphy *wiphy,
				    struct reg_beacon *reg_beacon)
{
	unsigned int i;
	struct ieee80211_supported_band *sband;

	if (!wiphy->bands[reg_beacon->chan.band])
		return;

	sband = wiphy->bands[reg_beacon->chan.band];

	for (i = 0; i < sband->n_channels; i++)
		handle_reg_beacon(wiphy, i, reg_beacon);
}

/*
 * Called upon reg changes or a new wiphy is added
 */
static void wiphy_update_beacon_reg(struct wiphy *wiphy)
{
	unsigned int i;
	struct ieee80211_supported_band *sband;
	struct reg_beacon *reg_beacon;

	list_for_each_entry(reg_beacon, &reg_beacon_list, list) {
		if (!wiphy->bands[reg_beacon->chan.band])
			continue;
		sband = wiphy->bands[reg_beacon->chan.band];
		for (i = 0; i < sband->n_channels; i++)
			handle_reg_beacon(wiphy, i, reg_beacon);
	}
}

/* Reap the advantages of previously found beacons */
static void reg_process_beacons(struct wiphy *wiphy)
{
1430 1431 1432 1433 1434 1435
	/*
	 * Means we are just firing up cfg80211, so no beacons would
	 * have been processed yet.
	 */
	if (!last_request)
		return;
1436 1437 1438
	wiphy_update_beacon_reg(wiphy);
}

J
Johannes Berg 已提交
1439
static bool is_ht40_allowed(struct ieee80211_channel *chan)
1440 1441
{
	if (!chan)
J
Johannes Berg 已提交
1442
		return false;
1443
	if (chan->flags & IEEE80211_CHAN_DISABLED)
J
Johannes Berg 已提交
1444
		return false;
1445
	/* This would happen when regulatory rules disallow HT40 completely */
1446 1447 1448
	if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
		return false;
	return true;
1449 1450 1451
}

static void reg_process_ht_flags_channel(struct wiphy *wiphy,
J
Johannes Berg 已提交
1452
					 struct ieee80211_channel *channel)
1453
{
J
Johannes Berg 已提交
1454
	struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
1455 1456 1457
	struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
	unsigned int i;

J
Johannes Berg 已提交
1458
	if (!is_ht40_allowed(channel)) {
1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
		channel->flags |= IEEE80211_CHAN_NO_HT40;
		return;
	}

	/*
	 * We need to ensure the extension channels exist to
	 * be able to use HT40- or HT40+, this finds them (or not)
	 */
	for (i = 0; i < sband->n_channels; i++) {
		struct ieee80211_channel *c = &sband->channels[i];
J
Johannes Berg 已提交
1469

1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
		if (c->center_freq == (channel->center_freq - 20))
			channel_before = c;
		if (c->center_freq == (channel->center_freq + 20))
			channel_after = c;
	}

	/*
	 * Please note that this assumes target bandwidth is 20 MHz,
	 * if that ever changes we also need to change the below logic
	 * to include that as well.
	 */
J
Johannes Berg 已提交
1481
	if (!is_ht40_allowed(channel_before))
1482
		channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
1483
	else
1484
		channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
1485

J
Johannes Berg 已提交
1486
	if (!is_ht40_allowed(channel_after))
1487
		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
1488
	else
1489
		channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
1490 1491 1492
}

static void reg_process_ht_flags_band(struct wiphy *wiphy,
J
Johannes Berg 已提交
1493
				      struct ieee80211_supported_band *sband)
1494 1495 1496
{
	unsigned int i;

J
Johannes Berg 已提交
1497 1498
	if (!sband)
		return;
1499 1500

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
1501
		reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
1502 1503 1504 1505 1506 1507 1508 1509 1510
}

static void reg_process_ht_flags(struct wiphy *wiphy)
{
	enum ieee80211_band band;

	if (!wiphy)
		return;

J
Johannes Berg 已提交
1511 1512
	for (band = 0; band < IEEE80211_NUM_BANDS; band++)
		reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
1513 1514
}

1515 1516 1517 1518 1519 1520 1521
static void reg_call_notifier(struct wiphy *wiphy,
			      struct regulatory_request *request)
{
	if (wiphy->reg_notifier)
		wiphy->reg_notifier(wiphy, request);
}

1522 1523 1524 1525
static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
{
	struct cfg80211_chan_def chandef;
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1526
	enum nl80211_iftype iftype;
1527 1528

	wdev_lock(wdev);
1529
	iftype = wdev->iftype;
1530

1531
	/* make sure the interface is active */
1532
	if (!wdev->netdev || !netif_running(wdev->netdev))
1533
		goto wdev_inactive_unlock;
1534

1535
	switch (iftype) {
1536 1537 1538
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_P2P_GO:
		if (!wdev->beacon_interval)
1539 1540
			goto wdev_inactive_unlock;
		chandef = wdev->chandef;
1541 1542 1543
		break;
	case NL80211_IFTYPE_ADHOC:
		if (!wdev->ssid_len)
1544 1545
			goto wdev_inactive_unlock;
		chandef = wdev->chandef;
1546 1547 1548 1549 1550
		break;
	case NL80211_IFTYPE_STATION:
	case NL80211_IFTYPE_P2P_CLIENT:
		if (!wdev->current_bss ||
		    !wdev->current_bss->pub.channel)
1551
			goto wdev_inactive_unlock;
1552

1553 1554 1555 1556 1557
		if (!rdev->ops->get_channel ||
		    rdev_get_channel(rdev, wdev, &chandef))
			cfg80211_chandef_create(&chandef,
						wdev->current_bss->pub.channel,
						NL80211_CHAN_NO_HT);
1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570
		break;
	case NL80211_IFTYPE_MONITOR:
	case NL80211_IFTYPE_AP_VLAN:
	case NL80211_IFTYPE_P2P_DEVICE:
		/* no enforcement required */
		break;
	default:
		/* others not implemented for now */
		WARN_ON(1);
		break;
	}

	wdev_unlock(wdev);
1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589

	switch (iftype) {
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_P2P_GO:
	case NL80211_IFTYPE_ADHOC:
		return cfg80211_reg_can_beacon(wiphy, &chandef, iftype);
	case NL80211_IFTYPE_STATION:
	case NL80211_IFTYPE_P2P_CLIENT:
		return cfg80211_chandef_usable(wiphy, &chandef,
					       IEEE80211_CHAN_DISABLED);
	default:
		break;
	}

	return true;

wdev_inactive_unlock:
	wdev_unlock(wdev);
	return true;
1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629
}

static void reg_leave_invalid_chans(struct wiphy *wiphy)
{
	struct wireless_dev *wdev;
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);

	ASSERT_RTNL();

	list_for_each_entry(wdev, &rdev->wdev_list, list)
		if (!reg_wdev_chan_valid(wiphy, wdev))
			cfg80211_leave(rdev, wdev);
}

static void reg_check_chans_work(struct work_struct *work)
{
	struct cfg80211_registered_device *rdev;

	REG_DBG_PRINT("Verifying active interfaces after reg change\n");
	rtnl_lock();

	list_for_each_entry(rdev, &cfg80211_rdev_list, list)
		if (!(rdev->wiphy.regulatory_flags &
		      REGULATORY_IGNORE_STALE_KICKOFF))
			reg_leave_invalid_chans(&rdev->wiphy);

	rtnl_unlock();
}

static void reg_check_channels(void)
{
	/*
	 * Give usermode a chance to do something nicer (move to another
	 * channel, orderly disconnection), before forcing a disconnection.
	 */
	mod_delayed_work(system_power_efficient_wq,
			 &reg_check_chans,
			 msecs_to_jiffies(REG_ENFORCE_GRACE_MS));
}

1630 1631
static void wiphy_update_regulatory(struct wiphy *wiphy,
				    enum nl80211_reg_initiator initiator)
1632 1633
{
	enum ieee80211_band band;
1634
	struct regulatory_request *lr = get_last_request();
1635

1636 1637 1638 1639 1640 1641 1642
	if (ignore_reg_update(wiphy, initiator)) {
		/*
		 * Regulatory updates set by CORE are ignored for custom
		 * regulatory cards. Let us notify the changes to the driver,
		 * as some drivers used this to restore its orig_* reg domain.
		 */
		if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1643
		    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1644
			reg_call_notifier(wiphy, lr);
1645
		return;
1646
	}
1647

1648
	lr->dfs_region = get_cfg80211_regdom()->dfs_region;
1649

J
Johannes Berg 已提交
1650 1651
	for (band = 0; band < IEEE80211_NUM_BANDS; band++)
		handle_band(wiphy, initiator, wiphy->bands[band]);
1652

1653
	reg_process_beacons(wiphy);
1654
	reg_process_ht_flags(wiphy);
1655
	reg_call_notifier(wiphy, lr);
1656 1657
}

1658 1659 1660
static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
{
	struct cfg80211_registered_device *rdev;
1661
	struct wiphy *wiphy;
1662

1663
	ASSERT_RTNL();
1664

1665 1666 1667 1668
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		wiphy = &rdev->wiphy;
		wiphy_update_regulatory(wiphy, initiator);
	}
1669 1670

	reg_check_channels();
1671 1672
}

1673
static void handle_channel_custom(struct wiphy *wiphy,
J
Johannes Berg 已提交
1674
				  struct ieee80211_channel *chan,
1675 1676
				  const struct ieee80211_regdomain *regd)
{
1677
	u32 bw_flags = 0;
1678 1679
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
1680
	const struct ieee80211_freq_range *freq_range = NULL;
1681
	u32 max_bandwidth_khz;
1682

1683 1684
	reg_rule = freq_reg_info_regd(wiphy, MHZ_TO_KHZ(chan->center_freq),
				      regd);
1685

1686
	if (IS_ERR(reg_rule)) {
1687 1688
		REG_DBG_PRINT("Disabling freq %d MHz as custom regd has no rule that fits it\n",
			      chan->center_freq);
1689 1690 1691 1692 1693 1694
		if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
			chan->flags |= IEEE80211_CHAN_DISABLED;
		} else {
			chan->orig_flags |= IEEE80211_CHAN_DISABLED;
			chan->flags = chan->orig_flags;
		}
1695 1696 1697
		return;
	}

1698
	chan_reg_rule_print_dbg(regd, chan, reg_rule);
1699

1700
	power_rule = &reg_rule->power_rule;
1701 1702
	freq_range = &reg_rule->freq_range;

1703 1704
	max_bandwidth_khz = freq_range->max_bandwidth_khz;
	/* Check if auto calculation requested */
1705
	if (reg_rule->flags & NL80211_RRF_AUTO_BW)
1706 1707 1708
		max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);

	if (max_bandwidth_khz < MHZ_TO_KHZ(40))
1709
		bw_flags = IEEE80211_CHAN_NO_HT40;
1710
	if (max_bandwidth_khz < MHZ_TO_KHZ(80))
1711
		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
1712
	if (max_bandwidth_khz < MHZ_TO_KHZ(160))
1713
		bw_flags |= IEEE80211_CHAN_NO_160MHZ;
1714

1715
	chan->dfs_state_entered = jiffies;
1716 1717 1718
	chan->dfs_state = NL80211_DFS_USABLE;

	chan->beacon_found = false;
1719 1720 1721 1722 1723 1724 1725

	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
		chan->flags = chan->orig_flags | bw_flags |
			      map_regdom_flags(reg_rule->flags);
	else
		chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;

1726
	chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
1727 1728
	chan->max_reg_power = chan->max_power =
		(int) MBM_TO_DBM(power_rule->max_eirp);
1729 1730 1731 1732 1733 1734 1735 1736 1737

	if (chan->flags & IEEE80211_CHAN_RADAR) {
		if (reg_rule->dfs_cac_ms)
			chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
		else
			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
	}

	chan->max_power = chan->max_reg_power;
1738 1739
}

J
Johannes Berg 已提交
1740 1741
static void handle_band_custom(struct wiphy *wiphy,
			       struct ieee80211_supported_band *sband,
1742 1743 1744 1745
			       const struct ieee80211_regdomain *regd)
{
	unsigned int i;

J
Johannes Berg 已提交
1746 1747
	if (!sband)
		return;
1748 1749

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
1750
		handle_channel_custom(wiphy, &sband->channels[i], regd);
1751 1752 1753 1754 1755 1756 1757
}

/* Used by drivers prior to wiphy registration */
void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
				   const struct ieee80211_regdomain *regd)
{
	enum ieee80211_band band;
1758
	unsigned int bands_set = 0;
1759

1760 1761 1762
	WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG),
	     "wiphy should have REGULATORY_CUSTOM_REG\n");
	wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
1763

1764
	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1765 1766
		if (!wiphy->bands[band])
			continue;
J
Johannes Berg 已提交
1767
		handle_band_custom(wiphy, wiphy->bands[band], regd);
1768
		bands_set++;
1769
	}
1770 1771 1772

	/*
	 * no point in calling this if it won't have any effect
J
Johannes Berg 已提交
1773
	 * on your device's supported bands.
1774 1775
	 */
	WARN_ON(!bands_set);
1776
}
1777 1778
EXPORT_SYMBOL(wiphy_apply_custom_regulatory);

1779 1780 1781
static void reg_set_request_processed(void)
{
	bool need_more_processing = false;
1782
	struct regulatory_request *lr = get_last_request();
1783

1784
	lr->processed = true;
1785 1786 1787 1788 1789 1790

	spin_lock(&reg_requests_lock);
	if (!list_empty(&reg_requests_list))
		need_more_processing = true;
	spin_unlock(&reg_requests_lock);

1791
	if (lr->initiator == NL80211_REGDOM_SET_BY_USER)
1792
		cancel_delayed_work(&reg_timeout);
1793

1794 1795 1796 1797
	if (need_more_processing)
		schedule_work(&reg_work);
}

1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
/**
 * reg_process_hint_core - process core regulatory requests
 * @pending_request: a pending core regulatory request
 *
 * The wireless subsystem can use this function to process
 * a regulatory request issued by the regulatory core.
 *
 * Returns one of the different reg request treatment values.
 */
static enum reg_request_treatment
reg_process_hint_core(struct regulatory_request *core_request)
{

	core_request->intersect = false;
	core_request->processed = false;
1813

1814
	reg_update_last_request(core_request);
1815

1816
	return reg_call_crda(core_request);
1817 1818
}

1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870
static enum reg_request_treatment
__reg_process_hint_user(struct regulatory_request *user_request)
{
	struct regulatory_request *lr = get_last_request();

	if (reg_request_cell_base(user_request))
		return reg_ignore_cell_hint(user_request);

	if (reg_request_cell_base(lr))
		return REG_REQ_IGNORE;

	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
		return REG_REQ_INTERSECT;
	/*
	 * If the user knows better the user should set the regdom
	 * to their country before the IE is picked up
	 */
	if (lr->initiator == NL80211_REGDOM_SET_BY_USER &&
	    lr->intersect)
		return REG_REQ_IGNORE;
	/*
	 * Process user requests only after previous user/driver/core
	 * requests have been processed
	 */
	if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE ||
	     lr->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
	     lr->initiator == NL80211_REGDOM_SET_BY_USER) &&
	    regdom_changes(lr->alpha2))
		return REG_REQ_IGNORE;

	if (!regdom_changes(user_request->alpha2))
		return REG_REQ_ALREADY_SET;

	return REG_REQ_OK;
}

/**
 * reg_process_hint_user - process user regulatory requests
 * @user_request: a pending user regulatory request
 *
 * The wireless subsystem can use this function to process
 * a regulatory request initiated by userspace.
 *
 * Returns one of the different reg request treatment values.
 */
static enum reg_request_treatment
reg_process_hint_user(struct regulatory_request *user_request)
{
	enum reg_request_treatment treatment;

	treatment = __reg_process_hint_user(user_request);
	if (treatment == REG_REQ_IGNORE ||
1871
	    treatment == REG_REQ_ALREADY_SET) {
1872
		reg_free_request(user_request);
1873 1874 1875 1876 1877
		return treatment;
	}

	user_request->intersect = treatment == REG_REQ_INTERSECT;
	user_request->processed = false;
1878

1879
	reg_update_last_request(user_request);
1880 1881 1882 1883

	user_alpha2[0] = user_request->alpha2[0];
	user_alpha2[1] = user_request->alpha2[1];

1884
	return reg_call_crda(user_request);
1885 1886
}

1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922
static enum reg_request_treatment
__reg_process_hint_driver(struct regulatory_request *driver_request)
{
	struct regulatory_request *lr = get_last_request();

	if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) {
		if (regdom_changes(driver_request->alpha2))
			return REG_REQ_OK;
		return REG_REQ_ALREADY_SET;
	}

	/*
	 * This would happen if you unplug and plug your card
	 * back in or if you add a new device for which the previously
	 * loaded card also agrees on the regulatory domain.
	 */
	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
	    !regdom_changes(driver_request->alpha2))
		return REG_REQ_ALREADY_SET;

	return REG_REQ_INTERSECT;
}

/**
 * reg_process_hint_driver - process driver regulatory requests
 * @driver_request: a pending driver regulatory request
 *
 * The wireless subsystem can use this function to process
 * a regulatory request issued by an 802.11 driver.
 *
 * Returns one of the different reg request treatment values.
 */
static enum reg_request_treatment
reg_process_hint_driver(struct wiphy *wiphy,
			struct regulatory_request *driver_request)
{
1923
	const struct ieee80211_regdomain *regd, *tmp;
1924 1925 1926 1927 1928 1929 1930 1931
	enum reg_request_treatment treatment;

	treatment = __reg_process_hint_driver(driver_request);

	switch (treatment) {
	case REG_REQ_OK:
		break;
	case REG_REQ_IGNORE:
1932
		reg_free_request(driver_request);
1933 1934 1935 1936 1937 1938
		return treatment;
	case REG_REQ_INTERSECT:
		/* fall through */
	case REG_REQ_ALREADY_SET:
		regd = reg_copy_regd(get_cfg80211_regdom());
		if (IS_ERR(regd)) {
1939
			reg_free_request(driver_request);
1940 1941
			return REG_REQ_IGNORE;
		}
1942 1943

		tmp = get_wiphy_regdom(wiphy);
1944
		rcu_assign_pointer(wiphy->regd, regd);
1945
		rcu_free_regdom(tmp);
1946 1947 1948 1949 1950
	}


	driver_request->intersect = treatment == REG_REQ_INTERSECT;
	driver_request->processed = false;
1951

1952
	reg_update_last_request(driver_request);
1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964

	/*
	 * Since CRDA will not be called in this case as we already
	 * have applied the requested regulatory domain before we just
	 * inform userspace we have processed the request
	 */
	if (treatment == REG_REQ_ALREADY_SET) {
		nl80211_send_reg_change_event(driver_request);
		reg_set_request_processed();
		return treatment;
	}

1965
	return reg_call_crda(driver_request);
1966 1967
}

1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
static enum reg_request_treatment
__reg_process_hint_country_ie(struct wiphy *wiphy,
			      struct regulatory_request *country_ie_request)
{
	struct wiphy *last_wiphy = NULL;
	struct regulatory_request *lr = get_last_request();

	if (reg_request_cell_base(lr)) {
		/* Trust a Cell base station over the AP's country IE */
		if (regdom_changes(country_ie_request->alpha2))
			return REG_REQ_IGNORE;
		return REG_REQ_ALREADY_SET;
1980 1981 1982
	} else {
		if (wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)
			return REG_REQ_IGNORE;
1983 1984 1985 1986
	}

	if (unlikely(!is_an_alpha2(country_ie_request->alpha2)))
		return -EINVAL;
1987 1988 1989 1990 1991 1992 1993

	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE)
		return REG_REQ_OK;

	last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);

	if (last_wiphy != wiphy) {
1994
		/*
1995 1996 1997 1998
		 * Two cards with two APs claiming different
		 * Country IE alpha2s. We could
		 * intersect them, but that seems unlikely
		 * to be correct. Reject second one for now.
1999
		 */
2000 2001
		if (regdom_changes(country_ie_request->alpha2))
			return REG_REQ_IGNORE;
2002 2003
		return REG_REQ_ALREADY_SET;
	}
2004 2005

	if (regdom_changes(country_ie_request->alpha2))
2006 2007
		return REG_REQ_OK;
	return REG_REQ_ALREADY_SET;
2008 2009
}

2010
/**
2011 2012
 * reg_process_hint_country_ie - process regulatory requests from country IEs
 * @country_ie_request: a regulatory request from a country IE
2013
 *
2014 2015
 * The wireless subsystem can use this function to process
 * a regulatory request issued by a country Information Element.
2016
 *
2017
 * Returns one of the different reg request treatment values.
2018
 */
2019
static enum reg_request_treatment
2020 2021
reg_process_hint_country_ie(struct wiphy *wiphy,
			    struct regulatory_request *country_ie_request)
2022
{
2023
	enum reg_request_treatment treatment;
2024

2025
	treatment = __reg_process_hint_country_ie(wiphy, country_ie_request);
2026

2027 2028 2029
	switch (treatment) {
	case REG_REQ_OK:
		break;
2030 2031 2032
	case REG_REQ_IGNORE:
		/* fall through */
	case REG_REQ_ALREADY_SET:
2033
		reg_free_request(country_ie_request);
2034 2035
		return treatment;
	case REG_REQ_INTERSECT:
2036
		reg_free_request(country_ie_request);
2037
		/*
2038 2039
		 * This doesn't happen yet, not sure we
		 * ever want to support it for this case.
2040
		 */
2041 2042
		WARN_ONCE(1, "Unexpected intersection for country IEs");
		return REG_REQ_IGNORE;
2043
	}
2044

2045 2046
	country_ie_request->intersect = false;
	country_ie_request->processed = false;
2047

2048
	reg_update_last_request(country_ie_request);
2049

2050
	return reg_call_crda(country_ie_request);
2051 2052
}

2053
/* This processes *all* regulatory hints */
2054
static void reg_process_hint(struct regulatory_request *reg_request)
2055 2056
{
	struct wiphy *wiphy = NULL;
2057
	enum reg_request_treatment treatment;
2058

J
Johannes Berg 已提交
2059
	if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
2060 2061
		wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);

2062 2063 2064 2065 2066
	switch (reg_request->initiator) {
	case NL80211_REGDOM_SET_BY_CORE:
		reg_process_hint_core(reg_request);
		return;
	case NL80211_REGDOM_SET_BY_USER:
2067
		treatment = reg_process_hint_user(reg_request);
2068
		if (treatment == REG_REQ_IGNORE ||
2069
		    treatment == REG_REQ_ALREADY_SET)
2070
			return;
2071 2072
		queue_delayed_work(system_power_efficient_wq,
				   &reg_timeout, msecs_to_jiffies(3142));
2073
		return;
2074
	case NL80211_REGDOM_SET_BY_DRIVER:
2075 2076
		if (!wiphy)
			goto out_free;
2077 2078
		treatment = reg_process_hint_driver(wiphy, reg_request);
		break;
2079
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
2080 2081
		if (!wiphy)
			goto out_free;
2082
		treatment = reg_process_hint_country_ie(wiphy, reg_request);
2083 2084 2085
		break;
	default:
		WARN(1, "invalid initiator %d\n", reg_request->initiator);
2086
		goto out_free;
2087 2088
	}

2089 2090
	/* This is required so that the orig_* parameters are saved */
	if (treatment == REG_REQ_ALREADY_SET && wiphy &&
2091
	    wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
2092
		wiphy_update_regulatory(wiphy, reg_request->initiator);
2093 2094
		reg_check_channels();
	}
2095 2096 2097 2098

	return;

out_free:
2099
	reg_free_request(reg_request);
2100 2101
}

2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121
static bool reg_only_self_managed_wiphys(void)
{
	struct cfg80211_registered_device *rdev;
	struct wiphy *wiphy;
	bool self_managed_found = false;

	ASSERT_RTNL();

	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		wiphy = &rdev->wiphy;
		if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
			self_managed_found = true;
		else
			return false;
	}

	/* make sure at least one self-managed wiphy exists */
	return self_managed_found;
}

2122 2123 2124 2125 2126
/*
 * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_*
 * Regulatory hints come on a first come first serve basis and we
 * must process each one atomically.
 */
2127
static void reg_process_pending_hints(void)
2128
{
2129
	struct regulatory_request *reg_request, *lr;
2130

2131
	lr = get_last_request();
2132

2133
	/* When last_request->processed becomes true this will be rescheduled */
2134
	if (lr && !lr->processed) {
2135
		reg_process_hint(lr);
2136
		return;
2137 2138
	}

2139 2140
	spin_lock(&reg_requests_lock);

2141
	if (list_empty(&reg_requests_list)) {
2142
		spin_unlock(&reg_requests_lock);
2143
		return;
2144
	}
2145 2146 2147 2148 2149 2150

	reg_request = list_first_entry(&reg_requests_list,
				       struct regulatory_request,
				       list);
	list_del_init(&reg_request->list);

2151
	spin_unlock(&reg_requests_lock);
2152

2153 2154 2155 2156 2157
	if (reg_only_self_managed_wiphys()) {
		reg_free_request(reg_request);
		return;
	}

2158
	reg_process_hint(reg_request);
2159 2160
}

2161 2162 2163
/* Processes beacon hints -- this has nothing to do with country IEs */
static void reg_process_pending_beacon_hints(void)
{
2164
	struct cfg80211_registered_device *rdev;
2165 2166 2167 2168 2169 2170 2171 2172 2173 2174
	struct reg_beacon *pending_beacon, *tmp;

	/* This goes through the _pending_ beacon list */
	spin_lock_bh(&reg_pending_beacons_lock);

	list_for_each_entry_safe(pending_beacon, tmp,
				 &reg_pending_beacons, list) {
		list_del_init(&pending_beacon->list);

		/* Applies the beacon hint to current wiphys */
2175 2176
		list_for_each_entry(rdev, &cfg80211_rdev_list, list)
			wiphy_update_new_beacon(&rdev->wiphy, pending_beacon);
2177 2178 2179 2180 2181 2182 2183 2184

		/* Remembers the beacon hint for new wiphys or reg changes */
		list_add_tail(&pending_beacon->list, &reg_beacon_list);
	}

	spin_unlock_bh(&reg_pending_beacons_lock);
}

2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224
static void reg_process_self_managed_hints(void)
{
	struct cfg80211_registered_device *rdev;
	struct wiphy *wiphy;
	const struct ieee80211_regdomain *tmp;
	const struct ieee80211_regdomain *regd;
	enum ieee80211_band band;
	struct regulatory_request request = {};

	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		wiphy = &rdev->wiphy;

		spin_lock(&reg_requests_lock);
		regd = rdev->requested_regd;
		rdev->requested_regd = NULL;
		spin_unlock(&reg_requests_lock);

		if (regd == NULL)
			continue;

		tmp = get_wiphy_regdom(wiphy);
		rcu_assign_pointer(wiphy->regd, regd);
		rcu_free_regdom(tmp);

		for (band = 0; band < IEEE80211_NUM_BANDS; band++)
			handle_band_custom(wiphy, wiphy->bands[band], regd);

		reg_process_ht_flags(wiphy);

		request.wiphy_idx = get_wiphy_idx(wiphy);
		request.alpha2[0] = regd->alpha2[0];
		request.alpha2[1] = regd->alpha2[1];
		request.initiator = NL80211_REGDOM_SET_BY_DRIVER;

		nl80211_send_wiphy_reg_change_event(&request);
	}

	reg_check_channels();
}

2225 2226
static void reg_todo(struct work_struct *work)
{
2227
	rtnl_lock();
2228
	reg_process_pending_hints();
2229
	reg_process_pending_beacon_hints();
2230
	reg_process_self_managed_hints();
2231
	rtnl_unlock();
2232 2233 2234 2235
}

static void queue_regulatory_request(struct regulatory_request *request)
{
2236 2237
	request->alpha2[0] = toupper(request->alpha2[0]);
	request->alpha2[1] = toupper(request->alpha2[1]);
2238

2239 2240 2241 2242 2243 2244 2245
	spin_lock(&reg_requests_lock);
	list_add_tail(&request->list, &reg_requests_list);
	spin_unlock(&reg_requests_lock);

	schedule_work(&reg_work);
}

2246 2247 2248 2249
/*
 * Core regulatory hint -- happens during cfg80211_init()
 * and when we restore regulatory settings.
 */
2250 2251 2252 2253
static int regulatory_hint_core(const char *alpha2)
{
	struct regulatory_request *request;

J
Johannes Berg 已提交
2254
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
2255 2256 2257 2258 2259
	if (!request)
		return -ENOMEM;

	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2260
	request->initiator = NL80211_REGDOM_SET_BY_CORE;
2261

2262
	queue_regulatory_request(request);
2263

2264
	return 0;
2265 2266
}

2267
/* User hints */
2268 2269
int regulatory_hint_user(const char *alpha2,
			 enum nl80211_user_reg_hint_type user_reg_hint_type)
2270
{
2271 2272
	struct regulatory_request *request;

J
Johannes Berg 已提交
2273 2274
	if (WARN_ON(!alpha2))
		return -EINVAL;
2275

2276 2277 2278 2279
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
	if (!request)
		return -ENOMEM;

J
Johannes Berg 已提交
2280
	request->wiphy_idx = WIPHY_IDX_INVALID;
2281 2282
	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2283
	request->initiator = NL80211_REGDOM_SET_BY_USER;
2284
	request->user_reg_hint_type = user_reg_hint_type;
2285 2286 2287 2288 2289 2290

	queue_regulatory_request(request);

	return 0;
}

2291 2292 2293 2294
int regulatory_hint_indoor_user(void)
{


2295
	reg_is_indoor = true;
2296 2297 2298 2299

	return 0;
}

2300 2301 2302 2303 2304
/* Driver hints */
int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
{
	struct regulatory_request *request;

J
Johannes Berg 已提交
2305 2306
	if (WARN_ON(!alpha2 || !wiphy))
		return -EINVAL;
2307

2308 2309
	wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG;

2310 2311 2312 2313 2314 2315 2316 2317
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
	if (!request)
		return -ENOMEM;

	request->wiphy_idx = get_wiphy_idx(wiphy);

	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2318
	request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
2319 2320 2321 2322

	queue_regulatory_request(request);

	return 0;
2323 2324 2325
}
EXPORT_SYMBOL(regulatory_hint);

2326 2327
void regulatory_hint_country_ie(struct wiphy *wiphy, enum ieee80211_band band,
				const u8 *country_ie, u8 country_ie_len)
2328 2329 2330
{
	char alpha2[2];
	enum environment_cap env = ENVIRON_ANY;
2331
	struct regulatory_request *request = NULL, *lr;
2332

2333 2334
	/* IE len must be evenly divisible by 2 */
	if (country_ie_len & 0x01)
2335
		return;
2336 2337

	if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
2338 2339 2340 2341 2342
		return;

	request = kzalloc(sizeof(*request), GFP_KERNEL);
	if (!request)
		return;
2343 2344 2345 2346 2347 2348 2349 2350 2351

	alpha2[0] = country_ie[0];
	alpha2[1] = country_ie[1];

	if (country_ie[2] == 'I')
		env = ENVIRON_INDOOR;
	else if (country_ie[2] == 'O')
		env = ENVIRON_OUTDOOR;

2352 2353 2354 2355 2356 2357
	rcu_read_lock();
	lr = get_last_request();

	if (unlikely(!lr))
		goto out;

2358
	/*
2359
	 * We will run this only upon a successful connection on cfg80211.
2360
	 * We leave conflict resolution to the workqueue, where can hold
2361
	 * the RTNL.
2362
	 */
2363 2364
	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
	    lr->wiphy_idx != WIPHY_IDX_INVALID)
2365
		goto out;
2366

2367
	request->wiphy_idx = get_wiphy_idx(wiphy);
2368 2369
	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2370
	request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
2371 2372 2373
	request->country_ie_env = env;

	queue_regulatory_request(request);
2374
	request = NULL;
2375
out:
2376 2377
	kfree(request);
	rcu_read_unlock();
2378
}
2379

2380 2381 2382 2383 2384 2385 2386 2387 2388 2389
static void restore_alpha2(char *alpha2, bool reset_user)
{
	/* indicates there is no alpha2 to consider for restoration */
	alpha2[0] = '9';
	alpha2[1] = '7';

	/* The user setting has precedence over the module parameter */
	if (is_user_regdom_saved()) {
		/* Unless we're asked to ignore it and reset it */
		if (reset_user) {
J
Johannes Berg 已提交
2390
			REG_DBG_PRINT("Restoring regulatory settings including user preference\n");
2391 2392 2393 2394 2395 2396 2397 2398 2399
			user_alpha2[0] = '9';
			user_alpha2[1] = '7';

			/*
			 * If we're ignoring user settings, we still need to
			 * check the module parameter to ensure we put things
			 * back as they were for a full restore.
			 */
			if (!is_world_regdom(ieee80211_regdom)) {
J
Johannes Berg 已提交
2400 2401
				REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
					      ieee80211_regdom[0], ieee80211_regdom[1]);
2402 2403 2404 2405
				alpha2[0] = ieee80211_regdom[0];
				alpha2[1] = ieee80211_regdom[1];
			}
		} else {
J
Johannes Berg 已提交
2406 2407
			REG_DBG_PRINT("Restoring regulatory settings while preserving user preference for: %c%c\n",
				      user_alpha2[0], user_alpha2[1]);
2408 2409 2410 2411
			alpha2[0] = user_alpha2[0];
			alpha2[1] = user_alpha2[1];
		}
	} else if (!is_world_regdom(ieee80211_regdom)) {
J
Johannes Berg 已提交
2412 2413
		REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
			      ieee80211_regdom[0], ieee80211_regdom[1]);
2414 2415 2416
		alpha2[0] = ieee80211_regdom[0];
		alpha2[1] = ieee80211_regdom[1];
	} else
2417
		REG_DBG_PRINT("Restoring regulatory settings\n");
2418 2419
}

2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435
static void restore_custom_reg_settings(struct wiphy *wiphy)
{
	struct ieee80211_supported_band *sband;
	enum ieee80211_band band;
	struct ieee80211_channel *chan;
	int i;

	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
		sband = wiphy->bands[band];
		if (!sband)
			continue;
		for (i = 0; i < sband->n_channels; i++) {
			chan = &sband->channels[i];
			chan->flags = chan->orig_flags;
			chan->max_antenna_gain = chan->orig_mag;
			chan->max_power = chan->orig_mpwr;
2436
			chan->beacon_found = false;
2437 2438 2439 2440
		}
	}
}

2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458
/*
 * Restoring regulatory settings involves ingoring any
 * possibly stale country IE information and user regulatory
 * settings if so desired, this includes any beacon hints
 * learned as we could have traveled outside to another country
 * after disconnection. To restore regulatory settings we do
 * exactly what we did at bootup:
 *
 *   - send a core regulatory hint
 *   - send a user regulatory hint if applicable
 *
 * Device drivers that send a regulatory hint for a specific country
 * keep their own regulatory domain on wiphy->regd so that does does
 * not need to be remembered.
 */
static void restore_regulatory_settings(bool reset_user)
{
	char alpha2[2];
2459
	char world_alpha2[2];
2460
	struct reg_beacon *reg_beacon, *btmp;
2461 2462
	struct regulatory_request *reg_request, *tmp;
	LIST_HEAD(tmp_reg_req_list);
2463
	struct cfg80211_registered_device *rdev;
2464

2465 2466
	ASSERT_RTNL();

2467 2468
	reg_is_indoor = false;

2469
	reset_regdomains(true, &world_regdom);
2470 2471
	restore_alpha2(alpha2, reset_user);

2472 2473 2474 2475 2476 2477 2478
	/*
	 * If there's any pending requests we simply
	 * stash them to a temporary pending queue and
	 * add then after we've restored regulatory
	 * settings.
	 */
	spin_lock(&reg_requests_lock);
2479 2480 2481 2482
	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
		if (reg_request->initiator != NL80211_REGDOM_SET_BY_USER)
			continue;
		list_move_tail(&reg_request->list, &tmp_reg_req_list);
2483 2484 2485
	}
	spin_unlock(&reg_requests_lock);

2486 2487
	/* Clear beacon hints */
	spin_lock_bh(&reg_pending_beacons_lock);
2488 2489 2490
	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
2491 2492 2493
	}
	spin_unlock_bh(&reg_pending_beacons_lock);

2494 2495 2496
	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
2497 2498 2499
	}

	/* First restore to the basic regulatory settings */
2500 2501
	world_alpha2[0] = cfg80211_world_regdom->alpha2[0];
	world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
2502

2503
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2504 2505
		if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
			continue;
2506
		if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG)
2507 2508 2509
			restore_custom_reg_settings(&rdev->wiphy);
	}

2510
	regulatory_hint_core(world_alpha2);
2511 2512 2513 2514 2515 2516 2517

	/*
	 * This restores the ieee80211_regdom module parameter
	 * preference or the last user requested regulatory
	 * settings, user regulatory settings takes precedence.
	 */
	if (is_an_alpha2(alpha2))
2518
		regulatory_hint_user(user_alpha2, NL80211_USER_REG_HINT_USER);
2519

2520
	spin_lock(&reg_requests_lock);
2521
	list_splice_tail_init(&tmp_reg_req_list, &reg_requests_list);
2522 2523 2524 2525 2526 2527
	spin_unlock(&reg_requests_lock);

	REG_DBG_PRINT("Kicking the queue\n");

	schedule_work(&reg_work);
}
2528 2529 2530

void regulatory_hint_disconnect(void)
{
J
Johannes Berg 已提交
2531
	REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n");
2532 2533 2534
	restore_regulatory_settings(false);
}

2535 2536
static bool freq_is_chan_12_13_14(u16 freq)
{
2537 2538 2539
	if (freq == ieee80211_channel_to_frequency(12, IEEE80211_BAND_2GHZ) ||
	    freq == ieee80211_channel_to_frequency(13, IEEE80211_BAND_2GHZ) ||
	    freq == ieee80211_channel_to_frequency(14, IEEE80211_BAND_2GHZ))
2540 2541 2542 2543
		return true;
	return false;
}

2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554
static bool pending_reg_beacon(struct ieee80211_channel *beacon_chan)
{
	struct reg_beacon *pending_beacon;

	list_for_each_entry(pending_beacon, &reg_pending_beacons, list)
		if (beacon_chan->center_freq ==
		    pending_beacon->chan.center_freq)
			return true;
	return false;
}

2555 2556 2557 2558 2559
int regulatory_hint_found_beacon(struct wiphy *wiphy,
				 struct ieee80211_channel *beacon_chan,
				 gfp_t gfp)
{
	struct reg_beacon *reg_beacon;
2560
	bool processing;
2561

J
Johannes Berg 已提交
2562 2563
	if (beacon_chan->beacon_found ||
	    beacon_chan->flags & IEEE80211_CHAN_RADAR ||
2564
	    (beacon_chan->band == IEEE80211_BAND_2GHZ &&
J
Johannes Berg 已提交
2565
	     !freq_is_chan_12_13_14(beacon_chan->center_freq)))
2566 2567
		return 0;

2568 2569 2570 2571 2572
	spin_lock_bh(&reg_pending_beacons_lock);
	processing = pending_reg_beacon(beacon_chan);
	spin_unlock_bh(&reg_pending_beacons_lock);

	if (processing)
2573 2574 2575 2576 2577 2578
		return 0;

	reg_beacon = kzalloc(sizeof(struct reg_beacon), gfp);
	if (!reg_beacon)
		return -ENOMEM;

J
Johannes Berg 已提交
2579
	REG_DBG_PRINT("Found new beacon on frequency: %d MHz (Ch %d) on %s\n",
2580 2581 2582 2583
		      beacon_chan->center_freq,
		      ieee80211_frequency_to_channel(beacon_chan->center_freq),
		      wiphy_name(wiphy));

2584
	memcpy(&reg_beacon->chan, beacon_chan,
J
Johannes Berg 已提交
2585
	       sizeof(struct ieee80211_channel));
2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599

	/*
	 * Since we can be called from BH or and non-BH context
	 * we must use spin_lock_bh()
	 */
	spin_lock_bh(&reg_pending_beacons_lock);
	list_add_tail(&reg_beacon->list, &reg_pending_beacons);
	spin_unlock_bh(&reg_pending_beacons_lock);

	schedule_work(&reg_work);

	return 0;
}

2600
static void print_rd_rules(const struct ieee80211_regdomain *rd)
2601 2602
{
	unsigned int i;
2603 2604 2605
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_freq_range *freq_range = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
2606
	char bw[32], cac_time[32];
2607

2608
	pr_info("  (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n");
2609 2610 2611 2612 2613 2614

	for (i = 0; i < rd->n_reg_rules; i++) {
		reg_rule = &rd->reg_rules[i];
		freq_range = &reg_rule->freq_range;
		power_rule = &reg_rule->power_rule;

2615 2616 2617
		if (reg_rule->flags & NL80211_RRF_AUTO_BW)
			snprintf(bw, sizeof(bw), "%d KHz, %d KHz AUTO",
				 freq_range->max_bandwidth_khz,
2618 2619
				 reg_get_max_bandwidth(rd, reg_rule));
		else
2620
			snprintf(bw, sizeof(bw), "%d KHz",
2621 2622
				 freq_range->max_bandwidth_khz);

2623 2624 2625 2626 2627 2628 2629
		if (reg_rule->flags & NL80211_RRF_DFS)
			scnprintf(cac_time, sizeof(cac_time), "%u s",
				  reg_rule->dfs_cac_ms/1000);
		else
			scnprintf(cac_time, sizeof(cac_time), "N/A");


2630 2631 2632 2633
		/*
		 * There may not be documentation for max antenna gain
		 * in certain regions
		 */
2634
		if (power_rule->max_antenna_gain)
2635
			pr_info("  (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n",
2636 2637
				freq_range->start_freq_khz,
				freq_range->end_freq_khz,
2638
				bw,
2639
				power_rule->max_antenna_gain,
2640 2641
				power_rule->max_eirp,
				cac_time);
2642
		else
2643
			pr_info("  (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n",
2644 2645
				freq_range->start_freq_khz,
				freq_range->end_freq_khz,
2646
				bw,
2647 2648
				power_rule->max_eirp,
				cac_time);
2649 2650 2651
	}
}

2652
bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region)
2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666
{
	switch (dfs_region) {
	case NL80211_DFS_UNSET:
	case NL80211_DFS_FCC:
	case NL80211_DFS_ETSI:
	case NL80211_DFS_JP:
		return true;
	default:
		REG_DBG_PRINT("Ignoring uknown DFS master region: %d\n",
			      dfs_region);
		return false;
	}
}

2667
static void print_regdomain(const struct ieee80211_regdomain *rd)
2668
{
2669
	struct regulatory_request *lr = get_last_request();
2670

2671
	if (is_intersected_alpha2(rd->alpha2)) {
2672
		if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
2673
			struct cfg80211_registered_device *rdev;
2674
			rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
2675
			if (rdev) {
2676
				pr_info("Current regulatory domain updated by AP to: %c%c\n",
2677 2678
					rdev->country_ie_alpha2[0],
					rdev->country_ie_alpha2[1]);
2679
			} else
2680
				pr_info("Current regulatory domain intersected:\n");
2681
		} else
2682
			pr_info("Current regulatory domain intersected:\n");
J
Johannes Berg 已提交
2683
	} else if (is_world_regdom(rd->alpha2)) {
2684
		pr_info("World regulatory domain updated:\n");
J
Johannes Berg 已提交
2685
	} else {
2686
		if (is_unknown_alpha2(rd->alpha2))
2687
			pr_info("Regulatory domain changed to driver built-in settings (unknown country)\n");
2688
		else {
2689
			if (reg_request_cell_base(lr))
J
Johannes Berg 已提交
2690
				pr_info("Regulatory domain changed to country: %c%c by Cell Station\n",
2691 2692
					rd->alpha2[0], rd->alpha2[1]);
			else
J
Johannes Berg 已提交
2693
				pr_info("Regulatory domain changed to country: %c%c\n",
2694 2695
					rd->alpha2[0], rd->alpha2[1]);
		}
2696
	}
J
Johannes Berg 已提交
2697

2698
	pr_info(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
2699 2700 2701
	print_rd_rules(rd);
}

2702
static void print_regdomain_info(const struct ieee80211_regdomain *rd)
2703
{
2704
	pr_info("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
2705 2706 2707
	print_rd_rules(rd);
}

2708 2709 2710 2711 2712 2713 2714 2715
static int reg_set_rd_core(const struct ieee80211_regdomain *rd)
{
	if (!is_world_regdom(rd->alpha2))
		return -EINVAL;
	update_world_regdomain(rd);
	return 0;
}

2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745
static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
			   struct regulatory_request *user_request)
{
	const struct ieee80211_regdomain *intersected_rd = NULL;

	if (!regdom_changes(rd->alpha2))
		return -EALREADY;

	if (!is_valid_rd(rd)) {
		pr_err("Invalid regulatory domain detected:\n");
		print_regdomain_info(rd);
		return -EINVAL;
	}

	if (!user_request->intersect) {
		reset_regdomains(false, rd);
		return 0;
	}

	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
	if (!intersected_rd)
		return -EINVAL;

	kfree(rd);
	rd = NULL;
	reset_regdomains(false, intersected_rd);

	return 0;
}

2746 2747
static int reg_set_rd_driver(const struct ieee80211_regdomain *rd,
			     struct regulatory_request *driver_request)
2748
{
2749
	const struct ieee80211_regdomain *regd;
2750
	const struct ieee80211_regdomain *intersected_rd = NULL;
2751
	const struct ieee80211_regdomain *tmp;
2752
	struct wiphy *request_wiphy;
2753

2754
	if (is_world_regdom(rd->alpha2))
2755 2756
		return -EINVAL;

2757 2758
	if (!regdom_changes(rd->alpha2))
		return -EALREADY;
2759

2760
	if (!is_valid_rd(rd)) {
2761
		pr_err("Invalid regulatory domain detected:\n");
2762 2763
		print_regdomain_info(rd);
		return -EINVAL;
2764 2765
	}

2766 2767
	request_wiphy = wiphy_idx_to_wiphy(driver_request->wiphy_idx);
	if (!request_wiphy) {
2768 2769
		queue_delayed_work(system_power_efficient_wq,
				   &reg_timeout, 0);
2770 2771
		return -ENODEV;
	}
2772

2773
	if (!driver_request->intersect) {
2774 2775
		if (request_wiphy->regd)
			return -EALREADY;
2776

2777 2778 2779
		regd = reg_copy_regd(rd);
		if (IS_ERR(regd))
			return PTR_ERR(regd);
2780

2781
		rcu_assign_pointer(request_wiphy->regd, regd);
2782
		reset_regdomains(false, rd);
2783 2784 2785
		return 0;
	}

2786 2787 2788
	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
	if (!intersected_rd)
		return -EINVAL;
2789

2790 2791 2792 2793 2794 2795 2796 2797
	/*
	 * We can trash what CRDA provided now.
	 * However if a driver requested this specific regulatory
	 * domain we keep it for its private use
	 */
	tmp = get_wiphy_regdom(request_wiphy);
	rcu_assign_pointer(request_wiphy->regd, rd);
	rcu_free_regdom(tmp);
2798

2799
	rd = NULL;
L
Larry Finger 已提交
2800

2801
	reset_regdomains(false, intersected_rd);
2802

2803 2804 2805
	return 0;
}

2806 2807
static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
				 struct regulatory_request *country_ie_request)
2808 2809
{
	struct wiphy *request_wiphy;
2810

2811 2812 2813
	if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
	    !is_unknown_alpha2(rd->alpha2))
		return -EINVAL;
2814

2815 2816 2817 2818 2819 2820 2821 2822 2823 2824
	/*
	 * Lets only bother proceeding on the same alpha2 if the current
	 * rd is non static (it means CRDA was present and was used last)
	 * and the pending request came in from a country IE
	 */

	if (!is_valid_rd(rd)) {
		pr_err("Invalid regulatory domain detected:\n");
		print_regdomain_info(rd);
		return -EINVAL;
2825 2826
	}

2827
	request_wiphy = wiphy_idx_to_wiphy(country_ie_request->wiphy_idx);
2828
	if (!request_wiphy) {
2829 2830
		queue_delayed_work(system_power_efficient_wq,
				   &reg_timeout, 0);
2831 2832
		return -ENODEV;
	}
2833

2834
	if (country_ie_request->intersect)
2835 2836 2837 2838 2839
		return -EINVAL;

	reset_regdomains(false, rd);
	return 0;
}
2840

2841 2842
/*
 * Use this call to set the current regulatory domain. Conflicts with
2843
 * multiple drivers can be ironed out later. Caller must've already
2844
 * kmalloc'd the rd structure.
2845
 */
2846
int set_regdom(const struct ieee80211_regdomain *rd)
2847
{
2848
	struct regulatory_request *lr;
2849
	bool user_reset = false;
2850 2851
	int r;

2852 2853 2854 2855 2856
	if (!reg_is_valid_request(rd->alpha2)) {
		kfree(rd);
		return -EINVAL;
	}

2857
	lr = get_last_request();
2858

2859
	/* Note that this doesn't update the wiphys, this is done below */
2860 2861 2862 2863 2864
	switch (lr->initiator) {
	case NL80211_REGDOM_SET_BY_CORE:
		r = reg_set_rd_core(rd);
		break;
	case NL80211_REGDOM_SET_BY_USER:
2865
		r = reg_set_rd_user(rd, lr);
2866
		user_reset = true;
2867
		break;
2868
	case NL80211_REGDOM_SET_BY_DRIVER:
2869 2870
		r = reg_set_rd_driver(rd, lr);
		break;
2871
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
2872
		r = reg_set_rd_country_ie(rd, lr);
2873 2874 2875 2876 2877 2878
		break;
	default:
		WARN(1, "invalid initiator %d\n", lr->initiator);
		return -EINVAL;
	}

2879
	if (r) {
2880 2881
		switch (r) {
		case -EALREADY:
2882
			reg_set_request_processed();
2883 2884 2885 2886 2887
			break;
		default:
			/* Back to world regulatory in case of errors */
			restore_regulatory_settings(user_reset);
		}
2888

2889
		kfree(rd);
J
Johannes Berg 已提交
2890
		return r;
2891
	}
2892 2893

	/* This would make this whole thing pointless */
J
Johannes Berg 已提交
2894 2895
	if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom()))
		return -EINVAL;
2896 2897

	/* update all wiphys now with the new established regulatory domain */
2898
	update_all_wiphy_regulatory(lr->initiator);
2899

2900
	print_regdomain(get_cfg80211_regdom());
2901

2902
	nl80211_send_reg_change_event(lr);
2903

2904 2905
	reg_set_request_processed();

J
Johannes Berg 已提交
2906
	return 0;
2907 2908
}

2909 2910
static int __regulatory_set_wiphy_regd(struct wiphy *wiphy,
				       struct ieee80211_regdomain *rd)
2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939
{
	const struct ieee80211_regdomain *regd;
	const struct ieee80211_regdomain *prev_regd;
	struct cfg80211_registered_device *rdev;

	if (WARN_ON(!wiphy || !rd))
		return -EINVAL;

	if (WARN(!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED),
		 "wiphy should have REGULATORY_WIPHY_SELF_MANAGED\n"))
		return -EPERM;

	if (WARN(!is_valid_rd(rd), "Invalid regulatory domain detected\n")) {
		print_regdomain_info(rd);
		return -EINVAL;
	}

	regd = reg_copy_regd(rd);
	if (IS_ERR(regd))
		return PTR_ERR(regd);

	rdev = wiphy_to_rdev(wiphy);

	spin_lock(&reg_requests_lock);
	prev_regd = rdev->requested_regd;
	rdev->requested_regd = regd;
	spin_unlock(&reg_requests_lock);

	kfree(prev_regd);
2940 2941 2942 2943 2944 2945 2946 2947 2948 2949
	return 0;
}

int regulatory_set_wiphy_regd(struct wiphy *wiphy,
			      struct ieee80211_regdomain *rd)
{
	int ret = __regulatory_set_wiphy_regd(wiphy, rd);

	if (ret)
		return ret;
2950 2951 2952 2953 2954 2955

	schedule_work(&reg_work);
	return 0;
}
EXPORT_SYMBOL(regulatory_set_wiphy_regd);

2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972
int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy,
					struct ieee80211_regdomain *rd)
{
	int ret;

	ASSERT_RTNL();

	ret = __regulatory_set_wiphy_regd(wiphy, rd);
	if (ret)
		return ret;

	/* process the request immediately */
	reg_process_self_managed_hints();
	return 0;
}
EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync_rtnl);

2973 2974
void wiphy_regulatory_register(struct wiphy *wiphy)
{
2975 2976
	struct regulatory_request *lr;

2977 2978 2979 2980 2981
	/* self-managed devices ignore external hints */
	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
		wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS |
					   REGULATORY_COUNTRY_IE_IGNORE;

2982 2983 2984
	if (!reg_dev_ignore_cell_hint(wiphy))
		reg_num_devs_support_basehint++;

2985 2986
	lr = get_last_request();
	wiphy_update_regulatory(wiphy, lr->initiator);
2987 2988
}

2989
void wiphy_regulatory_deregister(struct wiphy *wiphy)
2990
{
2991
	struct wiphy *request_wiphy = NULL;
2992
	struct regulatory_request *lr;
2993

2994
	lr = get_last_request();
2995

2996 2997 2998
	if (!reg_dev_ignore_cell_hint(wiphy))
		reg_num_devs_support_basehint--;

2999
	rcu_free_regdom(get_wiphy_regdom(wiphy));
3000
	RCU_INIT_POINTER(wiphy->regd, NULL);
3001

3002 3003
	if (lr)
		request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
3004

3005
	if (!request_wiphy || request_wiphy != wiphy)
J
Johannes Berg 已提交
3006
		return;
3007

3008 3009
	lr->wiphy_idx = WIPHY_IDX_INVALID;
	lr->country_ie_env = ENVIRON_ANY;
3010 3011
}

3012 3013
static void reg_timeout_work(struct work_struct *work)
{
J
Johannes Berg 已提交
3014
	REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
3015
	rtnl_lock();
3016
	restore_regulatory_settings(true);
3017
	rtnl_unlock();
3018 3019
}

3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048
/*
 * See http://www.fcc.gov/document/5-ghz-unlicensed-spectrum-unii, for
 * UNII band definitions
 */
int cfg80211_get_unii(int freq)
{
	/* UNII-1 */
	if (freq >= 5150 && freq <= 5250)
		return 0;

	/* UNII-2A */
	if (freq > 5250 && freq <= 5350)
		return 1;

	/* UNII-2B */
	if (freq > 5350 && freq <= 5470)
		return 2;

	/* UNII-2C */
	if (freq > 5470 && freq <= 5725)
		return 3;

	/* UNII-3 */
	if (freq > 5725 && freq <= 5825)
		return 4;

	return -EINVAL;
}

3049 3050 3051 3052 3053
bool regulatory_indoor_allowed(void)
{
	return reg_is_indoor;
}

3054
int __init regulatory_init(void)
3055
{
3056
	int err = 0;
3057

3058 3059 3060
	reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
	if (IS_ERR(reg_pdev))
		return PTR_ERR(reg_pdev);
3061

3062
	spin_lock_init(&reg_requests_lock);
3063
	spin_lock_init(&reg_pending_beacons_lock);
3064

3065 3066
	reg_regdb_size_check();

3067
	rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
3068

3069 3070 3071
	user_alpha2[0] = '9';
	user_alpha2[1] = '7';

3072
	/* We always try to get an update for the static regdomain */
3073
	err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
3074
	if (err) {
3075 3076 3077 3078 3079 3080 3081 3082 3083
		if (err == -ENOMEM)
			return err;
		/*
		 * N.B. kobject_uevent_env() can fail mainly for when we're out
		 * memory which is handled and propagated appropriately above
		 * but it can also fail during a netlink_broadcast() or during
		 * early boot for call_usermodehelper(). For now treat these
		 * errors as non-fatal.
		 */
3084
		pr_err("kobject_uevent_env() was unable to call CRDA during init\n");
3085
	}
3086

3087 3088 3089 3090 3091
	/*
	 * Finally, if the user set the module parameter treat it
	 * as a user hint.
	 */
	if (!is_world_regdom(ieee80211_regdom))
3092 3093
		regulatory_hint_user(ieee80211_regdom,
				     NL80211_USER_REG_HINT_USER);
3094

3095 3096 3097
	return 0;
}

J
Johannes Berg 已提交
3098
void regulatory_exit(void)
3099
{
3100
	struct regulatory_request *reg_request, *tmp;
3101
	struct reg_beacon *reg_beacon, *btmp;
3102 3103

	cancel_work_sync(&reg_work);
3104
	cancel_delayed_work_sync(&reg_timeout);
3105
	cancel_delayed_work_sync(&reg_check_chans);
3106

3107
	/* Lock to suppress warnings */
J
Johannes Berg 已提交
3108
	rtnl_lock();
3109
	reset_regdomains(true, NULL);
J
Johannes Berg 已提交
3110
	rtnl_unlock();
3111

3112
	dev_set_uevent_suppress(&reg_pdev->dev, true);
3113

3114
	platform_device_unregister(reg_pdev);
3115

3116 3117 3118
	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
3119 3120
	}

3121 3122 3123
	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
3124 3125
	}

3126 3127 3128
	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
		list_del(&reg_request->list);
		kfree(reg_request);
3129
	}
3130
}