|
@@ -490,6 +490,62 @@ static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
+static unsigned int cfg80211_get_chans_dfs_cac_time(struct wiphy *wiphy,
|
|
|
+ u32 center_freq,
|
|
|
+ u32 bandwidth)
|
|
|
+{
|
|
|
+ struct ieee80211_channel *c;
|
|
|
+ u32 start_freq, end_freq, freq;
|
|
|
+ unsigned int dfs_cac_ms = 0;
|
|
|
+
|
|
|
+ start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
|
|
|
+ end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
|
|
|
+
|
|
|
+ for (freq = start_freq; freq <= end_freq; freq += 20) {
|
|
|
+ c = ieee80211_get_channel(wiphy, freq);
|
|
|
+ if (!c)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (c->flags & IEEE80211_CHAN_DISABLED)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (!(c->flags & IEEE80211_CHAN_RADAR))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (c->dfs_cac_ms > dfs_cac_ms)
|
|
|
+ dfs_cac_ms = c->dfs_cac_ms;
|
|
|
+ }
|
|
|
+
|
|
|
+ return dfs_cac_ms;
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int
|
|
|
+cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
|
|
|
+ const struct cfg80211_chan_def *chandef)
|
|
|
+{
|
|
|
+ int width;
|
|
|
+ unsigned int t1 = 0, t2 = 0;
|
|
|
+
|
|
|
+ if (WARN_ON(!cfg80211_chandef_valid(chandef)))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ width = cfg80211_chandef_get_width(chandef);
|
|
|
+ if (width < 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ t1 = cfg80211_get_chans_dfs_cac_time(wiphy,
|
|
|
+ chandef->center_freq1,
|
|
|
+ width);
|
|
|
+
|
|
|
+ if (!chandef->center_freq2)
|
|
|
+ return t1;
|
|
|
+
|
|
|
+ t2 = cfg80211_get_chans_dfs_cac_time(wiphy,
|
|
|
+ chandef->center_freq2,
|
|
|
+ width);
|
|
|
+
|
|
|
+ return max(t1, t2);
|
|
|
+}
|
|
|
|
|
|
static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
|
|
|
u32 center_freq, u32 bandwidth,
|