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