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