mac80211: remove WARN_ON() from ieee80211_hw_config
[pandora-kernel.git] / net / mac80211 / main.c
index cec9b6d..df7e9a8 100644 (file)
@@ -195,20 +195,42 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
        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
@@ -221,10 +243,20 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
        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;