* [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory
@ 2009-01-22 23:05 Luis R. Rodriguez
2009-01-22 23:05 ` [PATCH 01/12] cfg80211: print correct intersected regulatory domain Luis R. Rodriguez
2009-01-25 16:24 ` [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory Johannes Berg
0 siblings, 2 replies; 15+ messages in thread
From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw)
To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless
This series contains a few fixes for cfg80211 such as another
fix for parsing country IEs, but mostly contains work to help
drivers build a more useful reg_notifier().
This new series handles strict regulatory settings by introducing
a wiphy->strict_regulatory setting. OLD_REGULATORY is left but
as can be seen it leaves room for cruft to build up.
Luis R. Rodriguez (12):
cfg80211: print correct intersected regulatory domain
cfg80211: add wiphy_apply_custom_regulatory()
cfg80211: export freq_reg_info()
cfg80211: Fix sanity check on 5 GHz when processing country IE
cfg80211: process user requests only after previous user/driver/core
requests
cfg80211: ignore consecutive equal regulatory hints
cfg80211: rename fw_handles_regulatory to custom_regulatory
cfg80211: move check for ignore_reg_update() on
wiphy_update_regulatory()
cfg80211: pass more detailed regulatory request information on
reg_notifier()
cfg80211: Allow for strict regulatory settings
mac80211: allow mac80211 drivers to get to struct ieee80211_hw from
wiphy
cfg80211: allow users to help a driver's compliance
drivers/net/wireless/iwlwifi/iwl-core.c | 2 +-
drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 +-
include/net/cfg80211.h | 45 ++++++
include/net/mac80211.h | 13 ++
include/net/wireless.h | 60 +++++++-
net/mac80211/util.c | 9 +
net/wireless/reg.c | 223 ++++++++++++++++++---------
net/wireless/reg.h | 7 -
8 files changed, 272 insertions(+), 89 deletions(-)
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH 01/12] cfg80211: print correct intersected regulatory domain 2009-01-22 23:05 [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 02/12] cfg80211: add wiphy_apply_custom_regulatory() Luis R. Rodriguez 2009-01-25 16:24 ` [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory Johannes Berg 1 sibling, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless When CONFIG_CFG80211_REG_DEBUG is enabled and an intersection occurs we are printing the regulatory domain passed by CRDA and indicating its the intersected regulatory domain. Lets fix this and print the intersection as originally intended. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Acked-by: Johannes Berg <johannes@sipsolutions.net> --- net/wireless/reg.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/net/wireless/reg.c b/net/wireless/reg.c index b34fd84..ec8b3d9 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -1332,7 +1332,7 @@ static void reg_country_ie_process_debug( if (intersected_rd) { printk(KERN_DEBUG "cfg80211: We intersect both of these " "and get:\n"); - print_regdomain_info(rd); + print_regdomain_info(intersected_rd); return; } printk(KERN_DEBUG "cfg80211: Intersection between both failed\n"); -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 02/12] cfg80211: add wiphy_apply_custom_regulatory() 2009-01-22 23:05 ` [PATCH 01/12] cfg80211: print correct intersected regulatory domain Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 03/12] cfg80211: export freq_reg_info() Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless This adds wiphy_apply_custom_regulatory() to be used by drivers prior to wiphy registration to apply a custom regulatory domain. This can be used by drivers that do not have a direct 1-1 mapping between a regulatory domain and a country. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- include/net/wireless.h | 17 +++++++ net/wireless/reg.c | 115 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 108 insertions(+), 24 deletions(-) diff --git a/include/net/wireless.h b/include/net/wireless.h index 9e73aae..585caad 100644 --- a/include/net/wireless.h +++ b/include/net/wireless.h @@ -401,4 +401,21 @@ extern void regulatory_hint(struct wiphy *wiphy, const char *alpha2); extern void regulatory_hint_11d(struct wiphy *wiphy, u8 *country_ie, u8 country_ie_len); + +/** + * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain + * @wiphy: the wireless device we want to process the regulatory domain on + * @regd: the custom regulatory domain to use for this wiphy + * + * Drivers can sometimes have custom regulatory domains which do not apply + * to a specific country. Drivers can use this to apply such custom regulatory + * domains. This routine must be called prior to wiphy registration. The + * custom regulatory domain will be trusted completely and as such previous + * default channel settings will be disregarded. If no rule is found for a + * channel on the regulatory domain the channel will be disabled. + */ +extern void wiphy_apply_custom_regulatory( + struct wiphy *wiphy, + const struct ieee80211_regdomain *regd); + #endif /* __NET_WIRELESS_H */ diff --git a/net/wireless/reg.c b/net/wireless/reg.c index ec8b3d9..2f2f6f5 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -782,36 +782,18 @@ static u32 map_regdom_flags(u32 rd_flags) return channel_flags; } -/** - * freq_reg_info - get regulatory information for the given frequency - * @wiphy: the wiphy for which we want to process this rule for - * @center_freq: Frequency in KHz for which we want regulatory information for - * @bandwidth: the bandwidth requirement you have in KHz, if you do not have one - * you can set this to 0. If this frequency is allowed we then set - * this value to the maximum allowed bandwidth. - * @reg_rule: the regulatory rule which we have for this frequency - * - * Use this function to get the regulatory rule for a specific frequency on - * a given wireless device. If the device has a specific regulatory domain - * it wants to follow we respect that unless a country IE has been received - * and processed already. - * - * Returns 0 if it was able to find a valid regulatory rule which does - * apply to the given center_freq otherwise it returns non-zero. It will - * also return -ERANGE if we determine the given center_freq does not even have - * a regulatory rule for a frequency range in the center_freq's band. See - * freq_in_rule_band() for our current definition of a band -- this is purely - * subjective and right now its 802.11 specific. - */ -static int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth, - const struct ieee80211_reg_rule **reg_rule) +static int freq_reg_info_regd(struct wiphy *wiphy, + u32 center_freq, + u32 *bandwidth, + const struct ieee80211_reg_rule **reg_rule, + const struct ieee80211_regdomain *custom_regd) { int i; bool band_rule_found = false; const struct ieee80211_regdomain *regd; u32 max_bandwidth = 0; - regd = cfg80211_regdomain; + regd = custom_regd ? custom_regd : cfg80211_regdomain; /* Follow the driver's regulatory domain, if present, unless a country * IE has been processed */ @@ -852,6 +834,34 @@ static int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth, return !max_bandwidth; } +/** + * freq_reg_info - get regulatory information for the given frequency + * @wiphy: the wiphy for which we want to process this rule for + * @center_freq: Frequency in KHz for which we want regulatory information for + * @bandwidth: the bandwidth requirement you have in KHz, if you do not have one + * you can set this to 0. If this frequency is allowed we then set + * this value to the maximum allowed bandwidth. + * @reg_rule: the regulatory rule which we have for this frequency + * + * Use this function to get the regulatory rule for a specific frequency on + * a given wireless device. If the device has a specific regulatory domain + * it wants to follow we respect that unless a country IE has been received + * and processed already. + * + * Returns 0 if it was able to find a valid regulatory rule which does + * apply to the given center_freq otherwise it returns non-zero. It will + * also return -ERANGE if we determine the given center_freq does not even have + * a regulatory rule for a frequency range in the center_freq's band. See + * freq_in_rule_band() for our current definition of a band -- this is purely + * subjective and right now its 802.11 specific. + */ +static int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth, + const struct ieee80211_reg_rule **reg_rule) +{ + return freq_reg_info_regd(wiphy, center_freq, + bandwidth, reg_rule, NULL); +} + static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band, unsigned int chan_idx) { @@ -962,6 +972,63 @@ void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby) wiphy->reg_notifier(wiphy, setby); } +static void handle_channel_custom(struct wiphy *wiphy, + enum ieee80211_band band, + unsigned int chan_idx, + const struct ieee80211_regdomain *regd) +{ + int r; + u32 max_bandwidth = 0; + const struct ieee80211_reg_rule *reg_rule = NULL; + const struct ieee80211_power_rule *power_rule = NULL; + struct ieee80211_supported_band *sband; + struct ieee80211_channel *chan; + + sband = wiphy->bands[band]; + BUG_ON(chan_idx >= sband->n_channels); + chan = &sband->channels[chan_idx]; + + r = freq_reg_info_regd(wiphy, MHZ_TO_KHZ(chan->center_freq), + &max_bandwidth, ®_rule, regd); + + if (r) { + chan->flags = IEEE80211_CHAN_DISABLED; + return; + } + + power_rule = ®_rule->power_rule; + + chan->flags |= map_regdom_flags(reg_rule->flags); + chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain); + chan->max_bandwidth = KHZ_TO_MHZ(max_bandwidth); + chan->max_power = (int) MBM_TO_DBM(power_rule->max_eirp); +} + +static void handle_band_custom(struct wiphy *wiphy, enum ieee80211_band band, + const struct ieee80211_regdomain *regd) +{ + unsigned int i; + struct ieee80211_supported_band *sband; + + BUG_ON(!wiphy->bands[band]); + sband = wiphy->bands[band]; + + for (i = 0; i < sband->n_channels; i++) + handle_channel_custom(wiphy, band, i, regd); +} + +/* Used by drivers prior to wiphy registration */ +void wiphy_apply_custom_regulatory(struct wiphy *wiphy, + const struct ieee80211_regdomain *regd) +{ + enum ieee80211_band band; + for (band = 0; band < IEEE80211_NUM_BANDS; band++) { + if (wiphy->bands[band]) + handle_band_custom(wiphy, band, regd); + } +} +EXPORT_SYMBOL(wiphy_apply_custom_regulatory); + static int reg_copy_regd(const struct ieee80211_regdomain **dst_regd, const struct ieee80211_regdomain *src_regd) { -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 03/12] cfg80211: export freq_reg_info() 2009-01-22 23:05 ` [PATCH 02/12] cfg80211: add wiphy_apply_custom_regulatory() Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 04/12] cfg80211: Fix sanity check on 5 GHz when processing country IE Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless This can be used by drivers on the reg_notifier() Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- include/net/wireless.h | 24 ++++++++++++++++++++++++ net/wireless/reg.c | 24 ++---------------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/include/net/wireless.h b/include/net/wireless.h index 585caad..a8971f6 100644 --- a/include/net/wireless.h +++ b/include/net/wireless.h @@ -418,4 +418,28 @@ extern void wiphy_apply_custom_regulatory( struct wiphy *wiphy, const struct ieee80211_regdomain *regd); +/** + * freq_reg_info - get regulatory information for the given frequency + * @wiphy: the wiphy for which we want to process this rule for + * @center_freq: Frequency in KHz for which we want regulatory information for + * @bandwidth: the bandwidth requirement you have in KHz, if you do not have one + * you can set this to 0. If this frequency is allowed we then set + * this value to the maximum allowed bandwidth. + * @reg_rule: the regulatory rule which we have for this frequency + * + * Use this function to get the regulatory rule for a specific frequency on + * a given wireless device. If the device has a specific regulatory domain + * it wants to follow we respect that unless a country IE has been received + * and processed already. + * + * Returns 0 if it was able to find a valid regulatory rule which does + * apply to the given center_freq otherwise it returns non-zero. It will + * also return -ERANGE if we determine the given center_freq does not even have + * a regulatory rule for a frequency range in the center_freq's band. See + * freq_in_rule_band() for our current definition of a band -- this is purely + * subjective and right now its 802.11 specific. + */ +extern int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth, + const struct ieee80211_reg_rule **reg_rule); + #endif /* __NET_WIRELESS_H */ diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 2f2f6f5..70691de 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -833,29 +833,9 @@ static int freq_reg_info_regd(struct wiphy *wiphy, return !max_bandwidth; } +EXPORT_SYMBOL(freq_reg_info); -/** - * freq_reg_info - get regulatory information for the given frequency - * @wiphy: the wiphy for which we want to process this rule for - * @center_freq: Frequency in KHz for which we want regulatory information for - * @bandwidth: the bandwidth requirement you have in KHz, if you do not have one - * you can set this to 0. If this frequency is allowed we then set - * this value to the maximum allowed bandwidth. - * @reg_rule: the regulatory rule which we have for this frequency - * - * Use this function to get the regulatory rule for a specific frequency on - * a given wireless device. If the device has a specific regulatory domain - * it wants to follow we respect that unless a country IE has been received - * and processed already. - * - * Returns 0 if it was able to find a valid regulatory rule which does - * apply to the given center_freq otherwise it returns non-zero. It will - * also return -ERANGE if we determine the given center_freq does not even have - * a regulatory rule for a frequency range in the center_freq's band. See - * freq_in_rule_band() for our current definition of a band -- this is purely - * subjective and right now its 802.11 specific. - */ -static int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth, +int freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 *bandwidth, const struct ieee80211_reg_rule **reg_rule) { return freq_reg_info_regd(wiphy, center_freq, -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 04/12] cfg80211: Fix sanity check on 5 GHz when processing country IE 2009-01-22 23:05 ` [PATCH 03/12] cfg80211: export freq_reg_info() Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 05/12] cfg80211: process user requests only after previous user/driver/core requests Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless This fixes two issues with the sanity check loop when processing the country IE: 1. Do not use frequency for the current subband channel check, this was a big fat typo. 2. Apply the 5 GHz 4-channel steps when considering max channel on each subband as was done with a recent patch. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- net/wireless/reg.c | 30 +++++++++++++++++++----------- 1 files changed, 19 insertions(+), 11 deletions(-) diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 70691de..c744788 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -498,6 +498,7 @@ static struct ieee80211_regdomain *country_ie_2_rd( * calculate the number of reg rules we will need. We will need one * for each channel subband */ while (country_ie_len >= 3) { + int end_channel = 0; struct ieee80211_country_ie_triplet *triplet = (struct ieee80211_country_ie_triplet *) country_ie; int cur_sub_max_channel = 0, cur_channel = 0; @@ -509,9 +510,25 @@ static struct ieee80211_regdomain *country_ie_2_rd( continue; } + /* 2 GHz */ + if (triplet->chans.first_channel <= 14) + end_channel = triplet->chans.first_channel + + triplet->chans.num_channels; + else + /* + * 5 GHz -- For example in country IEs if the first + * channel given is 36 and the number of channels is 4 + * then the individual channel numbers defined for the + * 5 GHz PHY by these parameters are: 36, 40, 44, and 48 + * and not 36, 37, 38, 39. + * + * See: http://tinyurl.com/11d-clarification + */ + end_channel = triplet->chans.first_channel + + (4 * (triplet->chans.num_channels - 1)); + cur_channel = triplet->chans.first_channel; - cur_sub_max_channel = ieee80211_channel_to_frequency( - cur_channel + triplet->chans.num_channels); + cur_sub_max_channel = end_channel; /* Basic sanity check */ if (cur_sub_max_channel < cur_channel) @@ -590,15 +607,6 @@ static struct ieee80211_regdomain *country_ie_2_rd( end_channel = triplet->chans.first_channel + triplet->chans.num_channels; else - /* - * 5 GHz -- For example in country IEs if the first - * channel given is 36 and the number of channels is 4 - * then the individual channel numbers defined for the - * 5 GHz PHY by these parameters are: 36, 40, 44, and 48 - * and not 36, 37, 38, 39. - * - * See: http://tinyurl.com/11d-clarification - */ end_channel = triplet->chans.first_channel + (4 * (triplet->chans.num_channels - 1)); -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 05/12] cfg80211: process user requests only after previous user/driver/core requests 2009-01-22 23:05 ` [PATCH 04/12] cfg80211: Fix sanity check on 5 GHz when processing country IE Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 06/12] cfg80211: ignore consecutive equal regulatory hints Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless This prevents user regulatory changes to be considered prior to previous pending user, core or driver requests which have not be applied. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- net/wireless/reg.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/net/wireless/reg.c b/net/wireless/reg.c index c744788..1ff1a05 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -1099,6 +1099,16 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by, if (last_request->initiator == REGDOM_SET_BY_USER && last_request->intersect) return -EOPNOTSUPP; + /* Process user requests only after previous user/driver/core + * requests have been processed */ + if (last_request->initiator == REGDOM_SET_BY_CORE || + last_request->initiator == REGDOM_SET_BY_DRIVER || + last_request->initiator == REGDOM_SET_BY_USER) { + if (!alpha2_equal(last_request->alpha2, + cfg80211_regdomain->alpha2)) + return -EAGAIN; + } + return 0; } -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 06/12] cfg80211: ignore consecutive equal regulatory hints 2009-01-22 23:05 ` [PATCH 05/12] cfg80211: process user requests only after previous user/driver/core requests Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 07/12] cfg80211: rename fw_handles_regulatory to custom_regulatory Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless We ignore regulatory hints for the same alpha2 if we already have processed the same alpha2 on the current regulatory domain. For a driver regulatory_hint() this means we copy onto its wiphy->regd the previously procesed regulatory domain from CRDA without having to call CRDA again. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- net/wireless/reg.c | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 1ff1a05..421c5b3 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -1088,8 +1088,13 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by, } return REG_INTERSECT; case REGDOM_SET_BY_DRIVER: - if (last_request->initiator == REGDOM_SET_BY_CORE) - return 0; + if (last_request->initiator == REGDOM_SET_BY_CORE) { + if (is_old_static_regdom(cfg80211_regdomain)) + return 0; + if (!alpha2_equal(cfg80211_regdomain->alpha2, alpha2)) + return 0; + return -EALREADY; + } return REG_INTERSECT; case REGDOM_SET_BY_USER: if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE) @@ -1109,6 +1114,10 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by, return -EAGAIN; } + if (!is_old_static_regdom(cfg80211_regdomain) && + alpha2_equal(cfg80211_regdomain->alpha2, alpha2)) + return -EALREADY; + return 0; } -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 07/12] cfg80211: rename fw_handles_regulatory to custom_regulatory 2009-01-22 23:05 ` [PATCH 06/12] cfg80211: ignore consecutive equal regulatory hints Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 08/12] cfg80211: move check for ignore_reg_update() on wiphy_update_regulatory() Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless Drivers without firmware can also have custom regulatory maps which do not map to a specific ISO / IEC alpha2 country code. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- drivers/net/wireless/iwlwifi/iwl-core.c | 2 +- drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 +- include/net/wireless.h | 6 +++--- net/wireless/reg.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index d2ef3e1..1d568ac 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c @@ -811,7 +811,7 @@ int iwl_setup_mac(struct iwl_priv *priv) BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC); - hw->wiphy->fw_handles_regulatory = true; + hw->wiphy->custom_regulatory = true; /* Default value; 4 EDCA QOS priorities */ hw->queues = 4; diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index c9f6f8e..b48ee3f 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c @@ -7039,7 +7039,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC); - hw->wiphy->fw_handles_regulatory = true; + hw->wiphy->custom_regulatory = true; /* 4 EDCA QOS priorities */ hw->queues = 4; diff --git a/include/net/wireless.h b/include/net/wireless.h index a8971f6..438cba9 100644 --- a/include/net/wireless.h +++ b/include/net/wireless.h @@ -181,8 +181,8 @@ struct ieee80211_supported_band { * struct wiphy - wireless hardware description * @idx: the wiphy index assigned to this item * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name> - * @fw_handles_regulatory: tells us the firmware for this device - * has its own regulatory solution and cannot identify the + * @custom_regulatory: tells us the driver for this device + * has its own custom regulatory domain and cannot identify the * ISO / IEC 3166 alpha2 it belongs to. When this is enabled * we will disregard the first regulatory hint (when the * initiator is %REGDOM_SET_BY_CORE). @@ -201,7 +201,7 @@ struct wiphy { /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ u16 interface_modes; - bool fw_handles_regulatory; + bool custom_regulatory; /* If multiple wiphys are registered and you're handed e.g. * a regular netdev with assigned ieee80211_ptr, you won't diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 421c5b3..2a94dc0 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -935,7 +935,7 @@ static bool ignore_reg_update(struct wiphy *wiphy, enum reg_set_by setby) if (!last_request) return true; if (setby == REGDOM_SET_BY_CORE && - wiphy->fw_handles_regulatory) + wiphy->custom_regulatory) return true; return false; } -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 08/12] cfg80211: move check for ignore_reg_update() on wiphy_update_regulatory() 2009-01-22 23:05 ` [PATCH 07/12] cfg80211: rename fw_handles_regulatory to custom_regulatory Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 09/12] cfg80211: pass more detailed regulatory request information on reg_notifier() Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless This ensures that the initial REGDOM_SET_BY_CORE upon wiphy registration respects the wiphy->custom_regulatory setting. Without this and if OLD_REG is disabled (which will be default soon as we remove it) the wiphy->custom_regulatory is simply ignored. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Acked-by: Johannes Berg <johannes@sipsolutions.net> --- net/wireless/reg.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 2a94dc0..a362c87 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -945,13 +945,15 @@ static void update_all_wiphy_regulatory(enum reg_set_by setby) struct cfg80211_registered_device *drv; list_for_each_entry(drv, &cfg80211_drv_list, list) - if (!ignore_reg_update(&drv->wiphy, setby)) - wiphy_update_regulatory(&drv->wiphy, setby); + wiphy_update_regulatory(&drv->wiphy, setby); } void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby) { enum ieee80211_band band; + + if (ignore_reg_update(wiphy, setby)) + return; for (band = 0; band < IEEE80211_NUM_BANDS; band++) { if (wiphy->bands[band]) handle_band(wiphy, band); -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 09/12] cfg80211: pass more detailed regulatory request information on reg_notifier() 2009-01-22 23:05 ` [PATCH 08/12] cfg80211: move check for ignore_reg_update() on wiphy_update_regulatory() Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 10/12] cfg80211: Allow for strict regulatory settings Luis R. Rodriguez 0 siblings, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless Drivers may need more information than just who set the last regulatory domain, as such lets just pass the last regulatory_request receipt. To do this we need to move out to headers struct regulatory_request, and enum environment_cap. While at it lets add documentation for enum environment_cap. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- include/net/cfg80211.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ include/net/wireless.h | 3 ++- net/wireless/reg.c | 34 +--------------------------------- net/wireless/reg.h | 7 ------- 4 files changed, 48 insertions(+), 41 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index f19c3e1..dd1fd51 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -357,6 +357,51 @@ enum reg_set_by { REGDOM_SET_BY_COUNTRY_IE, }; +/** + * 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 - receipt of last regulatory request + * + * @wiphy: 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 reg_set_by, %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 + * @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 + */ +struct regulatory_request { + struct wiphy *wiphy; + enum reg_set_by initiator; + char alpha2[2]; + bool intersect; + u32 country_ie_checksum; + enum environment_cap country_ie_env; +}; + struct ieee80211_freq_range { u32 start_freq_khz; u32 end_freq_khz; diff --git a/include/net/wireless.h b/include/net/wireless.h index 438cba9..fbe7341 100644 --- a/include/net/wireless.h +++ b/include/net/wireless.h @@ -213,7 +213,8 @@ struct wiphy { struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS]; /* Lets us get back the wiphy on the callback */ - int (*reg_notifier)(struct wiphy *wiphy, enum reg_set_by setby); + int (*reg_notifier)(struct wiphy *wiphy, + struct regulatory_request *request); /* fields below are read-only, assigned by cfg80211 */ diff --git a/net/wireless/reg.c b/net/wireless/reg.c index a362c87..57a3fb4 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -42,38 +42,6 @@ #include "core.h" #include "reg.h" -/** - * struct regulatory_request - receipt of last regulatory request - * - * @wiphy: 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 reg_set_by, %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 - * @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 - */ -struct regulatory_request { - struct wiphy *wiphy; - enum reg_set_by initiator; - char alpha2[2]; - bool intersect; - u32 country_ie_checksum; - enum environment_cap country_ie_env; -}; - /* Receipt of information from last regulatory request */ static struct regulatory_request *last_request; @@ -959,7 +927,7 @@ void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby) handle_band(wiphy, band); } if (wiphy->reg_notifier) - wiphy->reg_notifier(wiphy, setby); + wiphy->reg_notifier(wiphy, last_request); } static void handle_channel_custom(struct wiphy *wiphy, diff --git a/net/wireless/reg.h b/net/wireless/reg.h index a76ea3f..eb1dd5b 100644 --- a/net/wireless/reg.h +++ b/net/wireless/reg.h @@ -11,13 +11,6 @@ void regulatory_exit(void); int set_regdom(const struct ieee80211_regdomain *rd); -enum environment_cap { - ENVIRON_ANY, - ENVIRON_INDOOR, - ENVIRON_OUTDOOR, -}; - - /** * __regulatory_hint - hint to the wireless core a regulatory domain * @wiphy: if the hint comes from country information from an AP, this -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 10/12] cfg80211: Allow for strict regulatory settings 2009-01-22 23:05 ` [PATCH 09/12] cfg80211: pass more detailed regulatory request information on reg_notifier() Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 11/12] mac80211: allow mac80211 drivers to get to struct ieee80211_hw from wiphy Luis R. Rodriguez 2009-01-25 16:23 ` [PATCH 10/12] cfg80211: Allow for strict regulatory settings Johannes Berg 0 siblings, 2 replies; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless This allows drivers to request strict regulatory settings to be applied to its devices. This is desirable for devices where proper calibration and compliance can only be gauranteed for for the device's programmed regulatory domain. Regulatory domain settings will be ignored until the device's own regulatory domain is properly configured. If no regulatory domain is received only the world regulatory domain will be applied -- if OLD_REG (default to "US") is not enabled. If OLD_REG behaviour is not acceptable to drivers they must update their wiphy with a custom reuglatory prior to wiphy registration. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- include/net/wireless.h | 10 ++++++++++ net/wireless/reg.c | 28 +++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletions(-) diff --git a/include/net/wireless.h b/include/net/wireless.h index fbe7341..f2af156 100644 --- a/include/net/wireless.h +++ b/include/net/wireless.h @@ -186,6 +186,15 @@ struct ieee80211_supported_band { * ISO / IEC 3166 alpha2 it belongs to. When this is enabled * we will disregard the first regulatory hint (when the * initiator is %REGDOM_SET_BY_CORE). + * @strict_regulatory: tells us the driver for this device will ignore + * regulatory domain settings until it gets its own regulatory domain + * via its regulatory_hint(). After its gets its own regulatory domain + * it will only allow further regulatory domain settings to further + * enhance compliance. For example if channel 13 and 14 are disabled + * by this regulatory domain no user regulatory domain can enable these + * channels at a later time. This can be used for devices which do not + * have calibration information gauranteed for frequencies or settings + * outside of its regulatory domain. * @reg_notifier: the driver's regulatory notification callback * @regd: the driver's regulatory domain, if one was requested via * the regulatory_hint() API. This can be used by the driver @@ -202,6 +211,7 @@ struct wiphy { u16 interface_modes; bool custom_regulatory; + bool strict_regulatory; /* If multiple wiphys are registered and you're handed e.g. * a regular netdev with assigned ieee80211_ptr, you won't diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 57a3fb4..2da5427 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -875,6 +875,22 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band, power_rule = ®_rule->power_rule; + if (last_request->initiator == REGDOM_SET_BY_DRIVER && + last_request->wiphy && last_request->wiphy == wiphy && + last_request->wiphy->strict_regulatory) { + /* This gaurantees the driver's requested regulatory domain + * will always be used as a base for further regulatory + * settings */ + chan->flags = chan->orig_flags = + map_regdom_flags(reg_rule->flags); + chan->max_antenna_gain = chan->orig_mag = + (int) MBI_TO_DBI(power_rule->max_antenna_gain); + chan->max_bandwidth = KHZ_TO_MHZ(max_bandwidth); + chan->max_power = chan->orig_mpwr = + (int) MBM_TO_DBM(power_rule->max_eirp); + return; + } + chan->flags = flags | map_regdom_flags(reg_rule->flags); chan->max_antenna_gain = min(chan->orig_mag, (int) MBI_TO_DBI(power_rule->max_antenna_gain)); @@ -905,6 +921,11 @@ static bool ignore_reg_update(struct wiphy *wiphy, enum reg_set_by setby) if (setby == REGDOM_SET_BY_CORE && wiphy->custom_regulatory) return true; + /* wiphy->regd will be set once the device has its own + * desired regulatory domain set */ + if (wiphy->strict_regulatory && !wiphy->regd && + !is_world_regdom(last_request->alpha2)) + return true; return false; } @@ -1163,10 +1184,15 @@ new_request: void regulatory_hint(struct wiphy *wiphy, const char *alpha2) { + int r; BUG_ON(!alpha2); mutex_lock(&cfg80211_drv_mutex); - __regulatory_hint(wiphy, REGDOM_SET_BY_DRIVER, alpha2, 0, ENVIRON_ANY); + r = __regulatory_hint(wiphy, REGDOM_SET_BY_DRIVER, + alpha2, 0, ENVIRON_ANY); + /* This is required so that the orig_* parameters are saved */ + if (r == -EALREADY && wiphy->strict_regulatory) + wiphy_update_regulatory(wiphy, REGDOM_SET_BY_DRIVER); mutex_unlock(&cfg80211_drv_mutex); } EXPORT_SYMBOL(regulatory_hint); -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 11/12] mac80211: allow mac80211 drivers to get to struct ieee80211_hw from wiphy 2009-01-22 23:05 ` [PATCH 10/12] cfg80211: Allow for strict regulatory settings Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 12/12] cfg80211: allow users to help a driver's compliance Luis R. Rodriguez 2009-01-25 16:23 ` [PATCH 10/12] cfg80211: Allow for strict regulatory settings Johannes Berg 1 sibling, 1 reply; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless If a driver is given a wiphy and it wants to get to its private mac80211 driver area it can use wiphy_to_ieee80211_hw() to get first to its ieee80211_hw and then access the private structure via hw->priv. The wiphy_priv() is already being used internally by mac80211 and drivers should not use this. This can be helpful in a drivers reg_notifier(). Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Acked-by: Johannes Berg <johannes@sipsolutions.net> --- include/net/mac80211.h | 13 +++++++++++++ net/mac80211/util.c | 9 +++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 9a5869e..b29c41b 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -965,6 +965,19 @@ struct ieee80211_hw { }; /** + * wiphy_to_ieee80211_hw - return a mac80211 driver hw struct from a wiphy + * + * @wiphy: the &struct wiphy which we want to query + * + * mac80211 drivers can use this to get to their respective + * &struct ieee80211_hw. Drivers wishing to get to their own private + * structure can then access it via hw->priv. Note that mac802111 drivers should + * not use wiphy_priv() to try to get their private driver structure as this + * is already used internally by mac80211. + */ +struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy); + +/** * SET_IEEE80211_DEV - set device for 802.11 hardware * * @hw: the &struct ieee80211_hw to set the device for diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 3f559e3..412a04c 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -41,6 +41,15 @@ const unsigned char rfc1042_header[] __aligned(2) = const unsigned char bridge_tunnel_header[] __aligned(2) = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; +struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy) +{ + struct ieee80211_local *local; + BUG_ON(!wiphy); + + local = wiphy_priv(wiphy); + return &local->hw; +} +EXPORT_SYMBOL(wiphy_to_ieee80211_hw); u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len, enum nl80211_iftype type) -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 12/12] cfg80211: allow users to help a driver's compliance 2009-01-22 23:05 ` [PATCH 11/12] mac80211: allow mac80211 drivers to get to struct ieee80211_hw from wiphy Luis R. Rodriguez @ 2009-01-22 23:05 ` Luis R. Rodriguez 0 siblings, 0 replies; 15+ messages in thread From: Luis R. Rodriguez @ 2009-01-22 23:05 UTC (permalink / raw) To: johannes, johannes, linville; +Cc: Luis R. Rodriguez, linux-wireless Let users be more compliant if so desired. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> --- net/wireless/reg.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 2da5427..f643d39 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -772,8 +772,9 @@ static int freq_reg_info_regd(struct wiphy *wiphy, regd = custom_regd ? custom_regd : cfg80211_regdomain; /* Follow the driver's regulatory domain, if present, unless a country - * IE has been processed */ + * IE has been processed or a user wants to help complaince further */ if (last_request->initiator != REGDOM_SET_BY_COUNTRY_IE && + last_request->initiator != REGDOM_SET_BY_USER && wiphy->regd) regd = wiphy->regd; -- 1.6.1.rc3.51.g5832d ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 10/12] cfg80211: Allow for strict regulatory settings 2009-01-22 23:05 ` [PATCH 10/12] cfg80211: Allow for strict regulatory settings Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 11/12] mac80211: allow mac80211 drivers to get to struct ieee80211_hw from wiphy Luis R. Rodriguez @ 2009-01-25 16:23 ` Johannes Berg 1 sibling, 0 replies; 15+ messages in thread From: Johannes Berg @ 2009-01-25 16:23 UTC (permalink / raw) To: Luis R. Rodriguez; +Cc: linville, linux-wireless [-- Attachment #1: Type: text/plain, Size: 306 bytes --] On Thu, 2009-01-22 at 15:05 -0800, Luis R. Rodriguez wrote: > This allows drivers to request strict regulatory settings to > be applied to its devices. This is desirable for devices where > proper calibration and compliance can only be gauranteed for You typoed "guaranteed" all over :) johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory 2009-01-22 23:05 [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 01/12] cfg80211: print correct intersected regulatory domain Luis R. Rodriguez @ 2009-01-25 16:24 ` Johannes Berg 1 sibling, 0 replies; 15+ messages in thread From: Johannes Berg @ 2009-01-25 16:24 UTC (permalink / raw) To: Luis R. Rodriguez; +Cc: linville, linux-wireless [-- Attachment #1: Type: text/plain, Size: 587 bytes --] On Thu, 2009-01-22 at 15:05 -0800, Luis R. Rodriguez wrote: > This series contains a few fixes for cfg80211 such as another > fix for parsing country IEs, but mostly contains work to help > drivers build a more useful reg_notifier(). > > This new series handles strict regulatory settings by introducing > a wiphy->strict_regulatory setting. OLD_REGULATORY is left but > as can be seen it leaves room for cruft to build up. I'm not sure I agree with all of this, it seems a little restrictive, but the code changes seem ok to me now, thanks for bearing with me. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2009-01-25 16:24 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-01-22 23:05 [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 01/12] cfg80211: print correct intersected regulatory domain Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 02/12] cfg80211: add wiphy_apply_custom_regulatory() Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 03/12] cfg80211: export freq_reg_info() Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 04/12] cfg80211: Fix sanity check on 5 GHz when processing country IE Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 05/12] cfg80211: process user requests only after previous user/driver/core requests Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 06/12] cfg80211: ignore consecutive equal regulatory hints Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 07/12] cfg80211: rename fw_handles_regulatory to custom_regulatory Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 08/12] cfg80211: move check for ignore_reg_update() on wiphy_update_regulatory() Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 09/12] cfg80211: pass more detailed regulatory request information on reg_notifier() Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 10/12] cfg80211: Allow for strict regulatory settings Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 11/12] mac80211: allow mac80211 drivers to get to struct ieee80211_hw from wiphy Luis R. Rodriguez 2009-01-22 23:05 ` [PATCH 12/12] cfg80211: allow users to help a driver's compliance Luis R. Rodriguez 2009-01-25 16:23 ` [PATCH 10/12] cfg80211: Allow for strict regulatory settings Johannes Berg 2009-01-25 16:24 ` [PATCH 00/12] cfg80211/mac80211: few fixes/enhancements for regulatory Johannes Berg
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox