|
@@ -213,7 +213,7 @@ static void reset_regdomains(bool full_reset)
|
|
|
*/
|
|
|
static void update_world_regdomain(const struct ieee80211_regdomain *rd)
|
|
|
{
|
|
|
- BUG_ON(!last_request);
|
|
|
+ WARN_ON(!last_request);
|
|
|
|
|
|
reset_regdomains(false);
|
|
|
|
|
@@ -804,8 +804,7 @@ static void chan_reg_rule_print_dbg(struct ieee80211_channel *chan,
|
|
|
*/
|
|
|
static void handle_channel(struct wiphy *wiphy,
|
|
|
enum nl80211_reg_initiator initiator,
|
|
|
- enum ieee80211_band band,
|
|
|
- unsigned int chan_idx)
|
|
|
+ struct ieee80211_channel *chan)
|
|
|
{
|
|
|
int r;
|
|
|
u32 flags, bw_flags = 0;
|
|
@@ -813,18 +812,12 @@ static void handle_channel(struct wiphy *wiphy,
|
|
|
const struct ieee80211_reg_rule *reg_rule = NULL;
|
|
|
const struct ieee80211_power_rule *power_rule = NULL;
|
|
|
const struct ieee80211_freq_range *freq_range = NULL;
|
|
|
- struct ieee80211_supported_band *sband;
|
|
|
- struct ieee80211_channel *chan;
|
|
|
struct wiphy *request_wiphy = NULL;
|
|
|
|
|
|
assert_cfg80211_lock();
|
|
|
|
|
|
request_wiphy = wiphy_idx_to_wiphy(last_request->wiphy_idx);
|
|
|
|
|
|
- sband = wiphy->bands[band];
|
|
|
- BUG_ON(chan_idx >= sband->n_channels);
|
|
|
- chan = &sband->channels[chan_idx];
|
|
|
-
|
|
|
flags = chan->orig_flags;
|
|
|
|
|
|
r = freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq),
|
|
@@ -897,17 +890,17 @@ static void handle_channel(struct wiphy *wiphy,
|
|
|
chan->max_power = chan->max_reg_power;
|
|
|
}
|
|
|
|
|
|
-static void handle_band(struct wiphy *wiphy, enum ieee80211_band band,
|
|
|
- enum nl80211_reg_initiator initiator)
|
|
|
+static void handle_band(struct wiphy *wiphy,
|
|
|
+ enum nl80211_reg_initiator initiator,
|
|
|
+ struct ieee80211_supported_band *sband)
|
|
|
{
|
|
|
unsigned int i;
|
|
|
- struct ieee80211_supported_band *sband;
|
|
|
|
|
|
- BUG_ON(!wiphy->bands[band]);
|
|
|
- sband = wiphy->bands[band];
|
|
|
+ if (!sband)
|
|
|
+ return;
|
|
|
|
|
|
for (i = 0; i < sband->n_channels; i++)
|
|
|
- handle_channel(wiphy, initiator, band, i);
|
|
|
+ handle_channel(wiphy, initiator, &sband->channels[i]);
|
|
|
}
|
|
|
|
|
|
static bool reg_request_cell_base(struct regulatory_request *request)
|
|
@@ -1116,20 +1109,14 @@ static bool is_ht40_allowed(struct ieee80211_channel *chan)
|
|
|
}
|
|
|
|
|
|
static void reg_process_ht_flags_channel(struct wiphy *wiphy,
|
|
|
- enum ieee80211_band band,
|
|
|
- unsigned int chan_idx)
|
|
|
+ struct ieee80211_channel *channel)
|
|
|
{
|
|
|
- struct ieee80211_supported_band *sband;
|
|
|
- struct ieee80211_channel *channel;
|
|
|
+ struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
|
|
|
struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
|
|
|
unsigned int i;
|
|
|
|
|
|
assert_cfg80211_lock();
|
|
|
|
|
|
- sband = wiphy->bands[band];
|
|
|
- BUG_ON(chan_idx >= sband->n_channels);
|
|
|
- channel = &sband->channels[chan_idx];
|
|
|
-
|
|
|
if (!is_ht40_allowed(channel)) {
|
|
|
channel->flags |= IEEE80211_CHAN_NO_HT40;
|
|
|
return;
|
|
@@ -1165,16 +1152,15 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
|
|
|
}
|
|
|
|
|
|
static void reg_process_ht_flags_band(struct wiphy *wiphy,
|
|
|
- enum ieee80211_band band)
|
|
|
+ struct ieee80211_supported_band *sband)
|
|
|
{
|
|
|
unsigned int i;
|
|
|
- struct ieee80211_supported_band *sband;
|
|
|
|
|
|
- BUG_ON(!wiphy->bands[band]);
|
|
|
- sband = wiphy->bands[band];
|
|
|
+ if (!sband)
|
|
|
+ return;
|
|
|
|
|
|
for (i = 0; i < sband->n_channels; i++)
|
|
|
- reg_process_ht_flags_channel(wiphy, band, i);
|
|
|
+ reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
|
|
|
}
|
|
|
|
|
|
static void reg_process_ht_flags(struct wiphy *wiphy)
|
|
@@ -1184,11 +1170,8 @@ static void reg_process_ht_flags(struct wiphy *wiphy)
|
|
|
if (!wiphy)
|
|
|
return;
|
|
|
|
|
|
- for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
|
|
- if (wiphy->bands[band])
|
|
|
- reg_process_ht_flags_band(wiphy, band);
|
|
|
- }
|
|
|
-
|
|
|
+ for (band = 0; band < IEEE80211_NUM_BANDS; band++)
|
|
|
+ reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
|
|
|
}
|
|
|
|
|
|
static void wiphy_update_regulatory(struct wiphy *wiphy,
|
|
@@ -1203,10 +1186,8 @@ static void wiphy_update_regulatory(struct wiphy *wiphy,
|
|
|
|
|
|
last_request->dfs_region = cfg80211_regdomain->dfs_region;
|
|
|
|
|
|
- for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
|
|
- if (wiphy->bands[band])
|
|
|
- handle_band(wiphy, band, initiator);
|
|
|
- }
|
|
|
+ for (band = 0; band < IEEE80211_NUM_BANDS; band++)
|
|
|
+ handle_band(wiphy, initiator, wiphy->bands[band]);
|
|
|
|
|
|
reg_process_beacons(wiphy);
|
|
|
reg_process_ht_flags(wiphy);
|
|
@@ -1236,8 +1217,7 @@ static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
|
|
|
}
|
|
|
|
|
|
static void handle_channel_custom(struct wiphy *wiphy,
|
|
|
- enum ieee80211_band band,
|
|
|
- unsigned int chan_idx,
|
|
|
+ struct ieee80211_channel *chan,
|
|
|
const struct ieee80211_regdomain *regd)
|
|
|
{
|
|
|
int r;
|
|
@@ -1246,15 +1226,9 @@ static void handle_channel_custom(struct wiphy *wiphy,
|
|
|
const struct ieee80211_reg_rule *reg_rule = NULL;
|
|
|
const struct ieee80211_power_rule *power_rule = NULL;
|
|
|
const struct ieee80211_freq_range *freq_range = NULL;
|
|
|
- struct ieee80211_supported_band *sband;
|
|
|
- struct ieee80211_channel *chan;
|
|
|
|
|
|
assert_reg_lock();
|
|
|
|
|
|
- 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),
|
|
|
desired_bw_khz, ®_rule, regd);
|
|
|
|
|
@@ -1279,17 +1253,17 @@ static void handle_channel_custom(struct wiphy *wiphy,
|
|
|
(int) MBM_TO_DBM(power_rule->max_eirp);
|
|
|
}
|
|
|
|
|
|
-static void handle_band_custom(struct wiphy *wiphy, enum ieee80211_band band,
|
|
|
+static void handle_band_custom(struct wiphy *wiphy,
|
|
|
+ struct ieee80211_supported_band *sband,
|
|
|
const struct ieee80211_regdomain *regd)
|
|
|
{
|
|
|
unsigned int i;
|
|
|
- struct ieee80211_supported_band *sband;
|
|
|
|
|
|
- BUG_ON(!wiphy->bands[band]);
|
|
|
- sband = wiphy->bands[band];
|
|
|
+ if (!sband)
|
|
|
+ return;
|
|
|
|
|
|
for (i = 0; i < sband->n_channels; i++)
|
|
|
- handle_channel_custom(wiphy, band, i, regd);
|
|
|
+ handle_channel_custom(wiphy, &sband->channels[i], regd);
|
|
|
}
|
|
|
|
|
|
/* Used by drivers prior to wiphy registration */
|
|
@@ -1303,7 +1277,7 @@ void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
|
|
|
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
|
|
if (!wiphy->bands[band])
|
|
|
continue;
|
|
|
- handle_band_custom(wiphy, band, regd);
|
|
|
+ handle_band_custom(wiphy, wiphy->bands[band], regd);
|
|
|
bands_set++;
|
|
|
}
|
|
|
mutex_unlock(®_mutex);
|
|
@@ -1537,7 +1511,8 @@ static void reg_process_hint(struct regulatory_request *reg_request,
|
|
|
{
|
|
|
struct wiphy *wiphy = NULL;
|
|
|
|
|
|
- BUG_ON(!reg_request->alpha2);
|
|
|
+ if (WARN_ON(!reg_request->alpha2))
|
|
|
+ return;
|
|
|
|
|
|
if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
|
|
|
wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
|
|
@@ -1678,7 +1653,8 @@ int regulatory_hint_user(const char *alpha2,
|
|
|
{
|
|
|
struct regulatory_request *request;
|
|
|
|
|
|
- BUG_ON(!alpha2);
|
|
|
+ if (WARN_ON(!alpha2))
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
|
|
|
if (!request)
|
|
@@ -1700,8 +1676,8 @@ int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
|
|
|
{
|
|
|
struct regulatory_request *request;
|
|
|
|
|
|
- BUG_ON(!alpha2);
|
|
|
- BUG_ON(!wiphy);
|
|
|
+ if (WARN_ON(!alpha2 || !wiphy))
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
|
|
|
if (!request)
|
|
@@ -2239,12 +2215,14 @@ int set_regdom(const struct ieee80211_regdomain *rd)
|
|
|
reg_set_request_processed();
|
|
|
|
|
|
kfree(rd);
|
|
|
- mutex_unlock(®_mutex);
|
|
|
- return r;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
/* This would make this whole thing pointless */
|
|
|
- BUG_ON(!last_request->intersect && rd != cfg80211_regdomain);
|
|
|
+ if (WARN_ON(!last_request->intersect && rd != cfg80211_regdomain)) {
|
|
|
+ r = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
/* update all wiphys now with the new established regulatory domain */
|
|
|
update_all_wiphy_regulatory(last_request->initiator);
|
|
@@ -2255,6 +2233,7 @@ int set_regdom(const struct ieee80211_regdomain *rd)
|
|
|
|
|
|
reg_set_request_processed();
|
|
|
|
|
|
+ out:
|
|
|
mutex_unlock(®_mutex);
|
|
|
|
|
|
return r;
|