Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

orinoco: enable cfg80211 "set_channel" operation

Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Holger Schurig and committed by
John W. Linville
7e2ce646 91b092d7

+41
+41
drivers/net/wireless/orinoco/cfg.c
··· 156 156 return err; 157 157 } 158 158 159 + static int orinoco_set_channel(struct wiphy *wiphy, 160 + struct ieee80211_channel *chan, 161 + enum nl80211_channel_type channel_type) 162 + { 163 + struct orinoco_private *priv = wiphy_priv(wiphy); 164 + int err = 0; 165 + unsigned long flags; 166 + int channel; 167 + 168 + if (!chan) 169 + return -EINVAL; 170 + 171 + if (channel_type != NL80211_CHAN_NO_HT) 172 + return -EINVAL; 173 + 174 + if (chan->band != IEEE80211_BAND_2GHZ) 175 + return -EINVAL; 176 + 177 + channel = ieee80211_freq_to_dsss_chan(chan->center_freq); 178 + 179 + if ((channel < 1) || (channel > NUM_CHANNELS) || 180 + !(priv->channel_mask & (1 << (channel-1)))) 181 + return -EINVAL; 182 + 183 + if (orinoco_lock(priv, &flags) != 0) 184 + return -EBUSY; 185 + 186 + priv->channel = channel; 187 + if (priv->iw_mode == NL80211_IFTYPE_MONITOR) { 188 + /* Fast channel change - no commit if successful */ 189 + hermes_t *hw = &priv->hw; 190 + err = hermes_docmd_wait(hw, HERMES_CMD_TEST | 191 + HERMES_TEST_SET_CHANNEL, 192 + channel, NULL); 193 + } 194 + orinoco_unlock(priv, &flags); 195 + 196 + return err; 197 + } 198 + 159 199 const struct cfg80211_ops orinoco_cfg_ops = { 160 200 .change_virtual_intf = orinoco_change_vif, 201 + .set_channel = orinoco_set_channel, 161 202 .scan = orinoco_scan, 162 203 };