diff options
Diffstat (limited to 'net/wireless/chan.c')
-rw-r--r-- | net/wireless/chan.c | 55 |
1 files changed, 6 insertions, 49 deletions
diff --git a/net/wireless/chan.c b/net/wireless/chan.c index 884801ac4dd0..c1999e45a07c 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c | |||
@@ -60,7 +60,7 @@ bool cfg80211_can_beacon_sec_chan(struct wiphy *wiphy, | |||
60 | diff = -20; | 60 | diff = -20; |
61 | break; | 61 | break; |
62 | default: | 62 | default: |
63 | return false; | 63 | return true; |
64 | } | 64 | } |
65 | 65 | ||
66 | sec_chan = ieee80211_get_channel(wiphy, chan->center_freq + diff); | 66 | sec_chan = ieee80211_get_channel(wiphy, chan->center_freq + diff); |
@@ -78,60 +78,17 @@ bool cfg80211_can_beacon_sec_chan(struct wiphy *wiphy, | |||
78 | } | 78 | } |
79 | EXPORT_SYMBOL(cfg80211_can_beacon_sec_chan); | 79 | EXPORT_SYMBOL(cfg80211_can_beacon_sec_chan); |
80 | 80 | ||
81 | int cfg80211_set_freq(struct cfg80211_registered_device *rdev, | 81 | int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, |
82 | struct wireless_dev *wdev, int freq, | 82 | int freq, enum nl80211_channel_type chantype) |
83 | enum nl80211_channel_type channel_type) | ||
84 | { | 83 | { |
85 | struct ieee80211_channel *chan; | 84 | struct ieee80211_channel *chan; |
86 | int result; | ||
87 | |||
88 | if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR) | ||
89 | wdev = NULL; | ||
90 | |||
91 | if (wdev) { | ||
92 | ASSERT_WDEV_LOCK(wdev); | ||
93 | |||
94 | if (!netif_running(wdev->netdev)) | ||
95 | return -ENETDOWN; | ||
96 | } | ||
97 | 85 | ||
98 | if (!rdev->ops->set_channel) | 86 | if (!rdev->ops->set_monitor_channel) |
99 | return -EOPNOTSUPP; | 87 | return -EOPNOTSUPP; |
100 | 88 | ||
101 | chan = rdev_freq_to_chan(rdev, freq, channel_type); | 89 | chan = rdev_freq_to_chan(rdev, freq, chantype); |
102 | if (!chan) | 90 | if (!chan) |
103 | return -EINVAL; | 91 | return -EINVAL; |
104 | 92 | ||
105 | /* Both channels should be able to initiate communication */ | 93 | return rdev->ops->set_monitor_channel(&rdev->wiphy, chan, chantype); |
106 | if (wdev && (wdev->iftype == NL80211_IFTYPE_ADHOC || | ||
107 | wdev->iftype == NL80211_IFTYPE_AP || | ||
108 | wdev->iftype == NL80211_IFTYPE_AP_VLAN || | ||
109 | wdev->iftype == NL80211_IFTYPE_MESH_POINT || | ||
110 | wdev->iftype == NL80211_IFTYPE_P2P_GO)) { | ||
111 | switch (channel_type) { | ||
112 | case NL80211_CHAN_HT40PLUS: | ||
113 | case NL80211_CHAN_HT40MINUS: | ||
114 | if (!cfg80211_can_beacon_sec_chan(&rdev->wiphy, chan, | ||
115 | channel_type)) { | ||
116 | printk(KERN_DEBUG | ||
117 | "cfg80211: Secondary channel not " | ||
118 | "allowed to initiate communication\n"); | ||
119 | return -EINVAL; | ||
120 | } | ||
121 | break; | ||
122 | default: | ||
123 | break; | ||
124 | } | ||
125 | } | ||
126 | |||
127 | result = rdev->ops->set_channel(&rdev->wiphy, | ||
128 | wdev ? wdev->netdev : NULL, | ||
129 | chan, channel_type); | ||
130 | if (result) | ||
131 | return result; | ||
132 | |||
133 | if (wdev) | ||
134 | wdev->channel = chan; | ||
135 | |||
136 | return 0; | ||
137 | } | 94 | } |