summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/mlme.c5
-rw-r--r--net/wireless/chan.c59
2 files changed, 42 insertions, 22 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 3db8a499a1c8..a818568d34b9 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -406,7 +406,10 @@ check_uhr:
npca = ieee80211_uhr_npca_info(uhr_oper);
- if (cfg80211_chandef_add_npca(sdata->local->hw.wiphy,
+ /* DBE is not considered yet, so this works */
+ if (!cfg80211_chandef_npca_valid(sdata->local->hw.wiphy,
+ &npca_chandef, npca) ||
+ cfg80211_chandef_add_npca(sdata->local->hw.wiphy,
&npca_chandef, npca)) {
sdata_info(sdata,
"AP UHR NPCA settings invalid, disabling UHR\n");
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 5289a4ddacd6..ed35b55b1b67 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -460,9 +460,6 @@ bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
return false;
if (chandef->npca_chan) {
- bool pri_upper, npca_upper;
- u32 cf1;
-
switch (chandef->width) {
case NL80211_CHAN_WIDTH_80:
case NL80211_CHAN_WIDTH_160:
@@ -471,24 +468,6 @@ bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
default:
return false;
}
-
- if (!cfg80211_chandef_valid_control_freq(chandef,
- chandef->npca_chan->center_freq))
- return false;
-
- cf1 = chandef->center_freq1;
- pri_upper = chandef->chan->center_freq > cf1;
- npca_upper = chandef->npca_chan->center_freq > cf1;
-
- if (pri_upper == npca_upper)
- return false;
-
- if (!valid_puncturing_bitmap(chandef,
- chandef->npca_chan->center_freq,
- chandef->npca_punctured) ||
- (chandef->punctured & chandef->npca_punctured) !=
- chandef->punctured)
- return false;
} else if (chandef->npca_punctured) {
return false;
}
@@ -556,6 +535,44 @@ int cfg80211_chandef_primary(const struct cfg80211_chan_def *c,
}
EXPORT_SYMBOL(cfg80211_chandef_primary);
+bool cfg80211_chandef_npca_valid(struct wiphy *wiphy,
+ const struct cfg80211_chan_def *chandef,
+ const struct ieee80211_uhr_npca_info *npca)
+{
+ struct cfg80211_chan_def tmp = *chandef;
+ bool pri_upper, npca_upper;
+ u32 cf1;
+
+ if (chandef->npca_chan || chandef->npca_punctured)
+ return false;
+
+ if (!npca)
+ return true;
+
+ if (cfg80211_chandef_add_npca(wiphy, &tmp, npca))
+ return false;
+
+ if (!cfg80211_chandef_valid_control_freq(&tmp,
+ tmp.npca_chan->center_freq))
+ return false;
+
+ cf1 = tmp.center_freq1;
+ pri_upper = tmp.chan->center_freq > cf1;
+ npca_upper = tmp.npca_chan->center_freq > cf1;
+
+ if (pri_upper == npca_upper)
+ return false;
+
+ if (!valid_puncturing_bitmap(&tmp,
+ tmp.npca_chan->center_freq,
+ tmp.npca_punctured) ||
+ (tmp.punctured & tmp.npca_punctured) != tmp.punctured)
+ return false;
+
+ return true;
+}
+EXPORT_SYMBOL(cfg80211_chandef_npca_valid);
+
int cfg80211_chandef_add_npca(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef,
const struct ieee80211_uhr_npca_info *npca)