diff options
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/reg.c | 39 | ||||
-rw-r--r-- | net/wireless/reg.h | 1 |
2 files changed, 29 insertions, 11 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index c565689f0b9f..3332d5bce317 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -63,6 +63,10 @@ static struct regulatory_request *last_request; | |||
63 | /* To trigger userspace events */ | 63 | /* To trigger userspace events */ |
64 | static struct platform_device *reg_pdev; | 64 | static struct platform_device *reg_pdev; |
65 | 65 | ||
66 | static struct device_type reg_device_type = { | ||
67 | .uevent = reg_device_uevent, | ||
68 | }; | ||
69 | |||
66 | /* | 70 | /* |
67 | * Central wireless core regulatory domains, we only need two, | 71 | * Central wireless core regulatory domains, we only need two, |
68 | * the current one and a world regulatory domain in case we have no | 72 | * the current one and a world regulatory domain in case we have no |
@@ -362,16 +366,11 @@ static inline void reg_regdb_query(const char *alpha2) {} | |||
362 | 366 | ||
363 | /* | 367 | /* |
364 | * This lets us keep regulatory code which is updated on a regulatory | 368 | * This lets us keep regulatory code which is updated on a regulatory |
365 | * basis in userspace. | 369 | * basis in userspace. Country information is filled in by |
370 | * reg_device_uevent | ||
366 | */ | 371 | */ |
367 | static int call_crda(const char *alpha2) | 372 | static int call_crda(const char *alpha2) |
368 | { | 373 | { |
369 | char country_env[9 + 2] = "COUNTRY="; | ||
370 | char *envp[] = { | ||
371 | country_env, | ||
372 | NULL | ||
373 | }; | ||
374 | |||
375 | if (!is_world_regdom((char *) alpha2)) | 374 | if (!is_world_regdom((char *) alpha2)) |
376 | pr_info("Calling CRDA for country: %c%c\n", | 375 | pr_info("Calling CRDA for country: %c%c\n", |
377 | alpha2[0], alpha2[1]); | 376 | alpha2[0], alpha2[1]); |
@@ -381,10 +380,7 @@ static int call_crda(const char *alpha2) | |||
381 | /* query internal regulatory database (if it exists) */ | 380 | /* query internal regulatory database (if it exists) */ |
382 | reg_regdb_query(alpha2); | 381 | reg_regdb_query(alpha2); |
383 | 382 | ||
384 | country_env[8] = alpha2[0]; | 383 | return kobject_uevent(®_pdev->dev.kobj, KOBJ_CHANGE); |
385 | country_env[9] = alpha2[1]; | ||
386 | |||
387 | return kobject_uevent_env(®_pdev->dev.kobj, KOBJ_CHANGE, envp); | ||
388 | } | 384 | } |
389 | 385 | ||
390 | /* Used by nl80211 before kmalloc'ing our regulatory domain */ | 386 | /* Used by nl80211 before kmalloc'ing our regulatory domain */ |
@@ -2087,6 +2083,25 @@ int set_regdom(const struct ieee80211_regdomain *rd) | |||
2087 | return r; | 2083 | return r; |
2088 | } | 2084 | } |
2089 | 2085 | ||
2086 | #ifdef CONFIG_HOTPLUG | ||
2087 | int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
2088 | { | ||
2089 | if (last_request && !last_request->processed) { | ||
2090 | if (add_uevent_var(env, "COUNTRY=%c%c", | ||
2091 | last_request->alpha2[0], | ||
2092 | last_request->alpha2[1])) | ||
2093 | return -ENOMEM; | ||
2094 | } | ||
2095 | |||
2096 | return 0; | ||
2097 | } | ||
2098 | #else | ||
2099 | int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
2100 | { | ||
2101 | return -ENODEV; | ||
2102 | } | ||
2103 | #endif /* CONFIG_HOTPLUG */ | ||
2104 | |||
2090 | /* Caller must hold cfg80211_mutex */ | 2105 | /* Caller must hold cfg80211_mutex */ |
2091 | void reg_device_remove(struct wiphy *wiphy) | 2106 | void reg_device_remove(struct wiphy *wiphy) |
2092 | { | 2107 | { |
@@ -2118,6 +2133,8 @@ int __init regulatory_init(void) | |||
2118 | if (IS_ERR(reg_pdev)) | 2133 | if (IS_ERR(reg_pdev)) |
2119 | return PTR_ERR(reg_pdev); | 2134 | return PTR_ERR(reg_pdev); |
2120 | 2135 | ||
2136 | reg_pdev->dev.type = ®_device_type; | ||
2137 | |||
2121 | spin_lock_init(®_requests_lock); | 2138 | spin_lock_init(®_requests_lock); |
2122 | spin_lock_init(®_pending_beacons_lock); | 2139 | spin_lock_init(®_pending_beacons_lock); |
2123 | 2140 | ||
diff --git a/net/wireless/reg.h b/net/wireless/reg.h index c4695d07af23..b67d1c3a2fb9 100644 --- a/net/wireless/reg.h +++ b/net/wireless/reg.h | |||
@@ -8,6 +8,7 @@ bool reg_is_valid_request(const char *alpha2); | |||
8 | 8 | ||
9 | int regulatory_hint_user(const char *alpha2); | 9 | int regulatory_hint_user(const char *alpha2); |
10 | 10 | ||
11 | int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env); | ||
11 | void reg_device_remove(struct wiphy *wiphy); | 12 | void reg_device_remove(struct wiphy *wiphy); |
12 | 13 | ||
13 | int __init regulatory_init(void); | 14 | int __init regulatory_init(void); |