• Home
  • Raw
  • Download

Lines Matching +full:switch +full:- +full:freq

1 // SPDX-License-Identifier: GPL-2.0
8 * Copyright 2013-2014 Intel Mobile Communications GmbH
14 #include "rdev-ops.h"
23 chandef->chan = chan; in cfg80211_chandef_create()
24 chandef->center_freq2 = 0; in cfg80211_chandef_create()
26 switch (chan_type) { in cfg80211_chandef_create()
28 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in cfg80211_chandef_create()
29 chandef->center_freq1 = chan->center_freq; in cfg80211_chandef_create()
32 chandef->width = NL80211_CHAN_WIDTH_20; in cfg80211_chandef_create()
33 chandef->center_freq1 = chan->center_freq; in cfg80211_chandef_create()
36 chandef->width = NL80211_CHAN_WIDTH_40; in cfg80211_chandef_create()
37 chandef->center_freq1 = chan->center_freq + 10; in cfg80211_chandef_create()
40 chandef->width = NL80211_CHAN_WIDTH_40; in cfg80211_chandef_create()
41 chandef->center_freq1 = chan->center_freq - 10; in cfg80211_chandef_create()
53 if (!chandef->chan) in cfg80211_chandef_valid()
56 control_freq = chandef->chan->center_freq; in cfg80211_chandef_valid()
58 switch (chandef->width) { in cfg80211_chandef_valid()
63 if (chandef->center_freq1 != control_freq) in cfg80211_chandef_valid()
65 if (chandef->center_freq2) in cfg80211_chandef_valid()
69 if (chandef->center_freq1 != control_freq + 10 && in cfg80211_chandef_valid()
70 chandef->center_freq1 != control_freq - 10) in cfg80211_chandef_valid()
72 if (chandef->center_freq2) in cfg80211_chandef_valid()
76 if (chandef->center_freq1 != control_freq + 30 && in cfg80211_chandef_valid()
77 chandef->center_freq1 != control_freq + 10 && in cfg80211_chandef_valid()
78 chandef->center_freq1 != control_freq - 10 && in cfg80211_chandef_valid()
79 chandef->center_freq1 != control_freq - 30) in cfg80211_chandef_valid()
81 if (!chandef->center_freq2) in cfg80211_chandef_valid()
83 /* adjacent is not allowed -- that's a 160 MHz channel */ in cfg80211_chandef_valid()
84 if (chandef->center_freq1 - chandef->center_freq2 == 80 || in cfg80211_chandef_valid()
85 chandef->center_freq2 - chandef->center_freq1 == 80) in cfg80211_chandef_valid()
89 if (chandef->center_freq1 != control_freq + 30 && in cfg80211_chandef_valid()
90 chandef->center_freq1 != control_freq + 10 && in cfg80211_chandef_valid()
91 chandef->center_freq1 != control_freq - 10 && in cfg80211_chandef_valid()
92 chandef->center_freq1 != control_freq - 30) in cfg80211_chandef_valid()
94 if (chandef->center_freq2) in cfg80211_chandef_valid()
98 if (chandef->center_freq1 != control_freq + 70 && in cfg80211_chandef_valid()
99 chandef->center_freq1 != control_freq + 50 && in cfg80211_chandef_valid()
100 chandef->center_freq1 != control_freq + 30 && in cfg80211_chandef_valid()
101 chandef->center_freq1 != control_freq + 10 && in cfg80211_chandef_valid()
102 chandef->center_freq1 != control_freq - 10 && in cfg80211_chandef_valid()
103 chandef->center_freq1 != control_freq - 30 && in cfg80211_chandef_valid()
104 chandef->center_freq1 != control_freq - 50 && in cfg80211_chandef_valid()
105 chandef->center_freq1 != control_freq - 70) in cfg80211_chandef_valid()
107 if (chandef->center_freq2) in cfg80211_chandef_valid()
123 switch (c->width) { in chandef_primary_freqs()
125 *pri40 = c->center_freq1; in chandef_primary_freqs()
130 *pri80 = c->center_freq1; in chandef_primary_freqs()
132 tmp = (30 + c->chan->center_freq - c->center_freq1)/20; in chandef_primary_freqs()
136 *pri40 = c->center_freq1 - 20 + 40 * tmp; in chandef_primary_freqs()
140 tmp = (70 + c->chan->center_freq - c->center_freq1)/20; in chandef_primary_freqs()
144 *pri40 = c->center_freq1 - 60 + 40 * tmp; in chandef_primary_freqs()
147 *pri80 = c->center_freq1 - 40 + 80 * tmp; in chandef_primary_freqs()
158 switch (c->width) { in cfg80211_chandef_get_width()
181 return -1; in cfg80211_chandef_get_width()
197 if (c1->chan != c2->chan) in cfg80211_chandef_compatible()
204 if (c1->width == c2->width) in cfg80211_chandef_compatible()
211 if (c1->width == NL80211_CHAN_WIDTH_5 || in cfg80211_chandef_compatible()
212 c1->width == NL80211_CHAN_WIDTH_10 || in cfg80211_chandef_compatible()
213 c2->width == NL80211_CHAN_WIDTH_5 || in cfg80211_chandef_compatible()
214 c2->width == NL80211_CHAN_WIDTH_10) in cfg80211_chandef_compatible()
217 if (c1->width == NL80211_CHAN_WIDTH_20_NOHT || in cfg80211_chandef_compatible()
218 c1->width == NL80211_CHAN_WIDTH_20) in cfg80211_chandef_compatible()
221 if (c2->width == NL80211_CHAN_WIDTH_20_NOHT || in cfg80211_chandef_compatible()
222 c2->width == NL80211_CHAN_WIDTH_20) in cfg80211_chandef_compatible()
235 if (c1->width > c2->width) in cfg80211_chandef_compatible()
246 u32 freq; in cfg80211_set_chans_dfs_state() local
248 for (freq = center_freq - bandwidth/2 + 10; in cfg80211_set_chans_dfs_state()
249 freq <= center_freq + bandwidth/2 - 10; in cfg80211_set_chans_dfs_state()
250 freq += 20) { in cfg80211_set_chans_dfs_state()
251 c = ieee80211_get_channel(wiphy, freq); in cfg80211_set_chans_dfs_state()
252 if (!c || !(c->flags & IEEE80211_CHAN_RADAR)) in cfg80211_set_chans_dfs_state()
255 c->dfs_state = dfs_state; in cfg80211_set_chans_dfs_state()
256 c->dfs_state_entered = jiffies; in cfg80211_set_chans_dfs_state()
273 cfg80211_set_chans_dfs_state(wiphy, chandef->center_freq1, in cfg80211_set_dfs_state()
276 if (!chandef->center_freq2) in cfg80211_set_dfs_state()
278 cfg80211_set_chans_dfs_state(wiphy, chandef->center_freq2, in cfg80211_set_dfs_state()
290 start_freq = center_freq - bandwidth/2 + 10; in cfg80211_get_start_freq()
303 end_freq = center_freq + bandwidth/2 - 10; in cfg80211_get_end_freq()
313 u32 freq, start_freq, end_freq; in cfg80211_get_chans_dfs_required() local
318 for (freq = start_freq; freq <= end_freq; freq += 20) { in cfg80211_get_chans_dfs_required()
319 c = ieee80211_get_channel(wiphy, freq); in cfg80211_get_chans_dfs_required()
321 return -EINVAL; in cfg80211_get_chans_dfs_required()
323 if (c->flags & IEEE80211_CHAN_RADAR) in cfg80211_get_chans_dfs_required()
338 return -EINVAL; in cfg80211_chandef_dfs_required()
340 switch (iftype) { in cfg80211_chandef_dfs_required()
347 return -EINVAL; in cfg80211_chandef_dfs_required()
350 chandef->center_freq1, in cfg80211_chandef_dfs_required()
355 return BIT(chandef->width); in cfg80211_chandef_dfs_required()
357 if (!chandef->center_freq2) in cfg80211_chandef_dfs_required()
361 chandef->center_freq2, in cfg80211_chandef_dfs_required()
366 return BIT(chandef->width); in cfg80211_chandef_dfs_required()
392 u32 freq, start_freq, end_freq; in cfg80211_get_chans_dfs_usable() local
402 * (require CAC). Allow DFS and non-DFS channel mix. in cfg80211_get_chans_dfs_usable()
404 for (freq = start_freq; freq <= end_freq; freq += 20) { in cfg80211_get_chans_dfs_usable()
405 c = ieee80211_get_channel(wiphy, freq); in cfg80211_get_chans_dfs_usable()
407 return -EINVAL; in cfg80211_get_chans_dfs_usable()
409 if (c->flags & IEEE80211_CHAN_DISABLED) in cfg80211_get_chans_dfs_usable()
410 return -EINVAL; in cfg80211_get_chans_dfs_usable()
412 if (c->flags & IEEE80211_CHAN_RADAR) { in cfg80211_get_chans_dfs_usable()
413 if (c->dfs_state == NL80211_DFS_UNAVAILABLE) in cfg80211_get_chans_dfs_usable()
414 return -EINVAL; in cfg80211_get_chans_dfs_usable()
416 if (c->dfs_state == NL80211_DFS_USABLE) in cfg80211_get_chans_dfs_usable()
437 r1 = cfg80211_get_chans_dfs_usable(wiphy, chandef->center_freq1, in cfg80211_chandef_dfs_usable()
443 switch (chandef->width) { in cfg80211_chandef_dfs_usable()
445 WARN_ON(!chandef->center_freq2); in cfg80211_chandef_dfs_usable()
447 chandef->center_freq2, in cfg80211_chandef_dfs_usable()
453 WARN_ON(chandef->center_freq2); in cfg80211_chandef_dfs_usable()
468 u32 freq; in cfg80211_is_sub_chan() local
470 if (chandef->chan->center_freq == chan->center_freq) in cfg80211_is_sub_chan()
477 for (freq = chandef->center_freq1 - width / 2 + 10; in cfg80211_is_sub_chan()
478 freq <= chandef->center_freq1 + width / 2 - 10; freq += 20) { in cfg80211_is_sub_chan()
479 if (chan->center_freq == freq) in cfg80211_is_sub_chan()
483 if (!chandef->center_freq2) in cfg80211_is_sub_chan()
486 for (freq = chandef->center_freq2 - width / 2 + 10; in cfg80211_is_sub_chan()
487 freq <= chandef->center_freq2 + width / 2 - 10; freq += 20) { in cfg80211_is_sub_chan()
488 if (chan->center_freq == freq) in cfg80211_is_sub_chan()
501 if (!wdev->chandef.chan) in cfg80211_beaconing_iface_active()
504 switch (wdev->iftype) { in cfg80211_beaconing_iface_active()
507 active = wdev->beacon_interval != 0; in cfg80211_beaconing_iface_active()
510 active = wdev->ssid_len != 0; in cfg80211_beaconing_iface_active()
513 active = wdev->mesh_id_len != 0; in cfg80211_beaconing_iface_active()
538 list_for_each_entry(wdev, &wiphy->wdev_list, list) { in cfg80211_is_wiphy_oper_chan()
545 if (cfg80211_is_sub_chan(&wdev->chandef, chan)) { in cfg80211_is_wiphy_oper_chan()
562 if (!(chan->flags & IEEE80211_CHAN_RADAR)) in cfg80211_any_wiphy_oper_chan()
566 if (!reg_dfs_domain_same(wiphy, &rdev->wiphy)) in cfg80211_any_wiphy_oper_chan()
569 if (cfg80211_is_wiphy_oper_chan(&rdev->wiphy, chan)) in cfg80211_any_wiphy_oper_chan()
581 u32 freq, start_freq, end_freq; in cfg80211_get_chans_dfs_available() local
595 for (freq = start_freq; freq <= end_freq; freq += 20) { in cfg80211_get_chans_dfs_available()
596 c = ieee80211_get_channel(wiphy, freq); in cfg80211_get_chans_dfs_available()
600 if (c->flags & IEEE80211_CHAN_DISABLED) in cfg80211_get_chans_dfs_available()
603 if ((c->flags & IEEE80211_CHAN_RADAR) && in cfg80211_get_chans_dfs_available()
604 (c->dfs_state != NL80211_DFS_AVAILABLE) && in cfg80211_get_chans_dfs_available()
605 !(c->dfs_state == NL80211_DFS_USABLE && dfs_offload)) in cfg80211_get_chans_dfs_available()
625 r = cfg80211_get_chans_dfs_available(wiphy, chandef->center_freq1, in cfg80211_chandef_dfs_available()
632 switch (chandef->width) { in cfg80211_chandef_dfs_available()
634 WARN_ON(!chandef->center_freq2); in cfg80211_chandef_dfs_available()
636 chandef->center_freq2, in cfg80211_chandef_dfs_available()
640 WARN_ON(chandef->center_freq2); in cfg80211_chandef_dfs_available()
652 u32 start_freq, end_freq, freq; in cfg80211_get_chans_dfs_cac_time() local
658 for (freq = start_freq; freq <= end_freq; freq += 20) { in cfg80211_get_chans_dfs_cac_time()
659 c = ieee80211_get_channel(wiphy, freq); in cfg80211_get_chans_dfs_cac_time()
663 if (c->flags & IEEE80211_CHAN_DISABLED) in cfg80211_get_chans_dfs_cac_time()
666 if (!(c->flags & IEEE80211_CHAN_RADAR)) in cfg80211_get_chans_dfs_cac_time()
669 if (c->dfs_cac_ms > dfs_cac_ms) in cfg80211_get_chans_dfs_cac_time()
670 dfs_cac_ms = c->dfs_cac_ms; in cfg80211_get_chans_dfs_cac_time()
691 chandef->center_freq1, in cfg80211_chandef_dfs_cac_time()
694 if (!chandef->center_freq2) in cfg80211_chandef_dfs_cac_time()
698 chandef->center_freq2, in cfg80211_chandef_dfs_cac_time()
709 u32 freq, start_freq, end_freq; in cfg80211_secondary_chans_ok() local
714 for (freq = start_freq; freq <= end_freq; freq += 20) { in cfg80211_secondary_chans_ok()
715 c = ieee80211_get_channel(wiphy, freq); in cfg80211_secondary_chans_ok()
716 if (!c || c->flags & prohibited_flags) in cfg80211_secondary_chans_ok()
734 ht_cap = &wiphy->bands[chandef->chan->band]->ht_cap; in cfg80211_chandef_usable()
735 vht_cap = &wiphy->bands[chandef->chan->band]->vht_cap; in cfg80211_chandef_usable()
737 control_freq = chandef->chan->center_freq; in cfg80211_chandef_usable()
739 switch (chandef->width) { in cfg80211_chandef_usable()
748 if (!ht_cap->ht_supported) in cfg80211_chandef_usable()
756 if (!ht_cap->ht_supported) in cfg80211_chandef_usable()
758 if (!(ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) || in cfg80211_chandef_usable()
759 ht_cap->cap & IEEE80211_HT_CAP_40MHZ_INTOLERANT) in cfg80211_chandef_usable()
761 if (chandef->center_freq1 < control_freq && in cfg80211_chandef_usable()
762 chandef->chan->flags & IEEE80211_CHAN_NO_HT40MINUS) in cfg80211_chandef_usable()
764 if (chandef->center_freq1 > control_freq && in cfg80211_chandef_usable()
765 chandef->chan->flags & IEEE80211_CHAN_NO_HT40PLUS) in cfg80211_chandef_usable()
769 cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; in cfg80211_chandef_usable()
773 if (!vht_cap->vht_supported) in cfg80211_chandef_usable()
779 if (!vht_cap->vht_supported) in cfg80211_chandef_usable()
781 cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; in cfg80211_chandef_usable()
812 if (!cfg80211_secondary_chans_ok(wiphy, chandef->center_freq1, in cfg80211_chandef_usable()
816 if (!chandef->center_freq2) in cfg80211_chandef_usable()
818 return cfg80211_secondary_chans_ok(wiphy, chandef->center_freq2, in cfg80211_chandef_usable()
842 !(wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR)) in cfg80211_ir_permissive_chan()
845 /* only valid for GO and TDLS off-channel (station/p2p-CL) */ in cfg80211_ir_permissive_chan()
852 (chan->flags & IEEE80211_CHAN_INDOOR_ONLY)) in cfg80211_ir_permissive_chan()
855 if (!(chan->flags & IEEE80211_CHAN_IR_CONCURRENT)) in cfg80211_ir_permissive_chan()
865 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in cfg80211_ir_permissive_chan()
870 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_ir_permissive_chan()
871 wdev->current_bss) in cfg80211_ir_permissive_chan()
872 other_chan = wdev->current_bss->pub.channel; in cfg80211_ir_permissive_chan()
879 * we're not outdoor on an indoor-only channel. in cfg80211_ir_permissive_chan()
882 wdev->iftype == NL80211_IFTYPE_P2P_GO && in cfg80211_ir_permissive_chan()
883 wdev->beacon_interval && in cfg80211_ir_permissive_chan()
884 !(chan->flags & IEEE80211_CHAN_INDOOR_ONLY)) in cfg80211_ir_permissive_chan()
885 other_chan = wdev->chandef.chan; in cfg80211_ir_permissive_chan()
894 if (chan->band != NL80211_BAND_5GHZ) in cfg80211_ir_permissive_chan()
897 r1 = cfg80211_get_unii(chan->center_freq); in cfg80211_ir_permissive_chan()
898 r2 = cfg80211_get_unii(other_chan->center_freq); in cfg80211_ir_permissive_chan()
900 if (r1 != -EINVAL && r1 == r2) { in cfg80211_ir_permissive_chan()
902 * At some locations channels 149-165 are considered a in cfg80211_ir_permissive_chan()
904 * channels 149-161 are considered a bundle while in cfg80211_ir_permissive_chan()
908 * it is assumed that channels 149-161 are allowed for in cfg80211_ir_permissive_chan()
910 * connected to an AP on channels 149-161, does not in cfg80211_ir_permissive_chan()
913 if (chan->center_freq == 5825 && in cfg80211_ir_permissive_chan()
914 other_chan->center_freq != 5825) in cfg80211_ir_permissive_chan()
972 chandef->chan); in cfg80211_reg_can_beacon_relax()
981 if (!rdev->ops->set_monitor_channel) in cfg80211_set_monitor_channel()
982 return -EOPNOTSUPP; in cfg80211_set_monitor_channel()
984 return -EBUSY; in cfg80211_set_monitor_channel()
1002 if (wdev->netdev && !netif_running(wdev->netdev)) in cfg80211_get_chan_state()
1005 switch (wdev->iftype) { in cfg80211_get_chan_state()
1007 if (wdev->current_bss) { in cfg80211_get_chan_state()
1008 *chan = wdev->current_bss->pub.channel; in cfg80211_get_chan_state()
1009 *chanmode = (wdev->ibss_fixed && in cfg80211_get_chan_state()
1010 !wdev->ibss_dfs_possible) in cfg80211_get_chan_state()
1014 /* consider worst-case - IBSS can try to return to the in cfg80211_get_chan_state()
1015 * original user-specified channel as creator */ in cfg80211_get_chan_state()
1016 if (wdev->ibss_dfs_possible) in cfg80211_get_chan_state()
1017 *radar_detect |= BIT(wdev->chandef.width); in cfg80211_get_chan_state()
1023 if (wdev->current_bss) { in cfg80211_get_chan_state()
1024 *chan = wdev->current_bss->pub.channel; in cfg80211_get_chan_state()
1031 if (wdev->cac_started) { in cfg80211_get_chan_state()
1032 *chan = wdev->chandef.chan; in cfg80211_get_chan_state()
1034 *radar_detect |= BIT(wdev->chandef.width); in cfg80211_get_chan_state()
1035 } else if (wdev->beacon_interval) { in cfg80211_get_chan_state()
1036 *chan = wdev->chandef.chan; in cfg80211_get_chan_state()
1039 ret = cfg80211_chandef_dfs_required(wdev->wiphy, in cfg80211_get_chan_state()
1040 &wdev->chandef, in cfg80211_get_chan_state()
1041 wdev->iftype); in cfg80211_get_chan_state()
1044 *radar_detect |= BIT(wdev->chandef.width); in cfg80211_get_chan_state()
1048 if (wdev->mesh_id_len) { in cfg80211_get_chan_state()
1049 *chan = wdev->chandef.chan; in cfg80211_get_chan_state()
1052 ret = cfg80211_chandef_dfs_required(wdev->wiphy, in cfg80211_get_chan_state()
1053 &wdev->chandef, in cfg80211_get_chan_state()
1054 wdev->iftype); in cfg80211_get_chan_state()
1057 *radar_detect |= BIT(wdev->chandef.width); in cfg80211_get_chan_state()
1061 if (wdev->chandef.chan) { in cfg80211_get_chan_state()
1062 *chan = wdev->chandef.chan; in cfg80211_get_chan_state()