Lines Matching refs:chandef

23 void cfg80211_chandef_create(struct cfg80211_chan_def *chandef,  in cfg80211_chandef_create()  argument
30 *chandef = (struct cfg80211_chan_def) { in cfg80211_chandef_create()
37 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in cfg80211_chandef_create()
38 chandef->center_freq1 = chan->center_freq; in cfg80211_chandef_create()
41 chandef->width = NL80211_CHAN_WIDTH_20; in cfg80211_chandef_create()
42 chandef->center_freq1 = chan->center_freq; in cfg80211_chandef_create()
45 chandef->width = NL80211_CHAN_WIDTH_40; in cfg80211_chandef_create()
46 chandef->center_freq1 = chan->center_freq + 10; in cfg80211_chandef_create()
49 chandef->width = NL80211_CHAN_WIDTH_40; in cfg80211_chandef_create()
50 chandef->center_freq1 = chan->center_freq - 10; in cfg80211_chandef_create()
58 static u32 cfg80211_get_start_freq(const struct cfg80211_chan_def *chandef, in cfg80211_get_start_freq() argument
64 chandef->center_freq1 : chandef->center_freq2); in cfg80211_get_start_freq()
65 bandwidth = MHZ_TO_KHZ(cfg80211_chandef_get_width(chandef)); in cfg80211_get_start_freq()
75 static u32 cfg80211_get_end_freq(const struct cfg80211_chan_def *chandef, in cfg80211_get_end_freq() argument
81 chandef->center_freq1 : chandef->center_freq2); in cfg80211_get_end_freq()
82 bandwidth = MHZ_TO_KHZ(cfg80211_chandef_get_width(chandef)); in cfg80211_get_end_freq()
92 #define for_each_subchan(chandef, freq, cf) \ argument
93 for (u32 punctured = chandef->punctured, \
94 cf = 1, freq = cfg80211_get_start_freq(chandef, cf); \
95 freq <= cfg80211_get_end_freq(chandef, cf); \
97 ((cf == 1 && chandef->center_freq2 != 0 && \
98 freq > cfg80211_get_end_freq(chandef, cf)) ? \
99 (cf++, freq = cfg80211_get_start_freq(chandef, cf), \
134 static bool valid_puncturing_bitmap(const struct cfg80211_chan_def *chandef) in valid_puncturing_bitmap() argument
136 u32 idx, i, start_freq, primary_center = chandef->chan->center_freq; in valid_puncturing_bitmap()
138 switch (chandef->width) { in valid_puncturing_bitmap()
141 start_freq = chandef->center_freq1 - 40; in valid_puncturing_bitmap()
145 start_freq = chandef->center_freq1 - 80; in valid_puncturing_bitmap()
149 start_freq = chandef->center_freq1 - 160; in valid_puncturing_bitmap()
152 return chandef->punctured == 0; in valid_puncturing_bitmap()
155 if (!chandef->punctured) in valid_puncturing_bitmap()
159 if (chandef->punctured & (u16)BIT((primary_center - start_freq) / 20)) in valid_puncturing_bitmap()
163 if (per_bw_puncturing[idx].valid_values[i] == chandef->punctured) in valid_puncturing_bitmap()
170 static bool cfg80211_edmg_chandef_valid(const struct cfg80211_chan_def *chandef) in cfg80211_edmg_chandef_valid() argument
177 if (!chandef->edmg.channels || !chandef->edmg.bw_config) in cfg80211_edmg_chandef_valid()
180 if (!cfg80211_valid_60g_freq(chandef->chan->center_freq)) in cfg80211_edmg_chandef_valid()
184 if (chandef->edmg.channels & BIT(i)) { in cfg80211_edmg_chandef_valid()
197 switch (chandef->edmg.bw_config) { in cfg80211_edmg_chandef_valid()
228 switch (chandef->edmg.bw_config) { in cfg80211_edmg_chandef_valid()
337 bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef) in cfg80211_chandef_valid() argument
342 if (!chandef->chan) in cfg80211_chandef_valid()
345 if (chandef->freq1_offset >= 1000) in cfg80211_chandef_valid()
348 control_freq = chandef->chan->center_freq; in cfg80211_chandef_valid()
350 switch (chandef->width) { in cfg80211_chandef_valid()
355 if (ieee80211_chandef_to_khz(chandef) != in cfg80211_chandef_valid()
356 ieee80211_channel_to_khz(chandef->chan)) in cfg80211_chandef_valid()
358 if (chandef->center_freq2) in cfg80211_chandef_valid()
366 if (chandef->chan->band != NL80211_BAND_S1GHZ) in cfg80211_chandef_valid()
369 control_freq = ieee80211_channel_to_khz(chandef->chan); in cfg80211_chandef_valid()
370 oper_freq = ieee80211_chandef_to_khz(chandef); in cfg80211_chandef_valid()
373 chandef->chan)); in cfg80211_chandef_valid()
374 oper_width = cfg80211_chandef_get_width(chandef); in cfg80211_chandef_valid()
378 if (chandef->center_freq2) in cfg80211_chandef_valid()
390 if (!chandef->center_freq2) in cfg80211_chandef_valid()
393 if (chandef->center_freq1 - chandef->center_freq2 == 80 || in cfg80211_chandef_valid()
394 chandef->center_freq2 - chandef->center_freq1 == 80) in cfg80211_chandef_valid()
398 if (chandef->center_freq2) in cfg80211_chandef_valid()
403 switch (chandef->width) { in cfg80211_chandef_valid()
416 if (chandef->center_freq1 == control_freq + 150 || in cfg80211_chandef_valid()
417 chandef->center_freq1 == control_freq + 130 || in cfg80211_chandef_valid()
418 chandef->center_freq1 == control_freq + 110 || in cfg80211_chandef_valid()
419 chandef->center_freq1 == control_freq + 90 || in cfg80211_chandef_valid()
420 chandef->center_freq1 == control_freq - 90 || in cfg80211_chandef_valid()
421 chandef->center_freq1 == control_freq - 110 || in cfg80211_chandef_valid()
422 chandef->center_freq1 == control_freq - 130 || in cfg80211_chandef_valid()
423 chandef->center_freq1 == control_freq - 150) in cfg80211_chandef_valid()
427 if (chandef->center_freq1 == control_freq + 70 || in cfg80211_chandef_valid()
428 chandef->center_freq1 == control_freq + 50 || in cfg80211_chandef_valid()
429 chandef->center_freq1 == control_freq - 50 || in cfg80211_chandef_valid()
430 chandef->center_freq1 == control_freq - 70) in cfg80211_chandef_valid()
435 if (chandef->center_freq1 == control_freq + 30 || in cfg80211_chandef_valid()
436 chandef->center_freq1 == control_freq - 30) in cfg80211_chandef_valid()
440 if (chandef->center_freq1 == control_freq + 10 || in cfg80211_chandef_valid()
441 chandef->center_freq1 == control_freq - 10) in cfg80211_chandef_valid()
448 if (!cfg80211_valid_center_freq(chandef->center_freq1, chandef->width)) in cfg80211_chandef_valid()
451 if (chandef->width == NL80211_CHAN_WIDTH_80P80 && in cfg80211_chandef_valid()
452 !cfg80211_valid_center_freq(chandef->center_freq2, chandef->width)) in cfg80211_chandef_valid()
456 if (chandef->center_freq1 == 2484 && in cfg80211_chandef_valid()
457 chandef->width != NL80211_CHAN_WIDTH_20_NOHT) in cfg80211_chandef_valid()
460 if (cfg80211_chandef_is_edmg(chandef) && in cfg80211_chandef_valid()
461 !cfg80211_edmg_chandef_valid(chandef)) in cfg80211_chandef_valid()
464 return valid_puncturing_bitmap(chandef); in cfg80211_chandef_valid()
626 const struct cfg80211_chan_def *chandef, in cfg80211_set_dfs_state() argument
632 if (WARN_ON(!cfg80211_chandef_valid(chandef))) in cfg80211_set_dfs_state()
635 width = cfg80211_chandef_get_width(chandef); in cfg80211_set_dfs_state()
639 for_each_subchan(chandef, freq, cf) { in cfg80211_set_dfs_state()
659 struct cfg80211_chan_def chandef = {}; in cfg80211_dfs_permissive_check_wdev() local
677 ret = rdev_get_channel(rdev, wdev, link_id, &chandef); in cfg80211_dfs_permissive_check_wdev()
681 if (cfg80211_is_sub_chan(&chandef, chan, false)) in cfg80211_dfs_permissive_check_wdev()
723 const struct cfg80211_chan_def *chandef, in cfg80211_get_chans_dfs_required() argument
728 for_each_subchan(chandef, freq, cf) { in cfg80211_get_chans_dfs_required()
743 const struct cfg80211_chan_def *chandef, in cfg80211_chandef_dfs_required() argument
749 if (WARN_ON(!cfg80211_chandef_valid(chandef))) in cfg80211_chandef_dfs_required()
757 width = cfg80211_chandef_get_width(chandef); in cfg80211_chandef_dfs_required()
761 ret = cfg80211_get_chans_dfs_required(wiphy, chandef, iftype); in cfg80211_chandef_dfs_required()
763 return (ret > 0) ? BIT(chandef->width) : ret; in cfg80211_chandef_dfs_required()
784 const struct cfg80211_chan_def *chandef) in cfg80211_chandef_dfs_usable() argument
789 if (WARN_ON(!cfg80211_chandef_valid(chandef))) in cfg80211_chandef_dfs_usable()
792 width = cfg80211_chandef_get_width(chandef); in cfg80211_chandef_dfs_usable()
802 for_each_subchan(chandef, freq, cf) { in cfg80211_chandef_dfs_usable()
827 bool cfg80211_is_sub_chan(struct cfg80211_chan_def *chandef, in cfg80211_is_sub_chan() argument
834 if (!chandef->chan) in cfg80211_is_sub_chan()
837 if (chandef->chan->center_freq == chan->center_freq) in cfg80211_is_sub_chan()
843 width = cfg80211_chandef_get_width(chandef); in cfg80211_is_sub_chan()
847 for (freq = chandef->center_freq1 - width / 2 + 10; in cfg80211_is_sub_chan()
848 freq <= chandef->center_freq1 + width / 2 - 10; freq += 20) { in cfg80211_is_sub_chan()
853 if (!chandef->center_freq2) in cfg80211_is_sub_chan()
856 for (freq = chandef->center_freq2 - width / 2 + 10; in cfg80211_is_sub_chan()
857 freq <= chandef->center_freq2 + width / 2 - 10; freq += 20) { in cfg80211_is_sub_chan()
915 if (cfg80211_is_sub_chan(&wdev->links[link].ap.chandef, in cfg80211_wdev_on_sub_chan()
921 return cfg80211_is_sub_chan(&wdev->u.ibss.chandef, chan, in cfg80211_wdev_on_sub_chan()
924 return cfg80211_is_sub_chan(&wdev->u.mesh.chandef, chan, in cfg80211_wdev_on_sub_chan()
994 const struct cfg80211_chan_def *chandef) in cfg80211_chandef_dfs_available() argument
1000 if (WARN_ON(!cfg80211_chandef_valid(chandef))) in cfg80211_chandef_dfs_available()
1003 width = cfg80211_chandef_get_width(chandef); in cfg80211_chandef_dfs_available()
1015 for_each_subchan(chandef, freq, cf) { in cfg80211_chandef_dfs_available()
1034 const struct cfg80211_chan_def *chandef) in cfg80211_chandef_dfs_cac_time() argument
1040 if (WARN_ON(!cfg80211_chandef_valid(chandef))) in cfg80211_chandef_dfs_cac_time()
1043 width = cfg80211_chandef_get_width(chandef); in cfg80211_chandef_dfs_cac_time()
1047 for_each_subchan(chandef, freq, cf) { in cfg80211_chandef_dfs_cac_time()
1134 const struct cfg80211_chan_def *chandef, in _cfg80211_chandef_usable() argument
1148 if (WARN_ON(!cfg80211_chandef_valid(chandef))) in _cfg80211_chandef_usable()
1151 ht_cap = &wiphy->bands[chandef->chan->band]->ht_cap; in _cfg80211_chandef_usable()
1152 vht_cap = &wiphy->bands[chandef->chan->band]->vht_cap; in _cfg80211_chandef_usable()
1153 edmg_cap = &wiphy->bands[chandef->chan->band]->edmg_cap; in _cfg80211_chandef_usable()
1159 chandef->edmg.channels, in _cfg80211_chandef_usable()
1160 chandef->edmg.bw_config, in _cfg80211_chandef_usable()
1161 chandef->chan->hw_value, in _cfg80211_chandef_usable()
1165 control_freq = chandef->chan->center_freq; in _cfg80211_chandef_usable()
1167 switch (chandef->width) { in _cfg80211_chandef_usable()
1192 chandef->chan->band != NL80211_BAND_6GHZ) in _cfg80211_chandef_usable()
1201 if (chandef->chan->band == NL80211_BAND_6GHZ) in _cfg80211_chandef_usable()
1208 if (chandef->center_freq1 < control_freq && in _cfg80211_chandef_usable()
1209 chandef->chan->flags & IEEE80211_CHAN_NO_HT40MINUS) in _cfg80211_chandef_usable()
1211 if (chandef->center_freq1 > control_freq && in _cfg80211_chandef_usable()
1212 chandef->chan->flags & IEEE80211_CHAN_NO_HT40PLUS) in _cfg80211_chandef_usable()
1223 if (chandef->chan->band != NL80211_BAND_6GHZ && !support_80_80) in _cfg80211_chandef_usable()
1229 if (chandef->chan->band == NL80211_BAND_6GHZ) in _cfg80211_chandef_usable()
1237 if (chandef->chan->band == NL80211_BAND_6GHZ) in _cfg80211_chandef_usable()
1252 if (chandef->chan->band != NL80211_BAND_6GHZ) in _cfg80211_chandef_usable()
1296 for_each_subchan(chandef, freq, cf) { in _cfg80211_chandef_usable()
1310 const struct cfg80211_chan_def *chandef, in cfg80211_chandef_usable() argument
1313 return _cfg80211_chandef_usable(wiphy, chandef, prohibited_flags, 0); in cfg80211_chandef_usable()
1341 other_chan = wdev->links[link_id].ap.chandef.chan; in cfg80211_ir_permissive_check_wdev()
1433 struct cfg80211_chan_def *chandef, in _cfg80211_reg_can_beacon() argument
1441 trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype, in _cfg80211_reg_can_beacon()
1445 if (!_cfg80211_chandef_usable(wiphy, chandef, in _cfg80211_reg_can_beacon()
1449 dfs_required = cfg80211_chandef_dfs_required(wiphy, chandef, iftype); in _cfg80211_reg_can_beacon()
1453 cfg80211_chandef_dfs_available(wiphy, chandef)) { in _cfg80211_reg_can_beacon()
1460 !_cfg80211_chandef_usable(wiphy, chandef, in _cfg80211_reg_can_beacon()
1464 res = _cfg80211_chandef_usable(wiphy, chandef, in _cfg80211_reg_can_beacon()
1473 struct cfg80211_chan_def *chandef, in cfg80211_reg_check_beaconing() argument
1489 chandef->chan); in cfg80211_reg_check_beaconing()
1497 (chandef->width == NL80211_CHAN_WIDTH_20_NOHT || in cfg80211_reg_check_beaconing()
1498 chandef->width == NL80211_CHAN_WIDTH_20)) in cfg80211_reg_check_beaconing()
1501 return _cfg80211_reg_can_beacon(wiphy, chandef, cfg->iftype, in cfg80211_reg_check_beaconing()
1509 struct cfg80211_chan_def *chandef) in cfg80211_set_monitor_channel() argument
1516 return rdev_set_monitor_channel(rdev, dev, chandef); in cfg80211_set_monitor_channel()
1560 return &wdev->u.mesh.chandef; in wdev_chandef()
1562 return &wdev->u.ibss.chandef; in wdev_chandef()
1564 return &wdev->u.ocb.chandef; in wdev_chandef()
1567 return &wdev->links[link_id].ap.chandef; in wdev_chandef()