mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 14:41:39 +00:00
09d989d179
This adds a new regulatory hint to be used when we know all devices have been disconnected and idle. This can happen when we suspend, for instance. When we disconnect we can no longer assume the same regulatory rules learned from a country IE or beacon hints are applicable so restore regulatory settings to an initial state. Since driver hints are cached on the wiphy that called the hint, those hints are not reproduced onto cfg80211 as the wiphy will respect its own wiphy->regd regardless. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
103 lines
3.1 KiB
C
103 lines
3.1 KiB
C
#ifndef __NET_REGULATORY_H
|
|
#define __NET_REGULATORY_H
|
|
/*
|
|
* regulatory support structures
|
|
*
|
|
* Copyright 2008-2009 Luis R. Rodriguez <lrodriguez@atheros.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
|
|
/**
|
|
* enum environment_cap - Environment parsed from country IE
|
|
* @ENVIRON_ANY: indicates country IE applies to both indoor and
|
|
* outdoor operation.
|
|
* @ENVIRON_INDOOR: indicates country IE applies only to indoor operation
|
|
* @ENVIRON_OUTDOOR: indicates country IE applies only to outdoor operation
|
|
*/
|
|
enum environment_cap {
|
|
ENVIRON_ANY,
|
|
ENVIRON_INDOOR,
|
|
ENVIRON_OUTDOOR,
|
|
};
|
|
|
|
/**
|
|
* struct regulatory_request - used to keep track of regulatory requests
|
|
*
|
|
* @wiphy_idx: this is set if this request's initiator is
|
|
* %REGDOM_SET_BY_COUNTRY_IE or %REGDOM_SET_BY_DRIVER. This
|
|
* can be used by the wireless core to deal with conflicts
|
|
* and potentially inform users of which devices specifically
|
|
* cased the conflicts.
|
|
* @initiator: indicates who sent this request, could be any of
|
|
* of those set in nl80211_reg_initiator (%NL80211_REGDOM_SET_BY_*)
|
|
* @alpha2: the ISO / IEC 3166 alpha2 country code of the requested
|
|
* regulatory domain. We have a few special codes:
|
|
* 00 - World regulatory domain
|
|
* 99 - built by driver but a specific alpha2 cannot be determined
|
|
* 98 - result of an intersection between two regulatory domains
|
|
* 97 - regulatory domain has not yet been configured
|
|
* @intersect: indicates whether the wireless core should intersect
|
|
* the requested regulatory domain with the presently set regulatory
|
|
* domain.
|
|
* @country_ie_checksum: checksum of the last processed and accepted
|
|
* country IE
|
|
* @country_ie_env: lets us know if the AP is telling us we are outdoor,
|
|
* indoor, or if it doesn't matter
|
|
* @list: used to insert into the reg_requests_list linked list
|
|
*/
|
|
struct regulatory_request {
|
|
int wiphy_idx;
|
|
enum nl80211_reg_initiator initiator;
|
|
char alpha2[2];
|
|
bool intersect;
|
|
u32 country_ie_checksum;
|
|
enum environment_cap country_ie_env;
|
|
struct list_head list;
|
|
};
|
|
|
|
struct ieee80211_freq_range {
|
|
u32 start_freq_khz;
|
|
u32 end_freq_khz;
|
|
u32 max_bandwidth_khz;
|
|
};
|
|
|
|
struct ieee80211_power_rule {
|
|
u32 max_antenna_gain;
|
|
u32 max_eirp;
|
|
};
|
|
|
|
struct ieee80211_reg_rule {
|
|
struct ieee80211_freq_range freq_range;
|
|
struct ieee80211_power_rule power_rule;
|
|
u32 flags;
|
|
};
|
|
|
|
struct ieee80211_regdomain {
|
|
u32 n_reg_rules;
|
|
char alpha2[2];
|
|
struct ieee80211_reg_rule reg_rules[];
|
|
};
|
|
|
|
#define MHZ_TO_KHZ(freq) ((freq) * 1000)
|
|
#define KHZ_TO_MHZ(freq) ((freq) / 1000)
|
|
#define DBI_TO_MBI(gain) ((gain) * 100)
|
|
#define MBI_TO_DBI(gain) ((gain) / 100)
|
|
#define DBM_TO_MBM(gain) ((gain) * 100)
|
|
#define MBM_TO_DBM(gain) ((gain) / 100)
|
|
|
|
#define REG_RULE(start, end, bw, gain, eirp, reg_flags) \
|
|
{ \
|
|
.freq_range.start_freq_khz = MHZ_TO_KHZ(start), \
|
|
.freq_range.end_freq_khz = MHZ_TO_KHZ(end), \
|
|
.freq_range.max_bandwidth_khz = MHZ_TO_KHZ(bw), \
|
|
.power_rule.max_antenna_gain = DBI_TO_MBI(gain),\
|
|
.power_rule.max_eirp = DBM_TO_MBM(eirp), \
|
|
.flags = reg_flags, \
|
|
}
|
|
|
|
#endif
|