xref: /openbmc/linux/net/wireless/reg.c (revision 483eb062)
1 /*
2  * Copyright 2002-2005, Instant802 Networks, Inc.
3  * Copyright 2005-2006, Devicescape Software, Inc.
4  * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
5  * Copyright 2008-2011	Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
6  *
7  * Permission to use, copy, modify, and/or distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 
21 /**
22  * DOC: Wireless regulatory infrastructure
23  *
24  * The usual implementation is for a driver to read a device EEPROM to
25  * determine which regulatory domain it should be operating under, then
26  * looking up the allowable channels in a driver-local table and finally
27  * registering those channels in the wiphy structure.
28  *
29  * Another set of compliance enforcement is for drivers to use their
30  * own compliance limits which can be stored on the EEPROM. The host
31  * driver or firmware may ensure these are used.
32  *
33  * In addition to all this we provide an extra layer of regulatory
34  * conformance. For drivers which do not have any regulatory
35  * information CRDA provides the complete regulatory solution.
36  * For others it provides a community effort on further restrictions
37  * to enhance compliance.
38  *
39  * Note: When number of rules --> infinity we will not be able to
40  * index on alpha2 any more, instead we'll probably have to
41  * rely on some SHA1 checksum of the regdomain for example.
42  *
43  */
44 
45 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
46 
47 #include <linux/kernel.h>
48 #include <linux/export.h>
49 #include <linux/slab.h>
50 #include <linux/list.h>
51 #include <linux/ctype.h>
52 #include <linux/nl80211.h>
53 #include <linux/platform_device.h>
54 #include <linux/moduleparam.h>
55 #include <net/cfg80211.h>
56 #include "core.h"
57 #include "reg.h"
58 #include "regdb.h"
59 #include "nl80211.h"
60 
61 #ifdef CONFIG_CFG80211_REG_DEBUG
62 #define REG_DBG_PRINT(format, args...)			\
63 	printk(KERN_DEBUG pr_fmt(format), ##args)
64 #else
65 #define REG_DBG_PRINT(args...)
66 #endif
67 
68 enum reg_request_treatment {
69 	REG_REQ_OK,
70 	REG_REQ_IGNORE,
71 	REG_REQ_INTERSECT,
72 	REG_REQ_ALREADY_SET,
73 };
74 
75 static struct regulatory_request core_request_world = {
76 	.initiator = NL80211_REGDOM_SET_BY_CORE,
77 	.alpha2[0] = '0',
78 	.alpha2[1] = '0',
79 	.intersect = false,
80 	.processed = true,
81 	.country_ie_env = ENVIRON_ANY,
82 };
83 
84 /*
85  * Receipt of information from last regulatory request,
86  * protected by RTNL (and can be accessed with RCU protection)
87  */
88 static struct regulatory_request __rcu *last_request =
89 	(void __rcu *)&core_request_world;
90 
91 /* To trigger userspace events */
92 static struct platform_device *reg_pdev;
93 
94 static struct device_type reg_device_type = {
95 	.uevent = reg_device_uevent,
96 };
97 
98 /*
99  * Central wireless core regulatory domains, we only need two,
100  * the current one and a world regulatory domain in case we have no
101  * information to give us an alpha2.
102  * (protected by RTNL, can be read under RCU)
103  */
104 const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
105 
106 /*
107  * Number of devices that registered to the core
108  * that support cellular base station regulatory hints
109  * (protected by RTNL)
110  */
111 static int reg_num_devs_support_basehint;
112 
113 static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
114 {
115 	return rtnl_dereference(cfg80211_regdomain);
116 }
117 
118 static const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
119 {
120 	return rtnl_dereference(wiphy->regd);
121 }
122 
123 static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region)
124 {
125 	switch (dfs_region) {
126 	case NL80211_DFS_UNSET:
127 		return "unset";
128 	case NL80211_DFS_FCC:
129 		return "FCC";
130 	case NL80211_DFS_ETSI:
131 		return "ETSI";
132 	case NL80211_DFS_JP:
133 		return "JP";
134 	}
135 	return "Unknown";
136 }
137 
138 enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy)
139 {
140 	const struct ieee80211_regdomain *regd = NULL;
141 	const struct ieee80211_regdomain *wiphy_regd = NULL;
142 
143 	regd = get_cfg80211_regdom();
144 	if (!wiphy)
145 		goto out;
146 
147 	wiphy_regd = get_wiphy_regdom(wiphy);
148 	if (!wiphy_regd)
149 		goto out;
150 
151 	if (wiphy_regd->dfs_region == regd->dfs_region)
152 		goto out;
153 
154 	REG_DBG_PRINT("%s: device specific dfs_region "
155 		      "(%s) disagrees with cfg80211's "
156 		      "central dfs_region (%s)\n",
157 		      dev_name(&wiphy->dev),
158 		      reg_dfs_region_str(wiphy_regd->dfs_region),
159 		      reg_dfs_region_str(regd->dfs_region));
160 
161 out:
162 	return regd->dfs_region;
163 }
164 
165 static void rcu_free_regdom(const struct ieee80211_regdomain *r)
166 {
167 	if (!r)
168 		return;
169 	kfree_rcu((struct ieee80211_regdomain *)r, rcu_head);
170 }
171 
172 static struct regulatory_request *get_last_request(void)
173 {
174 	return rcu_dereference_rtnl(last_request);
175 }
176 
177 /* Used to queue up regulatory hints */
178 static LIST_HEAD(reg_requests_list);
179 static spinlock_t reg_requests_lock;
180 
181 /* Used to queue up beacon hints for review */
182 static LIST_HEAD(reg_pending_beacons);
183 static spinlock_t reg_pending_beacons_lock;
184 
185 /* Used to keep track of processed beacon hints */
186 static LIST_HEAD(reg_beacon_list);
187 
188 struct reg_beacon {
189 	struct list_head list;
190 	struct ieee80211_channel chan;
191 };
192 
193 static void reg_todo(struct work_struct *work);
194 static DECLARE_WORK(reg_work, reg_todo);
195 
196 static void reg_timeout_work(struct work_struct *work);
197 static DECLARE_DELAYED_WORK(reg_timeout, reg_timeout_work);
198 
199 /* We keep a static world regulatory domain in case of the absence of CRDA */
200 static const struct ieee80211_regdomain world_regdom = {
201 	.n_reg_rules = 6,
202 	.alpha2 =  "00",
203 	.reg_rules = {
204 		/* IEEE 802.11b/g, channels 1..11 */
205 		REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
206 		/* IEEE 802.11b/g, channels 12..13. */
207 		REG_RULE(2467-10, 2472+10, 40, 6, 20,
208 			NL80211_RRF_NO_IR),
209 		/* IEEE 802.11 channel 14 - Only JP enables
210 		 * this and for 802.11b only */
211 		REG_RULE(2484-10, 2484+10, 20, 6, 20,
212 			NL80211_RRF_NO_IR |
213 			NL80211_RRF_NO_OFDM),
214 		/* IEEE 802.11a, channel 36..48 */
215 		REG_RULE(5180-10, 5240+10, 160, 6, 20,
216                         NL80211_RRF_NO_IR),
217 
218 		/* IEEE 802.11a, channel 52..64 - DFS required */
219 		REG_RULE(5260-10, 5320+10, 160, 6, 20,
220 			NL80211_RRF_NO_IR |
221 			NL80211_RRF_DFS),
222 
223 		/* IEEE 802.11a, channel 100..144 - DFS required */
224 		REG_RULE(5500-10, 5720+10, 160, 6, 20,
225 			NL80211_RRF_NO_IR |
226 			NL80211_RRF_DFS),
227 
228 		/* IEEE 802.11a, channel 149..165 */
229 		REG_RULE(5745-10, 5825+10, 80, 6, 20,
230 			NL80211_RRF_NO_IR),
231 
232 		/* IEEE 802.11ad (60gHz), channels 1..3 */
233 		REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
234 	}
235 };
236 
237 /* protected by RTNL */
238 static const struct ieee80211_regdomain *cfg80211_world_regdom =
239 	&world_regdom;
240 
241 static char *ieee80211_regdom = "00";
242 static char user_alpha2[2];
243 
244 module_param(ieee80211_regdom, charp, 0444);
245 MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
246 
247 static void reg_kfree_last_request(void)
248 {
249 	struct regulatory_request *lr;
250 
251 	lr = get_last_request();
252 
253 	if (lr != &core_request_world && lr)
254 		kfree_rcu(lr, rcu_head);
255 }
256 
257 static void reg_update_last_request(struct regulatory_request *request)
258 {
259 	reg_kfree_last_request();
260 	rcu_assign_pointer(last_request, request);
261 }
262 
263 static void reset_regdomains(bool full_reset,
264 			     const struct ieee80211_regdomain *new_regdom)
265 {
266 	const struct ieee80211_regdomain *r;
267 
268 	ASSERT_RTNL();
269 
270 	r = get_cfg80211_regdom();
271 
272 	/* avoid freeing static information or freeing something twice */
273 	if (r == cfg80211_world_regdom)
274 		r = NULL;
275 	if (cfg80211_world_regdom == &world_regdom)
276 		cfg80211_world_regdom = NULL;
277 	if (r == &world_regdom)
278 		r = NULL;
279 
280 	rcu_free_regdom(r);
281 	rcu_free_regdom(cfg80211_world_regdom);
282 
283 	cfg80211_world_regdom = &world_regdom;
284 	rcu_assign_pointer(cfg80211_regdomain, new_regdom);
285 
286 	if (!full_reset)
287 		return;
288 
289 	reg_update_last_request(&core_request_world);
290 }
291 
292 /*
293  * Dynamic world regulatory domain requested by the wireless
294  * core upon initialization
295  */
296 static void update_world_regdomain(const struct ieee80211_regdomain *rd)
297 {
298 	struct regulatory_request *lr;
299 
300 	lr = get_last_request();
301 
302 	WARN_ON(!lr);
303 
304 	reset_regdomains(false, rd);
305 
306 	cfg80211_world_regdom = rd;
307 }
308 
309 bool is_world_regdom(const char *alpha2)
310 {
311 	if (!alpha2)
312 		return false;
313 	return alpha2[0] == '0' && alpha2[1] == '0';
314 }
315 
316 static bool is_alpha2_set(const char *alpha2)
317 {
318 	if (!alpha2)
319 		return false;
320 	return alpha2[0] && alpha2[1];
321 }
322 
323 static bool is_unknown_alpha2(const char *alpha2)
324 {
325 	if (!alpha2)
326 		return false;
327 	/*
328 	 * Special case where regulatory domain was built by driver
329 	 * but a specific alpha2 cannot be determined
330 	 */
331 	return alpha2[0] == '9' && alpha2[1] == '9';
332 }
333 
334 static bool is_intersected_alpha2(const char *alpha2)
335 {
336 	if (!alpha2)
337 		return false;
338 	/*
339 	 * Special case where regulatory domain is the
340 	 * result of an intersection between two regulatory domain
341 	 * structures
342 	 */
343 	return alpha2[0] == '9' && alpha2[1] == '8';
344 }
345 
346 static bool is_an_alpha2(const char *alpha2)
347 {
348 	if (!alpha2)
349 		return false;
350 	return isalpha(alpha2[0]) && isalpha(alpha2[1]);
351 }
352 
353 static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
354 {
355 	if (!alpha2_x || !alpha2_y)
356 		return false;
357 	return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1];
358 }
359 
360 static bool regdom_changes(const char *alpha2)
361 {
362 	const struct ieee80211_regdomain *r = get_cfg80211_regdom();
363 
364 	if (!r)
365 		return true;
366 	return !alpha2_equal(r->alpha2, alpha2);
367 }
368 
369 /*
370  * The NL80211_REGDOM_SET_BY_USER regdom alpha2 is cached, this lets
371  * you know if a valid regulatory hint with NL80211_REGDOM_SET_BY_USER
372  * has ever been issued.
373  */
374 static bool is_user_regdom_saved(void)
375 {
376 	if (user_alpha2[0] == '9' && user_alpha2[1] == '7')
377 		return false;
378 
379 	/* This would indicate a mistake on the design */
380 	if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2),
381 		 "Unexpected user alpha2: %c%c\n",
382 		 user_alpha2[0], user_alpha2[1]))
383 		return false;
384 
385 	return true;
386 }
387 
388 static const struct ieee80211_regdomain *
389 reg_copy_regd(const struct ieee80211_regdomain *src_regd)
390 {
391 	struct ieee80211_regdomain *regd;
392 	int size_of_regd;
393 	unsigned int i;
394 
395 	size_of_regd =
396 		sizeof(struct ieee80211_regdomain) +
397 		src_regd->n_reg_rules * sizeof(struct ieee80211_reg_rule);
398 
399 	regd = kzalloc(size_of_regd, GFP_KERNEL);
400 	if (!regd)
401 		return ERR_PTR(-ENOMEM);
402 
403 	memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));
404 
405 	for (i = 0; i < src_regd->n_reg_rules; i++)
406 		memcpy(&regd->reg_rules[i], &src_regd->reg_rules[i],
407 		       sizeof(struct ieee80211_reg_rule));
408 
409 	return regd;
410 }
411 
412 #ifdef CONFIG_CFG80211_INTERNAL_REGDB
413 struct reg_regdb_search_request {
414 	char alpha2[2];
415 	struct list_head list;
416 };
417 
418 static LIST_HEAD(reg_regdb_search_list);
419 static DEFINE_MUTEX(reg_regdb_search_mutex);
420 
421 static void reg_regdb_search(struct work_struct *work)
422 {
423 	struct reg_regdb_search_request *request;
424 	const struct ieee80211_regdomain *curdom, *regdom = NULL;
425 	int i;
426 
427 	rtnl_lock();
428 
429 	mutex_lock(&reg_regdb_search_mutex);
430 	while (!list_empty(&reg_regdb_search_list)) {
431 		request = list_first_entry(&reg_regdb_search_list,
432 					   struct reg_regdb_search_request,
433 					   list);
434 		list_del(&request->list);
435 
436 		for (i = 0; i < reg_regdb_size; i++) {
437 			curdom = reg_regdb[i];
438 
439 			if (alpha2_equal(request->alpha2, curdom->alpha2)) {
440 				regdom = reg_copy_regd(curdom);
441 				break;
442 			}
443 		}
444 
445 		kfree(request);
446 	}
447 	mutex_unlock(&reg_regdb_search_mutex);
448 
449 	if (!IS_ERR_OR_NULL(regdom))
450 		set_regdom(regdom);
451 
452 	rtnl_unlock();
453 }
454 
455 static DECLARE_WORK(reg_regdb_work, reg_regdb_search);
456 
457 static void reg_regdb_query(const char *alpha2)
458 {
459 	struct reg_regdb_search_request *request;
460 
461 	if (!alpha2)
462 		return;
463 
464 	request = kzalloc(sizeof(struct reg_regdb_search_request), GFP_KERNEL);
465 	if (!request)
466 		return;
467 
468 	memcpy(request->alpha2, alpha2, 2);
469 
470 	mutex_lock(&reg_regdb_search_mutex);
471 	list_add_tail(&request->list, &reg_regdb_search_list);
472 	mutex_unlock(&reg_regdb_search_mutex);
473 
474 	schedule_work(&reg_regdb_work);
475 }
476 
477 /* Feel free to add any other sanity checks here */
478 static void reg_regdb_size_check(void)
479 {
480 	/* We should ideally BUILD_BUG_ON() but then random builds would fail */
481 	WARN_ONCE(!reg_regdb_size, "db.txt is empty, you should update it...");
482 }
483 #else
484 static inline void reg_regdb_size_check(void) {}
485 static inline void reg_regdb_query(const char *alpha2) {}
486 #endif /* CONFIG_CFG80211_INTERNAL_REGDB */
487 
488 /*
489  * This lets us keep regulatory code which is updated on a regulatory
490  * basis in userspace. Country information is filled in by
491  * reg_device_uevent
492  */
493 static int call_crda(const char *alpha2)
494 {
495 	if (!is_world_regdom((char *) alpha2))
496 		pr_info("Calling CRDA for country: %c%c\n",
497 			alpha2[0], alpha2[1]);
498 	else
499 		pr_info("Calling CRDA to update world regulatory domain\n");
500 
501 	/* query internal regulatory database (if it exists) */
502 	reg_regdb_query(alpha2);
503 
504 	return kobject_uevent(&reg_pdev->dev.kobj, KOBJ_CHANGE);
505 }
506 
507 static enum reg_request_treatment
508 reg_call_crda(struct regulatory_request *request)
509 {
510 	if (call_crda(request->alpha2))
511 		return REG_REQ_IGNORE;
512 	return REG_REQ_OK;
513 }
514 
515 bool reg_is_valid_request(const char *alpha2)
516 {
517 	struct regulatory_request *lr = get_last_request();
518 
519 	if (!lr || lr->processed)
520 		return false;
521 
522 	return alpha2_equal(lr->alpha2, alpha2);
523 }
524 
525 /* Sanity check on a regulatory rule */
526 static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
527 {
528 	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
529 	u32 freq_diff;
530 
531 	if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0)
532 		return false;
533 
534 	if (freq_range->start_freq_khz > freq_range->end_freq_khz)
535 		return false;
536 
537 	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
538 
539 	if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
540 	    freq_range->max_bandwidth_khz > freq_diff)
541 		return false;
542 
543 	return true;
544 }
545 
546 static bool is_valid_rd(const struct ieee80211_regdomain *rd)
547 {
548 	const struct ieee80211_reg_rule *reg_rule = NULL;
549 	unsigned int i;
550 
551 	if (!rd->n_reg_rules)
552 		return false;
553 
554 	if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
555 		return false;
556 
557 	for (i = 0; i < rd->n_reg_rules; i++) {
558 		reg_rule = &rd->reg_rules[i];
559 		if (!is_valid_reg_rule(reg_rule))
560 			return false;
561 	}
562 
563 	return true;
564 }
565 
566 static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range,
567 			    u32 center_freq_khz, u32 bw_khz)
568 {
569 	u32 start_freq_khz, end_freq_khz;
570 
571 	start_freq_khz = center_freq_khz - (bw_khz/2);
572 	end_freq_khz = center_freq_khz + (bw_khz/2);
573 
574 	if (start_freq_khz >= freq_range->start_freq_khz &&
575 	    end_freq_khz <= freq_range->end_freq_khz)
576 		return true;
577 
578 	return false;
579 }
580 
581 /**
582  * freq_in_rule_band - tells us if a frequency is in a frequency band
583  * @freq_range: frequency rule we want to query
584  * @freq_khz: frequency we are inquiring about
585  *
586  * This lets us know if a specific frequency rule is or is not relevant to
587  * a specific frequency's band. Bands are device specific and artificial
588  * definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"),
589  * however it is safe for now to assume that a frequency rule should not be
590  * part of a frequency's band if the start freq or end freq are off by more
591  * than 2 GHz for the 2.4 and 5 GHz bands, and by more than 10 GHz for the
592  * 60 GHz band.
593  * This resolution can be lowered and should be considered as we add
594  * regulatory rule support for other "bands".
595  **/
596 static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
597 			      u32 freq_khz)
598 {
599 #define ONE_GHZ_IN_KHZ	1000000
600 	/*
601 	 * From 802.11ad: directional multi-gigabit (DMG):
602 	 * Pertaining to operation in a frequency band containing a channel
603 	 * with the Channel starting frequency above 45 GHz.
604 	 */
605 	u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ?
606 			10 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ;
607 	if (abs(freq_khz - freq_range->start_freq_khz) <= limit)
608 		return true;
609 	if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
610 		return true;
611 	return false;
612 #undef ONE_GHZ_IN_KHZ
613 }
614 
615 /*
616  * Later on we can perhaps use the more restrictive DFS
617  * region but we don't have information for that yet so
618  * for now simply disallow conflicts.
619  */
620 static enum nl80211_dfs_regions
621 reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1,
622 			 const enum nl80211_dfs_regions dfs_region2)
623 {
624 	if (dfs_region1 != dfs_region2)
625 		return NL80211_DFS_UNSET;
626 	return dfs_region1;
627 }
628 
629 /*
630  * Helper for regdom_intersect(), this does the real
631  * mathematical intersection fun
632  */
633 static int reg_rules_intersect(const struct ieee80211_reg_rule *rule1,
634 			       const struct ieee80211_reg_rule *rule2,
635 			       struct ieee80211_reg_rule *intersected_rule)
636 {
637 	const struct ieee80211_freq_range *freq_range1, *freq_range2;
638 	struct ieee80211_freq_range *freq_range;
639 	const struct ieee80211_power_rule *power_rule1, *power_rule2;
640 	struct ieee80211_power_rule *power_rule;
641 	u32 freq_diff;
642 
643 	freq_range1 = &rule1->freq_range;
644 	freq_range2 = &rule2->freq_range;
645 	freq_range = &intersected_rule->freq_range;
646 
647 	power_rule1 = &rule1->power_rule;
648 	power_rule2 = &rule2->power_rule;
649 	power_rule = &intersected_rule->power_rule;
650 
651 	freq_range->start_freq_khz = max(freq_range1->start_freq_khz,
652 					 freq_range2->start_freq_khz);
653 	freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
654 				       freq_range2->end_freq_khz);
655 	freq_range->max_bandwidth_khz = min(freq_range1->max_bandwidth_khz,
656 					    freq_range2->max_bandwidth_khz);
657 
658 	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
659 	if (freq_range->max_bandwidth_khz > freq_diff)
660 		freq_range->max_bandwidth_khz = freq_diff;
661 
662 	power_rule->max_eirp = min(power_rule1->max_eirp,
663 		power_rule2->max_eirp);
664 	power_rule->max_antenna_gain = min(power_rule1->max_antenna_gain,
665 		power_rule2->max_antenna_gain);
666 
667 	intersected_rule->flags = rule1->flags | rule2->flags;
668 
669 	if (!is_valid_reg_rule(intersected_rule))
670 		return -EINVAL;
671 
672 	return 0;
673 }
674 
675 /**
676  * regdom_intersect - do the intersection between two regulatory domains
677  * @rd1: first regulatory domain
678  * @rd2: second regulatory domain
679  *
680  * Use this function to get the intersection between two regulatory domains.
681  * Once completed we will mark the alpha2 for the rd as intersected, "98",
682  * as no one single alpha2 can represent this regulatory domain.
683  *
684  * Returns a pointer to the regulatory domain structure which will hold the
685  * resulting intersection of rules between rd1 and rd2. We will
686  * kzalloc() this structure for you.
687  */
688 static struct ieee80211_regdomain *
689 regdom_intersect(const struct ieee80211_regdomain *rd1,
690 		 const struct ieee80211_regdomain *rd2)
691 {
692 	int r, size_of_regd;
693 	unsigned int x, y;
694 	unsigned int num_rules = 0, rule_idx = 0;
695 	const struct ieee80211_reg_rule *rule1, *rule2;
696 	struct ieee80211_reg_rule *intersected_rule;
697 	struct ieee80211_regdomain *rd;
698 	/* This is just a dummy holder to help us count */
699 	struct ieee80211_reg_rule dummy_rule;
700 
701 	if (!rd1 || !rd2)
702 		return NULL;
703 
704 	/*
705 	 * First we get a count of the rules we'll need, then we actually
706 	 * build them. This is to so we can malloc() and free() a
707 	 * regdomain once. The reason we use reg_rules_intersect() here
708 	 * is it will return -EINVAL if the rule computed makes no sense.
709 	 * All rules that do check out OK are valid.
710 	 */
711 
712 	for (x = 0; x < rd1->n_reg_rules; x++) {
713 		rule1 = &rd1->reg_rules[x];
714 		for (y = 0; y < rd2->n_reg_rules; y++) {
715 			rule2 = &rd2->reg_rules[y];
716 			if (!reg_rules_intersect(rule1, rule2, &dummy_rule))
717 				num_rules++;
718 		}
719 	}
720 
721 	if (!num_rules)
722 		return NULL;
723 
724 	size_of_regd = sizeof(struct ieee80211_regdomain) +
725 		       num_rules * sizeof(struct ieee80211_reg_rule);
726 
727 	rd = kzalloc(size_of_regd, GFP_KERNEL);
728 	if (!rd)
729 		return NULL;
730 
731 	for (x = 0; x < rd1->n_reg_rules && rule_idx < num_rules; x++) {
732 		rule1 = &rd1->reg_rules[x];
733 		for (y = 0; y < rd2->n_reg_rules && rule_idx < num_rules; y++) {
734 			rule2 = &rd2->reg_rules[y];
735 			/*
736 			 * This time around instead of using the stack lets
737 			 * write to the target rule directly saving ourselves
738 			 * a memcpy()
739 			 */
740 			intersected_rule = &rd->reg_rules[rule_idx];
741 			r = reg_rules_intersect(rule1, rule2, intersected_rule);
742 			/*
743 			 * No need to memset here the intersected rule here as
744 			 * we're not using the stack anymore
745 			 */
746 			if (r)
747 				continue;
748 			rule_idx++;
749 		}
750 	}
751 
752 	if (rule_idx != num_rules) {
753 		kfree(rd);
754 		return NULL;
755 	}
756 
757 	rd->n_reg_rules = num_rules;
758 	rd->alpha2[0] = '9';
759 	rd->alpha2[1] = '8';
760 	rd->dfs_region = reg_intersect_dfs_region(rd1->dfs_region,
761 						  rd2->dfs_region);
762 
763 	return rd;
764 }
765 
766 /*
767  * XXX: add support for the rest of enum nl80211_reg_rule_flags, we may
768  * want to just have the channel structure use these
769  */
770 static u32 map_regdom_flags(u32 rd_flags)
771 {
772 	u32 channel_flags = 0;
773 	if (rd_flags & NL80211_RRF_NO_IR_ALL)
774 		channel_flags |= IEEE80211_CHAN_NO_IR;
775 	if (rd_flags & NL80211_RRF_DFS)
776 		channel_flags |= IEEE80211_CHAN_RADAR;
777 	if (rd_flags & NL80211_RRF_NO_OFDM)
778 		channel_flags |= IEEE80211_CHAN_NO_OFDM;
779 	return channel_flags;
780 }
781 
782 static const struct ieee80211_reg_rule *
783 freq_reg_info_regd(struct wiphy *wiphy, u32 center_freq,
784 		   const struct ieee80211_regdomain *regd)
785 {
786 	int i;
787 	bool band_rule_found = false;
788 	bool bw_fits = false;
789 
790 	if (!regd)
791 		return ERR_PTR(-EINVAL);
792 
793 	for (i = 0; i < regd->n_reg_rules; i++) {
794 		const struct ieee80211_reg_rule *rr;
795 		const struct ieee80211_freq_range *fr = NULL;
796 
797 		rr = &regd->reg_rules[i];
798 		fr = &rr->freq_range;
799 
800 		/*
801 		 * We only need to know if one frequency rule was
802 		 * was in center_freq's band, that's enough, so lets
803 		 * not overwrite it once found
804 		 */
805 		if (!band_rule_found)
806 			band_rule_found = freq_in_rule_band(fr, center_freq);
807 
808 		bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(20));
809 
810 		if (band_rule_found && bw_fits)
811 			return rr;
812 	}
813 
814 	if (!band_rule_found)
815 		return ERR_PTR(-ERANGE);
816 
817 	return ERR_PTR(-EINVAL);
818 }
819 
820 const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
821 					       u32 center_freq)
822 {
823 	const struct ieee80211_regdomain *regd;
824 	struct regulatory_request *lr = get_last_request();
825 
826 	/*
827 	 * Follow the driver's regulatory domain, if present, unless a country
828 	 * IE has been processed or a user wants to help complaince further
829 	 */
830 	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
831 	    lr->initiator != NL80211_REGDOM_SET_BY_USER &&
832 	    wiphy->regd)
833 		regd = get_wiphy_regdom(wiphy);
834 	else
835 		regd = get_cfg80211_regdom();
836 
837 	return freq_reg_info_regd(wiphy, center_freq, regd);
838 }
839 EXPORT_SYMBOL(freq_reg_info);
840 
841 const char *reg_initiator_name(enum nl80211_reg_initiator initiator)
842 {
843 	switch (initiator) {
844 	case NL80211_REGDOM_SET_BY_CORE:
845 		return "core";
846 	case NL80211_REGDOM_SET_BY_USER:
847 		return "user";
848 	case NL80211_REGDOM_SET_BY_DRIVER:
849 		return "driver";
850 	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
851 		return "country IE";
852 	default:
853 		WARN_ON(1);
854 		return "bug";
855 	}
856 }
857 EXPORT_SYMBOL(reg_initiator_name);
858 
859 #ifdef CONFIG_CFG80211_REG_DEBUG
860 static void chan_reg_rule_print_dbg(struct ieee80211_channel *chan,
861 				    const struct ieee80211_reg_rule *reg_rule)
862 {
863 	const struct ieee80211_power_rule *power_rule;
864 	const struct ieee80211_freq_range *freq_range;
865 	char max_antenna_gain[32];
866 
867 	power_rule = &reg_rule->power_rule;
868 	freq_range = &reg_rule->freq_range;
869 
870 	if (!power_rule->max_antenna_gain)
871 		snprintf(max_antenna_gain, 32, "N/A");
872 	else
873 		snprintf(max_antenna_gain, 32, "%d", power_rule->max_antenna_gain);
874 
875 	REG_DBG_PRINT("Updating information on frequency %d MHz with regulatory rule:\n",
876 		      chan->center_freq);
877 
878 	REG_DBG_PRINT("%d KHz - %d KHz @ %d KHz), (%s mBi, %d mBm)\n",
879 		      freq_range->start_freq_khz, freq_range->end_freq_khz,
880 		      freq_range->max_bandwidth_khz, max_antenna_gain,
881 		      power_rule->max_eirp);
882 }
883 #else
884 static void chan_reg_rule_print_dbg(struct ieee80211_channel *chan,
885 				    const struct ieee80211_reg_rule *reg_rule)
886 {
887 	return;
888 }
889 #endif
890 
891 /*
892  * Note that right now we assume the desired channel bandwidth
893  * is always 20 MHz for each individual channel (HT40 uses 20 MHz
894  * per channel, the primary and the extension channel).
895  */
896 static void handle_channel(struct wiphy *wiphy,
897 			   enum nl80211_reg_initiator initiator,
898 			   struct ieee80211_channel *chan)
899 {
900 	u32 flags, bw_flags = 0;
901 	const struct ieee80211_reg_rule *reg_rule = NULL;
902 	const struct ieee80211_power_rule *power_rule = NULL;
903 	const struct ieee80211_freq_range *freq_range = NULL;
904 	struct wiphy *request_wiphy = NULL;
905 	struct regulatory_request *lr = get_last_request();
906 
907 	request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
908 
909 	flags = chan->orig_flags;
910 
911 	reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
912 	if (IS_ERR(reg_rule)) {
913 		/*
914 		 * We will disable all channels that do not match our
915 		 * received regulatory rule unless the hint is coming
916 		 * from a Country IE and the Country IE had no information
917 		 * about a band. The IEEE 802.11 spec allows for an AP
918 		 * to send only a subset of the regulatory rules allowed,
919 		 * so an AP in the US that only supports 2.4 GHz may only send
920 		 * a country IE with information for the 2.4 GHz band
921 		 * while 5 GHz is still supported.
922 		 */
923 		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
924 		    PTR_ERR(reg_rule) == -ERANGE)
925 			return;
926 
927 		if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
928 		    request_wiphy && request_wiphy == wiphy &&
929 		    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
930 			REG_DBG_PRINT("Disabling freq %d MHz for good\n",
931 				      chan->center_freq);
932 			chan->orig_flags |= IEEE80211_CHAN_DISABLED;
933 			chan->flags = chan->orig_flags;
934 		} else {
935 			REG_DBG_PRINT("Disabling freq %d MHz\n",
936 				      chan->center_freq);
937 			chan->flags |= IEEE80211_CHAN_DISABLED;
938 		}
939 		return;
940 	}
941 
942 	chan_reg_rule_print_dbg(chan, reg_rule);
943 
944 	power_rule = &reg_rule->power_rule;
945 	freq_range = &reg_rule->freq_range;
946 
947 	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
948 		bw_flags = IEEE80211_CHAN_NO_HT40;
949 	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(80))
950 		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
951 	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(160))
952 		bw_flags |= IEEE80211_CHAN_NO_160MHZ;
953 
954 	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
955 	    request_wiphy && request_wiphy == wiphy &&
956 	    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
957 		/*
958 		 * This guarantees the driver's requested regulatory domain
959 		 * will always be used as a base for further regulatory
960 		 * settings
961 		 */
962 		chan->flags = chan->orig_flags =
963 			map_regdom_flags(reg_rule->flags) | bw_flags;
964 		chan->max_antenna_gain = chan->orig_mag =
965 			(int) MBI_TO_DBI(power_rule->max_antenna_gain);
966 		chan->max_reg_power = chan->max_power = chan->orig_mpwr =
967 			(int) MBM_TO_DBM(power_rule->max_eirp);
968 		return;
969 	}
970 
971 	chan->dfs_state = NL80211_DFS_USABLE;
972 	chan->dfs_state_entered = jiffies;
973 
974 	chan->beacon_found = false;
975 	chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
976 	chan->max_antenna_gain =
977 		min_t(int, chan->orig_mag,
978 		      MBI_TO_DBI(power_rule->max_antenna_gain));
979 	chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
980 	if (chan->orig_mpwr) {
981 		/*
982 		 * Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER
983 		 * will always follow the passed country IE power settings.
984 		 */
985 		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
986 		    wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
987 			chan->max_power = chan->max_reg_power;
988 		else
989 			chan->max_power = min(chan->orig_mpwr,
990 					      chan->max_reg_power);
991 	} else
992 		chan->max_power = chan->max_reg_power;
993 }
994 
995 static void handle_band(struct wiphy *wiphy,
996 			enum nl80211_reg_initiator initiator,
997 			struct ieee80211_supported_band *sband)
998 {
999 	unsigned int i;
1000 
1001 	if (!sband)
1002 		return;
1003 
1004 	for (i = 0; i < sband->n_channels; i++)
1005 		handle_channel(wiphy, initiator, &sband->channels[i]);
1006 }
1007 
1008 static bool reg_request_cell_base(struct regulatory_request *request)
1009 {
1010 	if (request->initiator != NL80211_REGDOM_SET_BY_USER)
1011 		return false;
1012 	return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE;
1013 }
1014 
1015 bool reg_last_request_cell_base(void)
1016 {
1017 	return reg_request_cell_base(get_last_request());
1018 }
1019 
1020 #ifdef CONFIG_CFG80211_CERTIFICATION_ONUS
1021 /* Core specific check */
1022 static enum reg_request_treatment
1023 reg_ignore_cell_hint(struct regulatory_request *pending_request)
1024 {
1025 	struct regulatory_request *lr = get_last_request();
1026 
1027 	if (!reg_num_devs_support_basehint)
1028 		return REG_REQ_IGNORE;
1029 
1030 	if (reg_request_cell_base(lr) &&
1031 	    !regdom_changes(pending_request->alpha2))
1032 		return REG_REQ_ALREADY_SET;
1033 
1034 	return REG_REQ_OK;
1035 }
1036 
1037 /* Device specific check */
1038 static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
1039 {
1040 	return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS);
1041 }
1042 #else
1043 static int reg_ignore_cell_hint(struct regulatory_request *pending_request)
1044 {
1045 	return REG_REQ_IGNORE;
1046 }
1047 
1048 static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
1049 {
1050 	return true;
1051 }
1052 #endif
1053 
1054 static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy)
1055 {
1056 	if (wiphy->regulatory_flags & REGULATORY_STRICT_REG &&
1057 	    !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG))
1058 		return true;
1059 	return false;
1060 }
1061 
1062 static bool ignore_reg_update(struct wiphy *wiphy,
1063 			      enum nl80211_reg_initiator initiator)
1064 {
1065 	struct regulatory_request *lr = get_last_request();
1066 
1067 	if (!lr) {
1068 		REG_DBG_PRINT("Ignoring regulatory request set by %s "
1069 			      "since last_request is not set\n",
1070 			      reg_initiator_name(initiator));
1071 		return true;
1072 	}
1073 
1074 	if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1075 	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
1076 		REG_DBG_PRINT("Ignoring regulatory request set by %s "
1077 			      "since the driver uses its own custom "
1078 			      "regulatory domain\n",
1079 			      reg_initiator_name(initiator));
1080 		return true;
1081 	}
1082 
1083 	/*
1084 	 * wiphy->regd will be set once the device has its own
1085 	 * desired regulatory domain set
1086 	 */
1087 	if (wiphy_strict_alpha2_regd(wiphy) && !wiphy->regd &&
1088 	    initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1089 	    !is_world_regdom(lr->alpha2)) {
1090 		REG_DBG_PRINT("Ignoring regulatory request set by %s "
1091 			      "since the driver requires its own regulatory "
1092 			      "domain to be set first\n",
1093 			      reg_initiator_name(initiator));
1094 		return true;
1095 	}
1096 
1097 	if (reg_request_cell_base(lr))
1098 		return reg_dev_ignore_cell_hint(wiphy);
1099 
1100 	return false;
1101 }
1102 
1103 static bool reg_is_world_roaming(struct wiphy *wiphy)
1104 {
1105 	const struct ieee80211_regdomain *cr = get_cfg80211_regdom();
1106 	const struct ieee80211_regdomain *wr = get_wiphy_regdom(wiphy);
1107 	struct regulatory_request *lr = get_last_request();
1108 
1109 	if (is_world_regdom(cr->alpha2) || (wr && is_world_regdom(wr->alpha2)))
1110 		return true;
1111 
1112 	if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1113 	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1114 		return true;
1115 
1116 	return false;
1117 }
1118 
1119 static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
1120 			      struct reg_beacon *reg_beacon)
1121 {
1122 	struct ieee80211_supported_band *sband;
1123 	struct ieee80211_channel *chan;
1124 	bool channel_changed = false;
1125 	struct ieee80211_channel chan_before;
1126 
1127 	sband = wiphy->bands[reg_beacon->chan.band];
1128 	chan = &sband->channels[chan_idx];
1129 
1130 	if (likely(chan->center_freq != reg_beacon->chan.center_freq))
1131 		return;
1132 
1133 	if (chan->beacon_found)
1134 		return;
1135 
1136 	chan->beacon_found = true;
1137 
1138 	if (!reg_is_world_roaming(wiphy))
1139 		return;
1140 
1141 	if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS)
1142 		return;
1143 
1144 	chan_before.center_freq = chan->center_freq;
1145 	chan_before.flags = chan->flags;
1146 
1147 	if (chan->flags & IEEE80211_CHAN_NO_IR) {
1148 		chan->flags &= ~IEEE80211_CHAN_NO_IR;
1149 		channel_changed = true;
1150 	}
1151 
1152 	if (channel_changed)
1153 		nl80211_send_beacon_hint_event(wiphy, &chan_before, chan);
1154 }
1155 
1156 /*
1157  * Called when a scan on a wiphy finds a beacon on
1158  * new channel
1159  */
1160 static void wiphy_update_new_beacon(struct wiphy *wiphy,
1161 				    struct reg_beacon *reg_beacon)
1162 {
1163 	unsigned int i;
1164 	struct ieee80211_supported_band *sband;
1165 
1166 	if (!wiphy->bands[reg_beacon->chan.band])
1167 		return;
1168 
1169 	sband = wiphy->bands[reg_beacon->chan.band];
1170 
1171 	for (i = 0; i < sband->n_channels; i++)
1172 		handle_reg_beacon(wiphy, i, reg_beacon);
1173 }
1174 
1175 /*
1176  * Called upon reg changes or a new wiphy is added
1177  */
1178 static void wiphy_update_beacon_reg(struct wiphy *wiphy)
1179 {
1180 	unsigned int i;
1181 	struct ieee80211_supported_band *sband;
1182 	struct reg_beacon *reg_beacon;
1183 
1184 	list_for_each_entry(reg_beacon, &reg_beacon_list, list) {
1185 		if (!wiphy->bands[reg_beacon->chan.band])
1186 			continue;
1187 		sband = wiphy->bands[reg_beacon->chan.band];
1188 		for (i = 0; i < sband->n_channels; i++)
1189 			handle_reg_beacon(wiphy, i, reg_beacon);
1190 	}
1191 }
1192 
1193 /* Reap the advantages of previously found beacons */
1194 static void reg_process_beacons(struct wiphy *wiphy)
1195 {
1196 	/*
1197 	 * Means we are just firing up cfg80211, so no beacons would
1198 	 * have been processed yet.
1199 	 */
1200 	if (!last_request)
1201 		return;
1202 	wiphy_update_beacon_reg(wiphy);
1203 }
1204 
1205 static bool is_ht40_allowed(struct ieee80211_channel *chan)
1206 {
1207 	if (!chan)
1208 		return false;
1209 	if (chan->flags & IEEE80211_CHAN_DISABLED)
1210 		return false;
1211 	/* This would happen when regulatory rules disallow HT40 completely */
1212 	if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
1213 		return false;
1214 	return true;
1215 }
1216 
1217 static void reg_process_ht_flags_channel(struct wiphy *wiphy,
1218 					 struct ieee80211_channel *channel)
1219 {
1220 	struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
1221 	struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
1222 	unsigned int i;
1223 
1224 	if (!is_ht40_allowed(channel)) {
1225 		channel->flags |= IEEE80211_CHAN_NO_HT40;
1226 		return;
1227 	}
1228 
1229 	/*
1230 	 * We need to ensure the extension channels exist to
1231 	 * be able to use HT40- or HT40+, this finds them (or not)
1232 	 */
1233 	for (i = 0; i < sband->n_channels; i++) {
1234 		struct ieee80211_channel *c = &sband->channels[i];
1235 
1236 		if (c->center_freq == (channel->center_freq - 20))
1237 			channel_before = c;
1238 		if (c->center_freq == (channel->center_freq + 20))
1239 			channel_after = c;
1240 	}
1241 
1242 	/*
1243 	 * Please note that this assumes target bandwidth is 20 MHz,
1244 	 * if that ever changes we also need to change the below logic
1245 	 * to include that as well.
1246 	 */
1247 	if (!is_ht40_allowed(channel_before))
1248 		channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
1249 	else
1250 		channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
1251 
1252 	if (!is_ht40_allowed(channel_after))
1253 		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
1254 	else
1255 		channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
1256 }
1257 
1258 static void reg_process_ht_flags_band(struct wiphy *wiphy,
1259 				      struct ieee80211_supported_band *sband)
1260 {
1261 	unsigned int i;
1262 
1263 	if (!sband)
1264 		return;
1265 
1266 	for (i = 0; i < sband->n_channels; i++)
1267 		reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
1268 }
1269 
1270 static void reg_process_ht_flags(struct wiphy *wiphy)
1271 {
1272 	enum ieee80211_band band;
1273 
1274 	if (!wiphy)
1275 		return;
1276 
1277 	for (band = 0; band < IEEE80211_NUM_BANDS; band++)
1278 		reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
1279 }
1280 
1281 static void reg_call_notifier(struct wiphy *wiphy,
1282 			      struct regulatory_request *request)
1283 {
1284 	if (wiphy->reg_notifier)
1285 		wiphy->reg_notifier(wiphy, request);
1286 }
1287 
1288 static void wiphy_update_regulatory(struct wiphy *wiphy,
1289 				    enum nl80211_reg_initiator initiator)
1290 {
1291 	enum ieee80211_band band;
1292 	struct regulatory_request *lr = get_last_request();
1293 
1294 	if (ignore_reg_update(wiphy, initiator)) {
1295 		/*
1296 		 * Regulatory updates set by CORE are ignored for custom
1297 		 * regulatory cards. Let us notify the changes to the driver,
1298 		 * as some drivers used this to restore its orig_* reg domain.
1299 		 */
1300 		if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1301 		    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1302 			reg_call_notifier(wiphy, lr);
1303 		return;
1304 	}
1305 
1306 	lr->dfs_region = get_cfg80211_regdom()->dfs_region;
1307 
1308 	for (band = 0; band < IEEE80211_NUM_BANDS; band++)
1309 		handle_band(wiphy, initiator, wiphy->bands[band]);
1310 
1311 	reg_process_beacons(wiphy);
1312 	reg_process_ht_flags(wiphy);
1313 	reg_call_notifier(wiphy, lr);
1314 }
1315 
1316 static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
1317 {
1318 	struct cfg80211_registered_device *rdev;
1319 	struct wiphy *wiphy;
1320 
1321 	ASSERT_RTNL();
1322 
1323 	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
1324 		wiphy = &rdev->wiphy;
1325 		wiphy_update_regulatory(wiphy, initiator);
1326 	}
1327 }
1328 
1329 static void handle_channel_custom(struct wiphy *wiphy,
1330 				  struct ieee80211_channel *chan,
1331 				  const struct ieee80211_regdomain *regd)
1332 {
1333 	u32 bw_flags = 0;
1334 	const struct ieee80211_reg_rule *reg_rule = NULL;
1335 	const struct ieee80211_power_rule *power_rule = NULL;
1336 	const struct ieee80211_freq_range *freq_range = NULL;
1337 
1338 	reg_rule = freq_reg_info_regd(wiphy, MHZ_TO_KHZ(chan->center_freq),
1339 				      regd);
1340 
1341 	if (IS_ERR(reg_rule)) {
1342 		REG_DBG_PRINT("Disabling freq %d MHz as custom regd has no rule that fits it\n",
1343 			      chan->center_freq);
1344 		chan->orig_flags |= IEEE80211_CHAN_DISABLED;
1345 		chan->flags = chan->orig_flags;
1346 		return;
1347 	}
1348 
1349 	chan_reg_rule_print_dbg(chan, reg_rule);
1350 
1351 	power_rule = &reg_rule->power_rule;
1352 	freq_range = &reg_rule->freq_range;
1353 
1354 	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
1355 		bw_flags = IEEE80211_CHAN_NO_HT40;
1356 	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(80))
1357 		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
1358 	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(160))
1359 		bw_flags |= IEEE80211_CHAN_NO_160MHZ;
1360 
1361 	chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
1362 	chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
1363 	chan->max_reg_power = chan->max_power =
1364 		(int) MBM_TO_DBM(power_rule->max_eirp);
1365 }
1366 
1367 static void handle_band_custom(struct wiphy *wiphy,
1368 			       struct ieee80211_supported_band *sband,
1369 			       const struct ieee80211_regdomain *regd)
1370 {
1371 	unsigned int i;
1372 
1373 	if (!sband)
1374 		return;
1375 
1376 	for (i = 0; i < sband->n_channels; i++)
1377 		handle_channel_custom(wiphy, &sband->channels[i], regd);
1378 }
1379 
1380 /* Used by drivers prior to wiphy registration */
1381 void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
1382 				   const struct ieee80211_regdomain *regd)
1383 {
1384 	enum ieee80211_band band;
1385 	unsigned int bands_set = 0;
1386 
1387 	WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG),
1388 	     "wiphy should have REGULATORY_CUSTOM_REG\n");
1389 	wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
1390 
1391 	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1392 		if (!wiphy->bands[band])
1393 			continue;
1394 		handle_band_custom(wiphy, wiphy->bands[band], regd);
1395 		bands_set++;
1396 	}
1397 
1398 	/*
1399 	 * no point in calling this if it won't have any effect
1400 	 * on your device's supported bands.
1401 	 */
1402 	WARN_ON(!bands_set);
1403 }
1404 EXPORT_SYMBOL(wiphy_apply_custom_regulatory);
1405 
1406 static void reg_set_request_processed(void)
1407 {
1408 	bool need_more_processing = false;
1409 	struct regulatory_request *lr = get_last_request();
1410 
1411 	lr->processed = true;
1412 
1413 	spin_lock(&reg_requests_lock);
1414 	if (!list_empty(&reg_requests_list))
1415 		need_more_processing = true;
1416 	spin_unlock(&reg_requests_lock);
1417 
1418 	if (lr->initiator == NL80211_REGDOM_SET_BY_USER)
1419 		cancel_delayed_work(&reg_timeout);
1420 
1421 	if (need_more_processing)
1422 		schedule_work(&reg_work);
1423 }
1424 
1425 /**
1426  * reg_process_hint_core - process core regulatory requests
1427  * @pending_request: a pending core regulatory request
1428  *
1429  * The wireless subsystem can use this function to process
1430  * a regulatory request issued by the regulatory core.
1431  *
1432  * Returns one of the different reg request treatment values.
1433  */
1434 static enum reg_request_treatment
1435 reg_process_hint_core(struct regulatory_request *core_request)
1436 {
1437 
1438 	core_request->intersect = false;
1439 	core_request->processed = false;
1440 
1441 	reg_update_last_request(core_request);
1442 
1443 	return reg_call_crda(core_request);
1444 }
1445 
1446 static enum reg_request_treatment
1447 __reg_process_hint_user(struct regulatory_request *user_request)
1448 {
1449 	struct regulatory_request *lr = get_last_request();
1450 
1451 	if (reg_request_cell_base(user_request))
1452 		return reg_ignore_cell_hint(user_request);
1453 
1454 	if (reg_request_cell_base(lr))
1455 		return REG_REQ_IGNORE;
1456 
1457 	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
1458 		return REG_REQ_INTERSECT;
1459 	/*
1460 	 * If the user knows better the user should set the regdom
1461 	 * to their country before the IE is picked up
1462 	 */
1463 	if (lr->initiator == NL80211_REGDOM_SET_BY_USER &&
1464 	    lr->intersect)
1465 		return REG_REQ_IGNORE;
1466 	/*
1467 	 * Process user requests only after previous user/driver/core
1468 	 * requests have been processed
1469 	 */
1470 	if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE ||
1471 	     lr->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
1472 	     lr->initiator == NL80211_REGDOM_SET_BY_USER) &&
1473 	    regdom_changes(lr->alpha2))
1474 		return REG_REQ_IGNORE;
1475 
1476 	if (!regdom_changes(user_request->alpha2))
1477 		return REG_REQ_ALREADY_SET;
1478 
1479 	return REG_REQ_OK;
1480 }
1481 
1482 /**
1483  * reg_process_hint_user - process user regulatory requests
1484  * @user_request: a pending user regulatory request
1485  *
1486  * The wireless subsystem can use this function to process
1487  * a regulatory request initiated by userspace.
1488  *
1489  * Returns one of the different reg request treatment values.
1490  */
1491 static enum reg_request_treatment
1492 reg_process_hint_user(struct regulatory_request *user_request)
1493 {
1494 	enum reg_request_treatment treatment;
1495 
1496 	treatment = __reg_process_hint_user(user_request);
1497 	if (treatment == REG_REQ_IGNORE ||
1498 	    treatment == REG_REQ_ALREADY_SET) {
1499 		kfree(user_request);
1500 		return treatment;
1501 	}
1502 
1503 	user_request->intersect = treatment == REG_REQ_INTERSECT;
1504 	user_request->processed = false;
1505 
1506 	reg_update_last_request(user_request);
1507 
1508 	user_alpha2[0] = user_request->alpha2[0];
1509 	user_alpha2[1] = user_request->alpha2[1];
1510 
1511 	return reg_call_crda(user_request);
1512 }
1513 
1514 static enum reg_request_treatment
1515 __reg_process_hint_driver(struct regulatory_request *driver_request)
1516 {
1517 	struct regulatory_request *lr = get_last_request();
1518 
1519 	if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) {
1520 		if (regdom_changes(driver_request->alpha2))
1521 			return REG_REQ_OK;
1522 		return REG_REQ_ALREADY_SET;
1523 	}
1524 
1525 	/*
1526 	 * This would happen if you unplug and plug your card
1527 	 * back in or if you add a new device for which the previously
1528 	 * loaded card also agrees on the regulatory domain.
1529 	 */
1530 	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1531 	    !regdom_changes(driver_request->alpha2))
1532 		return REG_REQ_ALREADY_SET;
1533 
1534 	return REG_REQ_INTERSECT;
1535 }
1536 
1537 /**
1538  * reg_process_hint_driver - process driver regulatory requests
1539  * @driver_request: a pending driver regulatory request
1540  *
1541  * The wireless subsystem can use this function to process
1542  * a regulatory request issued by an 802.11 driver.
1543  *
1544  * Returns one of the different reg request treatment values.
1545  */
1546 static enum reg_request_treatment
1547 reg_process_hint_driver(struct wiphy *wiphy,
1548 			struct regulatory_request *driver_request)
1549 {
1550 	const struct ieee80211_regdomain *regd;
1551 	enum reg_request_treatment treatment;
1552 
1553 	treatment = __reg_process_hint_driver(driver_request);
1554 
1555 	switch (treatment) {
1556 	case REG_REQ_OK:
1557 		break;
1558 	case REG_REQ_IGNORE:
1559 		kfree(driver_request);
1560 		return treatment;
1561 	case REG_REQ_INTERSECT:
1562 		/* fall through */
1563 	case REG_REQ_ALREADY_SET:
1564 		regd = reg_copy_regd(get_cfg80211_regdom());
1565 		if (IS_ERR(regd)) {
1566 			kfree(driver_request);
1567 			return REG_REQ_IGNORE;
1568 		}
1569 		rcu_assign_pointer(wiphy->regd, regd);
1570 	}
1571 
1572 
1573 	driver_request->intersect = treatment == REG_REQ_INTERSECT;
1574 	driver_request->processed = false;
1575 
1576 	reg_update_last_request(driver_request);
1577 
1578 	/*
1579 	 * Since CRDA will not be called in this case as we already
1580 	 * have applied the requested regulatory domain before we just
1581 	 * inform userspace we have processed the request
1582 	 */
1583 	if (treatment == REG_REQ_ALREADY_SET) {
1584 		nl80211_send_reg_change_event(driver_request);
1585 		reg_set_request_processed();
1586 		return treatment;
1587 	}
1588 
1589 	return reg_call_crda(driver_request);
1590 }
1591 
1592 static enum reg_request_treatment
1593 __reg_process_hint_country_ie(struct wiphy *wiphy,
1594 			      struct regulatory_request *country_ie_request)
1595 {
1596 	struct wiphy *last_wiphy = NULL;
1597 	struct regulatory_request *lr = get_last_request();
1598 
1599 	if (reg_request_cell_base(lr)) {
1600 		/* Trust a Cell base station over the AP's country IE */
1601 		if (regdom_changes(country_ie_request->alpha2))
1602 			return REG_REQ_IGNORE;
1603 		return REG_REQ_ALREADY_SET;
1604 	} else {
1605 		if (wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)
1606 			return REG_REQ_IGNORE;
1607 	}
1608 
1609 	if (unlikely(!is_an_alpha2(country_ie_request->alpha2)))
1610 		return -EINVAL;
1611 
1612 	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE)
1613 		return REG_REQ_OK;
1614 
1615 	last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
1616 
1617 	if (last_wiphy != wiphy) {
1618 		/*
1619 		 * Two cards with two APs claiming different
1620 		 * Country IE alpha2s. We could
1621 		 * intersect them, but that seems unlikely
1622 		 * to be correct. Reject second one for now.
1623 		 */
1624 		if (regdom_changes(country_ie_request->alpha2))
1625 			return REG_REQ_IGNORE;
1626 		return REG_REQ_ALREADY_SET;
1627 	}
1628 	/*
1629 	 * Two consecutive Country IE hints on the same wiphy.
1630 	 * This should be picked up early by the driver/stack
1631 	 */
1632 	if (WARN_ON(regdom_changes(country_ie_request->alpha2)))
1633 		return REG_REQ_OK;
1634 	return REG_REQ_ALREADY_SET;
1635 }
1636 
1637 /**
1638  * reg_process_hint_country_ie - process regulatory requests from country IEs
1639  * @country_ie_request: a regulatory request from a country IE
1640  *
1641  * The wireless subsystem can use this function to process
1642  * a regulatory request issued by a country Information Element.
1643  *
1644  * Returns one of the different reg request treatment values.
1645  */
1646 static enum reg_request_treatment
1647 reg_process_hint_country_ie(struct wiphy *wiphy,
1648 			    struct regulatory_request *country_ie_request)
1649 {
1650 	enum reg_request_treatment treatment;
1651 
1652 	treatment = __reg_process_hint_country_ie(wiphy, country_ie_request);
1653 
1654 	switch (treatment) {
1655 	case REG_REQ_OK:
1656 		break;
1657 	case REG_REQ_IGNORE:
1658 		/* fall through */
1659 	case REG_REQ_ALREADY_SET:
1660 		kfree(country_ie_request);
1661 		return treatment;
1662 	case REG_REQ_INTERSECT:
1663 		kfree(country_ie_request);
1664 		/*
1665 		 * This doesn't happen yet, not sure we
1666 		 * ever want to support it for this case.
1667 		 */
1668 		WARN_ONCE(1, "Unexpected intersection for country IEs");
1669 		return REG_REQ_IGNORE;
1670 	}
1671 
1672 	country_ie_request->intersect = false;
1673 	country_ie_request->processed = false;
1674 
1675 	reg_update_last_request(country_ie_request);
1676 
1677 	return reg_call_crda(country_ie_request);
1678 }
1679 
1680 /* This processes *all* regulatory hints */
1681 static void reg_process_hint(struct regulatory_request *reg_request)
1682 {
1683 	struct wiphy *wiphy = NULL;
1684 	enum reg_request_treatment treatment;
1685 
1686 	if (WARN_ON(!reg_request->alpha2))
1687 		return;
1688 
1689 	if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
1690 		wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
1691 
1692 	if (reg_request->initiator == NL80211_REGDOM_SET_BY_DRIVER && !wiphy) {
1693 		kfree(reg_request);
1694 		return;
1695 	}
1696 
1697 	switch (reg_request->initiator) {
1698 	case NL80211_REGDOM_SET_BY_CORE:
1699 		reg_process_hint_core(reg_request);
1700 		return;
1701 	case NL80211_REGDOM_SET_BY_USER:
1702 		treatment = reg_process_hint_user(reg_request);
1703 		if (treatment == REG_REQ_OK ||
1704 		    treatment == REG_REQ_ALREADY_SET)
1705 			return;
1706 		schedule_delayed_work(&reg_timeout, msecs_to_jiffies(3142));
1707 		return;
1708 	case NL80211_REGDOM_SET_BY_DRIVER:
1709 		treatment = reg_process_hint_driver(wiphy, reg_request);
1710 		break;
1711 	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
1712 		treatment = reg_process_hint_country_ie(wiphy, reg_request);
1713 		break;
1714 	default:
1715 		WARN(1, "invalid initiator %d\n", reg_request->initiator);
1716 		return;
1717 	}
1718 
1719 	/* This is required so that the orig_* parameters are saved */
1720 	if (treatment == REG_REQ_ALREADY_SET && wiphy &&
1721 	    wiphy->regulatory_flags & REGULATORY_STRICT_REG)
1722 		wiphy_update_regulatory(wiphy, reg_request->initiator);
1723 }
1724 
1725 /*
1726  * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_*
1727  * Regulatory hints come on a first come first serve basis and we
1728  * must process each one atomically.
1729  */
1730 static void reg_process_pending_hints(void)
1731 {
1732 	struct regulatory_request *reg_request, *lr;
1733 
1734 	lr = get_last_request();
1735 
1736 	/* When last_request->processed becomes true this will be rescheduled */
1737 	if (lr && !lr->processed) {
1738 		REG_DBG_PRINT("Pending regulatory request, waiting for it to be processed...\n");
1739 		return;
1740 	}
1741 
1742 	spin_lock(&reg_requests_lock);
1743 
1744 	if (list_empty(&reg_requests_list)) {
1745 		spin_unlock(&reg_requests_lock);
1746 		return;
1747 	}
1748 
1749 	reg_request = list_first_entry(&reg_requests_list,
1750 				       struct regulatory_request,
1751 				       list);
1752 	list_del_init(&reg_request->list);
1753 
1754 	spin_unlock(&reg_requests_lock);
1755 
1756 	reg_process_hint(reg_request);
1757 }
1758 
1759 /* Processes beacon hints -- this has nothing to do with country IEs */
1760 static void reg_process_pending_beacon_hints(void)
1761 {
1762 	struct cfg80211_registered_device *rdev;
1763 	struct reg_beacon *pending_beacon, *tmp;
1764 
1765 	/* This goes through the _pending_ beacon list */
1766 	spin_lock_bh(&reg_pending_beacons_lock);
1767 
1768 	list_for_each_entry_safe(pending_beacon, tmp,
1769 				 &reg_pending_beacons, list) {
1770 		list_del_init(&pending_beacon->list);
1771 
1772 		/* Applies the beacon hint to current wiphys */
1773 		list_for_each_entry(rdev, &cfg80211_rdev_list, list)
1774 			wiphy_update_new_beacon(&rdev->wiphy, pending_beacon);
1775 
1776 		/* Remembers the beacon hint for new wiphys or reg changes */
1777 		list_add_tail(&pending_beacon->list, &reg_beacon_list);
1778 	}
1779 
1780 	spin_unlock_bh(&reg_pending_beacons_lock);
1781 }
1782 
1783 static void reg_todo(struct work_struct *work)
1784 {
1785 	rtnl_lock();
1786 	reg_process_pending_hints();
1787 	reg_process_pending_beacon_hints();
1788 	rtnl_unlock();
1789 }
1790 
1791 static void queue_regulatory_request(struct regulatory_request *request)
1792 {
1793 	request->alpha2[0] = toupper(request->alpha2[0]);
1794 	request->alpha2[1] = toupper(request->alpha2[1]);
1795 
1796 	spin_lock(&reg_requests_lock);
1797 	list_add_tail(&request->list, &reg_requests_list);
1798 	spin_unlock(&reg_requests_lock);
1799 
1800 	schedule_work(&reg_work);
1801 }
1802 
1803 /*
1804  * Core regulatory hint -- happens during cfg80211_init()
1805  * and when we restore regulatory settings.
1806  */
1807 static int regulatory_hint_core(const char *alpha2)
1808 {
1809 	struct regulatory_request *request;
1810 
1811 	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
1812 	if (!request)
1813 		return -ENOMEM;
1814 
1815 	request->alpha2[0] = alpha2[0];
1816 	request->alpha2[1] = alpha2[1];
1817 	request->initiator = NL80211_REGDOM_SET_BY_CORE;
1818 
1819 	queue_regulatory_request(request);
1820 
1821 	return 0;
1822 }
1823 
1824 /* User hints */
1825 int regulatory_hint_user(const char *alpha2,
1826 			 enum nl80211_user_reg_hint_type user_reg_hint_type)
1827 {
1828 	struct regulatory_request *request;
1829 
1830 	if (WARN_ON(!alpha2))
1831 		return -EINVAL;
1832 
1833 	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
1834 	if (!request)
1835 		return -ENOMEM;
1836 
1837 	request->wiphy_idx = WIPHY_IDX_INVALID;
1838 	request->alpha2[0] = alpha2[0];
1839 	request->alpha2[1] = alpha2[1];
1840 	request->initiator = NL80211_REGDOM_SET_BY_USER;
1841 	request->user_reg_hint_type = user_reg_hint_type;
1842 
1843 	queue_regulatory_request(request);
1844 
1845 	return 0;
1846 }
1847 
1848 /* Driver hints */
1849 int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
1850 {
1851 	struct regulatory_request *request;
1852 
1853 	if (WARN_ON(!alpha2 || !wiphy))
1854 		return -EINVAL;
1855 
1856 	wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG;
1857 
1858 	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
1859 	if (!request)
1860 		return -ENOMEM;
1861 
1862 	request->wiphy_idx = get_wiphy_idx(wiphy);
1863 
1864 	request->alpha2[0] = alpha2[0];
1865 	request->alpha2[1] = alpha2[1];
1866 	request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
1867 
1868 	queue_regulatory_request(request);
1869 
1870 	return 0;
1871 }
1872 EXPORT_SYMBOL(regulatory_hint);
1873 
1874 void regulatory_hint_country_ie(struct wiphy *wiphy, enum ieee80211_band band,
1875 				const u8 *country_ie, u8 country_ie_len)
1876 {
1877 	char alpha2[2];
1878 	enum environment_cap env = ENVIRON_ANY;
1879 	struct regulatory_request *request = NULL, *lr;
1880 
1881 	/* IE len must be evenly divisible by 2 */
1882 	if (country_ie_len & 0x01)
1883 		return;
1884 
1885 	if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
1886 		return;
1887 
1888 	request = kzalloc(sizeof(*request), GFP_KERNEL);
1889 	if (!request)
1890 		return;
1891 
1892 	alpha2[0] = country_ie[0];
1893 	alpha2[1] = country_ie[1];
1894 
1895 	if (country_ie[2] == 'I')
1896 		env = ENVIRON_INDOOR;
1897 	else if (country_ie[2] == 'O')
1898 		env = ENVIRON_OUTDOOR;
1899 
1900 	rcu_read_lock();
1901 	lr = get_last_request();
1902 
1903 	if (unlikely(!lr))
1904 		goto out;
1905 
1906 	/*
1907 	 * We will run this only upon a successful connection on cfg80211.
1908 	 * We leave conflict resolution to the workqueue, where can hold
1909 	 * the RTNL.
1910 	 */
1911 	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1912 	    lr->wiphy_idx != WIPHY_IDX_INVALID)
1913 		goto out;
1914 
1915 	request->wiphy_idx = get_wiphy_idx(wiphy);
1916 	request->alpha2[0] = alpha2[0];
1917 	request->alpha2[1] = alpha2[1];
1918 	request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
1919 	request->country_ie_env = env;
1920 
1921 	queue_regulatory_request(request);
1922 	request = NULL;
1923 out:
1924 	kfree(request);
1925 	rcu_read_unlock();
1926 }
1927 
1928 static void restore_alpha2(char *alpha2, bool reset_user)
1929 {
1930 	/* indicates there is no alpha2 to consider for restoration */
1931 	alpha2[0] = '9';
1932 	alpha2[1] = '7';
1933 
1934 	/* The user setting has precedence over the module parameter */
1935 	if (is_user_regdom_saved()) {
1936 		/* Unless we're asked to ignore it and reset it */
1937 		if (reset_user) {
1938 			REG_DBG_PRINT("Restoring regulatory settings including user preference\n");
1939 			user_alpha2[0] = '9';
1940 			user_alpha2[1] = '7';
1941 
1942 			/*
1943 			 * If we're ignoring user settings, we still need to
1944 			 * check the module parameter to ensure we put things
1945 			 * back as they were for a full restore.
1946 			 */
1947 			if (!is_world_regdom(ieee80211_regdom)) {
1948 				REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
1949 					      ieee80211_regdom[0], ieee80211_regdom[1]);
1950 				alpha2[0] = ieee80211_regdom[0];
1951 				alpha2[1] = ieee80211_regdom[1];
1952 			}
1953 		} else {
1954 			REG_DBG_PRINT("Restoring regulatory settings while preserving user preference for: %c%c\n",
1955 				      user_alpha2[0], user_alpha2[1]);
1956 			alpha2[0] = user_alpha2[0];
1957 			alpha2[1] = user_alpha2[1];
1958 		}
1959 	} else if (!is_world_regdom(ieee80211_regdom)) {
1960 		REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
1961 			      ieee80211_regdom[0], ieee80211_regdom[1]);
1962 		alpha2[0] = ieee80211_regdom[0];
1963 		alpha2[1] = ieee80211_regdom[1];
1964 	} else
1965 		REG_DBG_PRINT("Restoring regulatory settings\n");
1966 }
1967 
1968 static void restore_custom_reg_settings(struct wiphy *wiphy)
1969 {
1970 	struct ieee80211_supported_band *sband;
1971 	enum ieee80211_band band;
1972 	struct ieee80211_channel *chan;
1973 	int i;
1974 
1975 	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1976 		sband = wiphy->bands[band];
1977 		if (!sband)
1978 			continue;
1979 		for (i = 0; i < sband->n_channels; i++) {
1980 			chan = &sband->channels[i];
1981 			chan->flags = chan->orig_flags;
1982 			chan->max_antenna_gain = chan->orig_mag;
1983 			chan->max_power = chan->orig_mpwr;
1984 			chan->beacon_found = false;
1985 		}
1986 	}
1987 }
1988 
1989 /*
1990  * Restoring regulatory settings involves ingoring any
1991  * possibly stale country IE information and user regulatory
1992  * settings if so desired, this includes any beacon hints
1993  * learned as we could have traveled outside to another country
1994  * after disconnection. To restore regulatory settings we do
1995  * exactly what we did at bootup:
1996  *
1997  *   - send a core regulatory hint
1998  *   - send a user regulatory hint if applicable
1999  *
2000  * Device drivers that send a regulatory hint for a specific country
2001  * keep their own regulatory domain on wiphy->regd so that does does
2002  * not need to be remembered.
2003  */
2004 static void restore_regulatory_settings(bool reset_user)
2005 {
2006 	char alpha2[2];
2007 	char world_alpha2[2];
2008 	struct reg_beacon *reg_beacon, *btmp;
2009 	struct regulatory_request *reg_request, *tmp;
2010 	LIST_HEAD(tmp_reg_req_list);
2011 	struct cfg80211_registered_device *rdev;
2012 
2013 	ASSERT_RTNL();
2014 
2015 	reset_regdomains(true, &world_regdom);
2016 	restore_alpha2(alpha2, reset_user);
2017 
2018 	/*
2019 	 * If there's any pending requests we simply
2020 	 * stash them to a temporary pending queue and
2021 	 * add then after we've restored regulatory
2022 	 * settings.
2023 	 */
2024 	spin_lock(&reg_requests_lock);
2025 	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
2026 		if (reg_request->initiator != NL80211_REGDOM_SET_BY_USER)
2027 			continue;
2028 		list_move_tail(&reg_request->list, &tmp_reg_req_list);
2029 	}
2030 	spin_unlock(&reg_requests_lock);
2031 
2032 	/* Clear beacon hints */
2033 	spin_lock_bh(&reg_pending_beacons_lock);
2034 	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
2035 		list_del(&reg_beacon->list);
2036 		kfree(reg_beacon);
2037 	}
2038 	spin_unlock_bh(&reg_pending_beacons_lock);
2039 
2040 	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
2041 		list_del(&reg_beacon->list);
2042 		kfree(reg_beacon);
2043 	}
2044 
2045 	/* First restore to the basic regulatory settings */
2046 	world_alpha2[0] = cfg80211_world_regdom->alpha2[0];
2047 	world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
2048 
2049 	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2050 		if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG)
2051 			restore_custom_reg_settings(&rdev->wiphy);
2052 	}
2053 
2054 	regulatory_hint_core(world_alpha2);
2055 
2056 	/*
2057 	 * This restores the ieee80211_regdom module parameter
2058 	 * preference or the last user requested regulatory
2059 	 * settings, user regulatory settings takes precedence.
2060 	 */
2061 	if (is_an_alpha2(alpha2))
2062 		regulatory_hint_user(user_alpha2, NL80211_USER_REG_HINT_USER);
2063 
2064 	spin_lock(&reg_requests_lock);
2065 	list_splice_tail_init(&tmp_reg_req_list, &reg_requests_list);
2066 	spin_unlock(&reg_requests_lock);
2067 
2068 	REG_DBG_PRINT("Kicking the queue\n");
2069 
2070 	schedule_work(&reg_work);
2071 }
2072 
2073 void regulatory_hint_disconnect(void)
2074 {
2075 	REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n");
2076 	restore_regulatory_settings(false);
2077 }
2078 
2079 static bool freq_is_chan_12_13_14(u16 freq)
2080 {
2081 	if (freq == ieee80211_channel_to_frequency(12, IEEE80211_BAND_2GHZ) ||
2082 	    freq == ieee80211_channel_to_frequency(13, IEEE80211_BAND_2GHZ) ||
2083 	    freq == ieee80211_channel_to_frequency(14, IEEE80211_BAND_2GHZ))
2084 		return true;
2085 	return false;
2086 }
2087 
2088 static bool pending_reg_beacon(struct ieee80211_channel *beacon_chan)
2089 {
2090 	struct reg_beacon *pending_beacon;
2091 
2092 	list_for_each_entry(pending_beacon, &reg_pending_beacons, list)
2093 		if (beacon_chan->center_freq ==
2094 		    pending_beacon->chan.center_freq)
2095 			return true;
2096 	return false;
2097 }
2098 
2099 int regulatory_hint_found_beacon(struct wiphy *wiphy,
2100 				 struct ieee80211_channel *beacon_chan,
2101 				 gfp_t gfp)
2102 {
2103 	struct reg_beacon *reg_beacon;
2104 	bool processing;
2105 
2106 	if (beacon_chan->beacon_found ||
2107 	    beacon_chan->flags & IEEE80211_CHAN_RADAR ||
2108 	    (beacon_chan->band == IEEE80211_BAND_2GHZ &&
2109 	     !freq_is_chan_12_13_14(beacon_chan->center_freq)))
2110 		return 0;
2111 
2112 	spin_lock_bh(&reg_pending_beacons_lock);
2113 	processing = pending_reg_beacon(beacon_chan);
2114 	spin_unlock_bh(&reg_pending_beacons_lock);
2115 
2116 	if (processing)
2117 		return 0;
2118 
2119 	reg_beacon = kzalloc(sizeof(struct reg_beacon), gfp);
2120 	if (!reg_beacon)
2121 		return -ENOMEM;
2122 
2123 	REG_DBG_PRINT("Found new beacon on frequency: %d MHz (Ch %d) on %s\n",
2124 		      beacon_chan->center_freq,
2125 		      ieee80211_frequency_to_channel(beacon_chan->center_freq),
2126 		      wiphy_name(wiphy));
2127 
2128 	memcpy(&reg_beacon->chan, beacon_chan,
2129 	       sizeof(struct ieee80211_channel));
2130 
2131 	/*
2132 	 * Since we can be called from BH or and non-BH context
2133 	 * we must use spin_lock_bh()
2134 	 */
2135 	spin_lock_bh(&reg_pending_beacons_lock);
2136 	list_add_tail(&reg_beacon->list, &reg_pending_beacons);
2137 	spin_unlock_bh(&reg_pending_beacons_lock);
2138 
2139 	schedule_work(&reg_work);
2140 
2141 	return 0;
2142 }
2143 
2144 static void print_rd_rules(const struct ieee80211_regdomain *rd)
2145 {
2146 	unsigned int i;
2147 	const struct ieee80211_reg_rule *reg_rule = NULL;
2148 	const struct ieee80211_freq_range *freq_range = NULL;
2149 	const struct ieee80211_power_rule *power_rule = NULL;
2150 
2151 	pr_info("  (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)\n");
2152 
2153 	for (i = 0; i < rd->n_reg_rules; i++) {
2154 		reg_rule = &rd->reg_rules[i];
2155 		freq_range = &reg_rule->freq_range;
2156 		power_rule = &reg_rule->power_rule;
2157 
2158 		/*
2159 		 * There may not be documentation for max antenna gain
2160 		 * in certain regions
2161 		 */
2162 		if (power_rule->max_antenna_gain)
2163 			pr_info("  (%d KHz - %d KHz @ %d KHz), (%d mBi, %d mBm)\n",
2164 				freq_range->start_freq_khz,
2165 				freq_range->end_freq_khz,
2166 				freq_range->max_bandwidth_khz,
2167 				power_rule->max_antenna_gain,
2168 				power_rule->max_eirp);
2169 		else
2170 			pr_info("  (%d KHz - %d KHz @ %d KHz), (N/A, %d mBm)\n",
2171 				freq_range->start_freq_khz,
2172 				freq_range->end_freq_khz,
2173 				freq_range->max_bandwidth_khz,
2174 				power_rule->max_eirp);
2175 	}
2176 }
2177 
2178 bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region)
2179 {
2180 	switch (dfs_region) {
2181 	case NL80211_DFS_UNSET:
2182 	case NL80211_DFS_FCC:
2183 	case NL80211_DFS_ETSI:
2184 	case NL80211_DFS_JP:
2185 		return true;
2186 	default:
2187 		REG_DBG_PRINT("Ignoring uknown DFS master region: %d\n",
2188 			      dfs_region);
2189 		return false;
2190 	}
2191 }
2192 
2193 static void print_regdomain(const struct ieee80211_regdomain *rd)
2194 {
2195 	struct regulatory_request *lr = get_last_request();
2196 
2197 	if (is_intersected_alpha2(rd->alpha2)) {
2198 		if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
2199 			struct cfg80211_registered_device *rdev;
2200 			rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
2201 			if (rdev) {
2202 				pr_info("Current regulatory domain updated by AP to: %c%c\n",
2203 					rdev->country_ie_alpha2[0],
2204 					rdev->country_ie_alpha2[1]);
2205 			} else
2206 				pr_info("Current regulatory domain intersected:\n");
2207 		} else
2208 			pr_info("Current regulatory domain intersected:\n");
2209 	} else if (is_world_regdom(rd->alpha2)) {
2210 		pr_info("World regulatory domain updated:\n");
2211 	} else {
2212 		if (is_unknown_alpha2(rd->alpha2))
2213 			pr_info("Regulatory domain changed to driver built-in settings (unknown country)\n");
2214 		else {
2215 			if (reg_request_cell_base(lr))
2216 				pr_info("Regulatory domain changed to country: %c%c by Cell Station\n",
2217 					rd->alpha2[0], rd->alpha2[1]);
2218 			else
2219 				pr_info("Regulatory domain changed to country: %c%c\n",
2220 					rd->alpha2[0], rd->alpha2[1]);
2221 		}
2222 	}
2223 
2224 	pr_info(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
2225 	print_rd_rules(rd);
2226 }
2227 
2228 static void print_regdomain_info(const struct ieee80211_regdomain *rd)
2229 {
2230 	pr_info("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
2231 	print_rd_rules(rd);
2232 }
2233 
2234 static int reg_set_rd_core(const struct ieee80211_regdomain *rd)
2235 {
2236 	if (!is_world_regdom(rd->alpha2))
2237 		return -EINVAL;
2238 	update_world_regdomain(rd);
2239 	return 0;
2240 }
2241 
2242 static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
2243 			   struct regulatory_request *user_request)
2244 {
2245 	const struct ieee80211_regdomain *intersected_rd = NULL;
2246 
2247 	if (is_world_regdom(rd->alpha2))
2248 		return -EINVAL;
2249 
2250 	if (!regdom_changes(rd->alpha2))
2251 		return -EALREADY;
2252 
2253 	if (!is_valid_rd(rd)) {
2254 		pr_err("Invalid regulatory domain detected:\n");
2255 		print_regdomain_info(rd);
2256 		return -EINVAL;
2257 	}
2258 
2259 	if (!user_request->intersect) {
2260 		reset_regdomains(false, rd);
2261 		return 0;
2262 	}
2263 
2264 	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
2265 	if (!intersected_rd)
2266 		return -EINVAL;
2267 
2268 	kfree(rd);
2269 	rd = NULL;
2270 	reset_regdomains(false, intersected_rd);
2271 
2272 	return 0;
2273 }
2274 
2275 static int reg_set_rd_driver(const struct ieee80211_regdomain *rd,
2276 			     struct regulatory_request *driver_request)
2277 {
2278 	const struct ieee80211_regdomain *regd;
2279 	const struct ieee80211_regdomain *intersected_rd = NULL;
2280 	const struct ieee80211_regdomain *tmp;
2281 	struct wiphy *request_wiphy;
2282 
2283 	if (is_world_regdom(rd->alpha2))
2284 		return -EINVAL;
2285 
2286 	if (!regdom_changes(rd->alpha2))
2287 		return -EALREADY;
2288 
2289 	if (!is_valid_rd(rd)) {
2290 		pr_err("Invalid regulatory domain detected:\n");
2291 		print_regdomain_info(rd);
2292 		return -EINVAL;
2293 	}
2294 
2295 	request_wiphy = wiphy_idx_to_wiphy(driver_request->wiphy_idx);
2296 	if (!request_wiphy) {
2297 		schedule_delayed_work(&reg_timeout, 0);
2298 		return -ENODEV;
2299 	}
2300 
2301 	if (!driver_request->intersect) {
2302 		if (request_wiphy->regd)
2303 			return -EALREADY;
2304 
2305 		regd = reg_copy_regd(rd);
2306 		if (IS_ERR(regd))
2307 			return PTR_ERR(regd);
2308 
2309 		rcu_assign_pointer(request_wiphy->regd, regd);
2310 		reset_regdomains(false, rd);
2311 		return 0;
2312 	}
2313 
2314 	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
2315 	if (!intersected_rd)
2316 		return -EINVAL;
2317 
2318 	/*
2319 	 * We can trash what CRDA provided now.
2320 	 * However if a driver requested this specific regulatory
2321 	 * domain we keep it for its private use
2322 	 */
2323 	tmp = get_wiphy_regdom(request_wiphy);
2324 	rcu_assign_pointer(request_wiphy->regd, rd);
2325 	rcu_free_regdom(tmp);
2326 
2327 	rd = NULL;
2328 
2329 	reset_regdomains(false, intersected_rd);
2330 
2331 	return 0;
2332 }
2333 
2334 static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
2335 				 struct regulatory_request *country_ie_request)
2336 {
2337 	struct wiphy *request_wiphy;
2338 
2339 	if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
2340 	    !is_unknown_alpha2(rd->alpha2))
2341 		return -EINVAL;
2342 
2343 	/*
2344 	 * Lets only bother proceeding on the same alpha2 if the current
2345 	 * rd is non static (it means CRDA was present and was used last)
2346 	 * and the pending request came in from a country IE
2347 	 */
2348 
2349 	if (!is_valid_rd(rd)) {
2350 		pr_err("Invalid regulatory domain detected:\n");
2351 		print_regdomain_info(rd);
2352 		return -EINVAL;
2353 	}
2354 
2355 	request_wiphy = wiphy_idx_to_wiphy(country_ie_request->wiphy_idx);
2356 	if (!request_wiphy) {
2357 		schedule_delayed_work(&reg_timeout, 0);
2358 		return -ENODEV;
2359 	}
2360 
2361 	if (country_ie_request->intersect)
2362 		return -EINVAL;
2363 
2364 	reset_regdomains(false, rd);
2365 	return 0;
2366 }
2367 
2368 /*
2369  * Use this call to set the current regulatory domain. Conflicts with
2370  * multiple drivers can be ironed out later. Caller must've already
2371  * kmalloc'd the rd structure.
2372  */
2373 int set_regdom(const struct ieee80211_regdomain *rd)
2374 {
2375 	struct regulatory_request *lr;
2376 	int r;
2377 
2378 	if (!reg_is_valid_request(rd->alpha2)) {
2379 		kfree(rd);
2380 		return -EINVAL;
2381 	}
2382 
2383 	lr = get_last_request();
2384 
2385 	/* Note that this doesn't update the wiphys, this is done below */
2386 	switch (lr->initiator) {
2387 	case NL80211_REGDOM_SET_BY_CORE:
2388 		r = reg_set_rd_core(rd);
2389 		break;
2390 	case NL80211_REGDOM_SET_BY_USER:
2391 		r = reg_set_rd_user(rd, lr);
2392 		break;
2393 	case NL80211_REGDOM_SET_BY_DRIVER:
2394 		r = reg_set_rd_driver(rd, lr);
2395 		break;
2396 	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
2397 		r = reg_set_rd_country_ie(rd, lr);
2398 		break;
2399 	default:
2400 		WARN(1, "invalid initiator %d\n", lr->initiator);
2401 		return -EINVAL;
2402 	}
2403 
2404 	if (r) {
2405 		if (r == -EALREADY)
2406 			reg_set_request_processed();
2407 
2408 		kfree(rd);
2409 		return r;
2410 	}
2411 
2412 	/* This would make this whole thing pointless */
2413 	if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom()))
2414 		return -EINVAL;
2415 
2416 	/* update all wiphys now with the new established regulatory domain */
2417 	update_all_wiphy_regulatory(lr->initiator);
2418 
2419 	print_regdomain(get_cfg80211_regdom());
2420 
2421 	nl80211_send_reg_change_event(lr);
2422 
2423 	reg_set_request_processed();
2424 
2425 	return 0;
2426 }
2427 
2428 int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env)
2429 {
2430 	struct regulatory_request *lr;
2431 	u8 alpha2[2];
2432 	bool add = false;
2433 
2434 	rcu_read_lock();
2435 	lr = get_last_request();
2436 	if (lr && !lr->processed) {
2437 		memcpy(alpha2, lr->alpha2, 2);
2438 		add = true;
2439 	}
2440 	rcu_read_unlock();
2441 
2442 	if (add)
2443 		return add_uevent_var(env, "COUNTRY=%c%c",
2444 				      alpha2[0], alpha2[1]);
2445 	return 0;
2446 }
2447 
2448 void wiphy_regulatory_register(struct wiphy *wiphy)
2449 {
2450 	struct regulatory_request *lr;
2451 
2452 	if (!reg_dev_ignore_cell_hint(wiphy))
2453 		reg_num_devs_support_basehint++;
2454 
2455 	lr = get_last_request();
2456 	wiphy_update_regulatory(wiphy, lr->initiator);
2457 }
2458 
2459 void wiphy_regulatory_deregister(struct wiphy *wiphy)
2460 {
2461 	struct wiphy *request_wiphy = NULL;
2462 	struct regulatory_request *lr;
2463 
2464 	lr = get_last_request();
2465 
2466 	if (!reg_dev_ignore_cell_hint(wiphy))
2467 		reg_num_devs_support_basehint--;
2468 
2469 	rcu_free_regdom(get_wiphy_regdom(wiphy));
2470 	rcu_assign_pointer(wiphy->regd, NULL);
2471 
2472 	if (lr)
2473 		request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
2474 
2475 	if (!request_wiphy || request_wiphy != wiphy)
2476 		return;
2477 
2478 	lr->wiphy_idx = WIPHY_IDX_INVALID;
2479 	lr->country_ie_env = ENVIRON_ANY;
2480 }
2481 
2482 static void reg_timeout_work(struct work_struct *work)
2483 {
2484 	REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
2485 	rtnl_lock();
2486 	restore_regulatory_settings(true);
2487 	rtnl_unlock();
2488 }
2489 
2490 int __init regulatory_init(void)
2491 {
2492 	int err = 0;
2493 
2494 	reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
2495 	if (IS_ERR(reg_pdev))
2496 		return PTR_ERR(reg_pdev);
2497 
2498 	reg_pdev->dev.type = &reg_device_type;
2499 
2500 	spin_lock_init(&reg_requests_lock);
2501 	spin_lock_init(&reg_pending_beacons_lock);
2502 
2503 	reg_regdb_size_check();
2504 
2505 	rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
2506 
2507 	user_alpha2[0] = '9';
2508 	user_alpha2[1] = '7';
2509 
2510 	/* We always try to get an update for the static regdomain */
2511 	err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
2512 	if (err) {
2513 		if (err == -ENOMEM)
2514 			return err;
2515 		/*
2516 		 * N.B. kobject_uevent_env() can fail mainly for when we're out
2517 		 * memory which is handled and propagated appropriately above
2518 		 * but it can also fail during a netlink_broadcast() or during
2519 		 * early boot for call_usermodehelper(). For now treat these
2520 		 * errors as non-fatal.
2521 		 */
2522 		pr_err("kobject_uevent_env() was unable to call CRDA during init\n");
2523 	}
2524 
2525 	/*
2526 	 * Finally, if the user set the module parameter treat it
2527 	 * as a user hint.
2528 	 */
2529 	if (!is_world_regdom(ieee80211_regdom))
2530 		regulatory_hint_user(ieee80211_regdom,
2531 				     NL80211_USER_REG_HINT_USER);
2532 
2533 	return 0;
2534 }
2535 
2536 void regulatory_exit(void)
2537 {
2538 	struct regulatory_request *reg_request, *tmp;
2539 	struct reg_beacon *reg_beacon, *btmp;
2540 
2541 	cancel_work_sync(&reg_work);
2542 	cancel_delayed_work_sync(&reg_timeout);
2543 
2544 	/* Lock to suppress warnings */
2545 	rtnl_lock();
2546 	reset_regdomains(true, NULL);
2547 	rtnl_unlock();
2548 
2549 	dev_set_uevent_suppress(&reg_pdev->dev, true);
2550 
2551 	platform_device_unregister(reg_pdev);
2552 
2553 	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
2554 		list_del(&reg_beacon->list);
2555 		kfree(reg_beacon);
2556 	}
2557 
2558 	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
2559 		list_del(&reg_beacon->list);
2560 		kfree(reg_beacon);
2561 	}
2562 
2563 	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
2564 		list_del(&reg_request->list);
2565 		kfree(reg_request);
2566 	}
2567 }
2568