aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/wireless.h
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2008-09-10 02:19:48 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-09-15 16:48:19 -0400
commitb2e1b30290539b344cbaff0d9da38012e03aa347 (patch)
tree8d021d078c12f3d7b47da4b52a54eff4509daa98 /include/net/wireless.h
parent63f2c0464875b6ef2132cecb19b2a5abbf061227 (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.h58
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 {
73struct ieee80211_channel { 74struct 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 */
182struct wiphy { 185struct 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 */
323extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy, 329extern 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 */
356extern 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 */
381extern 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