diff options
author | Luis R. Rodriguez <lrodriguez@atheros.com> | 2008-09-10 02:19:48 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-09-15 16:48:19 -0400 |
commit | b2e1b30290539b344cbaff0d9da38012e03aa347 (patch) | |
tree | 8d021d078c12f3d7b47da4b52a54eff4509daa98 /include/net/wireless.h | |
parent | 63f2c0464875b6ef2132cecb19b2a5abbf061227 (diff) |
cfg80211: Add new wireless regulatory infrastructure
This adds the new wireless regulatory infrastructure. The
main motiviation behind this was to centralize regulatory
code as each driver was implementing their own regulatory solution,
and to replace the initial centralized code we have where:
* only 3 regulatory domains are supported: US, JP and EU
* regulatory domains can only be changed through module parameter
* all rules were built statically in the kernel
We now have support for regulatory domains for many countries
and regulatory domains are now queried through a userspace agent
through udev allowing distributions to update regulatory rules
without updating the kernel.
Each driver can regulatory_hint() a regulatory domain
based on either their EEPROM mapped regulatory domain value to a
respective ISO/IEC 3166-1 country code or pass an internally built
regulatory domain. We also add support to let the user set the
regulatory domain through userspace in case of faulty EEPROMs to
further help compliance.
Support for world roaming will be added soon for cards capable of
this.
For more information see:
http://wireless.kernel.org/en/developers/Regulatory/CRDA
For now we leave an option to enable the old module parameter,
ieee80211_regdom, and to build the 3 old regdomains statically
(US, JP and EU). This option is CONFIG_WIRELESS_OLD_REGULATORY.
These old static definitions and the module parameter is being
scheduled for removal for 2.6.29. Note that if you use this
you won't make use of a world regulatory domain as its pointless.
If you leave this option enabled and if CRDA is present and you
use US or JP we will try to ask CRDA to update us a regulatory
domain for us.
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'include/net/wireless.h')
-rw-r--r-- | include/net/wireless.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/include/net/wireless.h b/include/net/wireless.h index 1dc8ec3daa2f..e4378cc6bf8e 100644 --- a/include/net/wireless.h +++ b/include/net/wireless.h | |||
@@ -60,6 +60,7 @@ enum ieee80211_channel_flags { | |||
60 | * with cfg80211. | 60 | * with cfg80211. |
61 | * | 61 | * |
62 | * @center_freq: center frequency in MHz | 62 | * @center_freq: center frequency in MHz |
63 | * @max_bandwidth: maximum allowed bandwidth for this channel, in MHz | ||
63 | * @hw_value: hardware-specific value for the channel | 64 | * @hw_value: hardware-specific value for the channel |
64 | * @flags: channel flags from &enum ieee80211_channel_flags. | 65 | * @flags: channel flags from &enum ieee80211_channel_flags. |
65 | * @orig_flags: channel flags at registration time, used by regulatory | 66 | * @orig_flags: channel flags at registration time, used by regulatory |
@@ -73,6 +74,7 @@ enum ieee80211_channel_flags { | |||
73 | struct ieee80211_channel { | 74 | struct ieee80211_channel { |
74 | enum ieee80211_band band; | 75 | enum ieee80211_band band; |
75 | u16 center_freq; | 76 | u16 center_freq; |
77 | u8 max_bandwidth; | ||
76 | u16 hw_value; | 78 | u16 hw_value; |
77 | u32 flags; | 79 | u32 flags; |
78 | int max_antenna_gain; | 80 | int max_antenna_gain; |
@@ -178,6 +180,7 @@ struct ieee80211_supported_band { | |||
178 | * struct wiphy - wireless hardware description | 180 | * struct wiphy - wireless hardware description |
179 | * @idx: the wiphy index assigned to this item | 181 | * @idx: the wiphy index assigned to this item |
180 | * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name> | 182 | * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name> |
183 | * @reg_notifier: the driver's regulatory notification callback | ||
181 | */ | 184 | */ |
182 | struct wiphy { | 185 | struct wiphy { |
183 | /* assign these fields before you register the wiphy */ | 186 | /* assign these fields before you register the wiphy */ |
@@ -197,6 +200,9 @@ struct wiphy { | |||
197 | 200 | ||
198 | struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS]; | 201 | struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS]; |
199 | 202 | ||
203 | /* Lets us get back the wiphy on the callback */ | ||
204 | int (*reg_notifier)(struct wiphy *wiphy, enum reg_set_by setby); | ||
205 | |||
200 | /* fields below are read-only, assigned by cfg80211 */ | 206 | /* fields below are read-only, assigned by cfg80211 */ |
201 | 207 | ||
202 | /* the item in /sys/class/ieee80211/ points to this, | 208 | /* the item in /sys/class/ieee80211/ points to this, |
@@ -322,6 +328,58 @@ extern int ieee80211_frequency_to_channel(int freq); | |||
322 | */ | 328 | */ |
323 | extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy, | 329 | extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy, |
324 | int freq); | 330 | int freq); |
331 | /** | ||
332 | * __regulatory_hint - hint to the wireless core a regulatory domain | ||
333 | * @wiphy: if a driver is providing the hint this is the driver's very | ||
334 | * own &struct wiphy | ||
335 | * @alpha2: the ISO/IEC 3166 alpha2 being claimed the regulatory domain | ||
336 | * should be in. If @rd is set this should be NULL | ||
337 | * @rd: a complete regulatory domain, if passed the caller need not worry | ||
338 | * about freeing it | ||
339 | * | ||
340 | * The Wireless subsystem can use this function to hint to the wireless core | ||
341 | * what it believes should be the current regulatory domain by | ||
342 | * giving it an ISO/IEC 3166 alpha2 country code it knows its regulatory | ||
343 | * domain should be in or by providing a completely build regulatory domain. | ||
344 | * | ||
345 | * Returns -EALREADY if *a regulatory domain* has already been set. Note that | ||
346 | * this could be by another driver. It is safe for drivers to continue if | ||
347 | * -EALREADY is returned, if drivers are not capable of world roaming they | ||
348 | * should not register more channels than they support. Right now we only | ||
349 | * support listening to the first driver hint. If the driver is capable | ||
350 | * of world roaming but wants to respect its own EEPROM mappings for | ||
351 | * specific regulatory domains it should register the @reg_notifier callback | ||
352 | * on the &struct wiphy. Returns 0 if the hint went through fine or through an | ||
353 | * intersection operation. Otherwise a standard error code is returned. | ||
354 | * | ||
355 | */ | ||
356 | extern int __regulatory_hint(struct wiphy *wiphy, enum reg_set_by set_by, | ||
357 | const char *alpha2, struct ieee80211_regdomain *rd); | ||
358 | /** | ||
359 | * regulatory_hint - driver hint to the wireless core a regulatory domain | ||
360 | * @wiphy: the driver's very own &struct wiphy | ||
361 | * @alpha2: the ISO/IEC 3166 alpha2 the driver claims its regulatory domain | ||
362 | * should be in. If @rd is set this should be NULL. Note that if you | ||
363 | * set this to NULL you should still set rd->alpha2 to some accepted | ||
364 | * alpha2. | ||
365 | * @rd: a complete regulatory domain provided by the driver. If passed | ||
366 | * the driver does not need to worry about freeing it. | ||
367 | * | ||
368 | * Wireless drivers can use this function to hint to the wireless core | ||
369 | * what it believes should be the current regulatory domain by | ||
370 | * giving it an ISO/IEC 3166 alpha2 country code it knows its regulatory | ||
371 | * domain should be in or by providing a completely build regulatory domain. | ||
372 | * If the driver provides an ISO/IEC 3166 alpha2 userspace will be queried | ||
373 | * for a regulatory domain structure for the respective country. If | ||
374 | * a regulatory domain is build and passed you should set the alpha2 | ||
375 | * if possible, otherwise set it to the special value of "99" which tells | ||
376 | * the wireless core it is unknown. If you pass a built regulatory domain | ||
377 | * and we return non zero you are in charge of kfree()'ing the structure. | ||
378 | * | ||
379 | * See __regulatory_hint() documentation for possible return values. | ||
380 | */ | ||
381 | extern int regulatory_hint(struct wiphy *wiphy, | ||
382 | const char *alpha2, struct ieee80211_regdomain *rd); | ||
325 | 383 | ||
326 | /** | 384 | /** |
327 | * ieee80211_get_channel - get channel struct from wiphy for specified frequency | 385 | * ieee80211_get_channel - get channel struct from wiphy for specified frequency |