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