struct ieee80211_channel *chan;
int ret = 0;
int power;
+ enum nl80211_sec_chan_offset sec_chan_offset;
might_sleep();
- if (local->sw_scanning)
+ if (local->sw_scanning) {
chan = local->scan_channel;
- else
+ sec_chan_offset = NL80211_SEC_CHAN_NO_HT;
+ } else {
chan = local->oper_channel;
+ sec_chan_offset = local->oper_sec_chan_offset;
+ }
- if (chan != local->hw.conf.channel) {
+ if (chan != local->hw.conf.channel ||
+ sec_chan_offset != local->hw.conf.ht.sec_chan_offset) {
local->hw.conf.channel = chan;
+ switch (sec_chan_offset) {
+ case NL80211_SEC_CHAN_NO_HT:
+ local->hw.conf.ht.enabled = false;
+ local->hw.conf.ht.sec_chan_offset = 0;
+ break;
+ case NL80211_SEC_CHAN_DISABLED:
+ local->hw.conf.ht.enabled = true;
+ local->hw.conf.ht.sec_chan_offset = 0;
+ break;
+ case NL80211_SEC_CHAN_BELOW:
+ local->hw.conf.ht.enabled = true;
+ local->hw.conf.ht.sec_chan_offset = -1;
+ break;
+ case NL80211_SEC_CHAN_ABOVE:
+ local->hw.conf.ht.enabled = true;
+ local->hw.conf.ht.sec_chan_offset = 1;
+ break;
+ }
changed |= IEEE80211_CONF_CHANGE_CHANNEL;
}
-
if (!local->hw.conf.power_level)
power = chan->max_power;
else
if (changed && local->open_count) {
ret = local->ops->config(local_to_hw(local), changed);
/*
+ * Goal:
* HW reconfiguration should never fail, the driver has told
* us what it can support so it should live up to that promise.
+ *
+ * Current status:
+ * rfkill is not integrated with mac80211 and a
+ * configuration command can thus fail if hardware rfkill
+ * is enabled
+ *
+ * FIXME: integrate rfkill with mac80211 and then add this
+ * WARN_ON() back
+ *
*/
- WARN_ON(ret);
+ /* WARN_ON(ret); */
}
return ret;