mmc: atmel-mci: Add support for SDIO interrupts
[safe/jmp/linux-2.6] / net / mac80211 / chan.c
index 08f3832..5d218c5 100644 (file)
@@ -2,6 +2,7 @@
  * mac80211 - channel management
  */
 
+#include <linux/nl80211.h>
 #include "ieee80211_i.h"
 
 enum ieee80211_chan_mode
@@ -55,3 +56,72 @@ ieee80211_get_channel_mode(struct ieee80211_local *local,
 
        return mode;
 }
+
+bool ieee80211_set_channel_type(struct ieee80211_local *local,
+                               struct ieee80211_sub_if_data *sdata,
+                               enum nl80211_channel_type chantype)
+{
+       struct ieee80211_sub_if_data *tmp;
+       enum nl80211_channel_type superchan = NL80211_CHAN_NO_HT;
+       bool result;
+
+       mutex_lock(&local->iflist_mtx);
+
+       list_for_each_entry(tmp, &local->interfaces, list) {
+               if (tmp == sdata)
+                       continue;
+
+               if (!ieee80211_sdata_running(tmp))
+                       continue;
+
+               switch (tmp->vif.bss_conf.channel_type) {
+               case NL80211_CHAN_NO_HT:
+               case NL80211_CHAN_HT20:
+                       superchan = tmp->vif.bss_conf.channel_type;
+                       break;
+               case NL80211_CHAN_HT40PLUS:
+                       WARN_ON(superchan == NL80211_CHAN_HT40MINUS);
+                       superchan = NL80211_CHAN_HT40PLUS;
+                       break;
+               case NL80211_CHAN_HT40MINUS:
+                       WARN_ON(superchan == NL80211_CHAN_HT40PLUS);
+                       superchan = NL80211_CHAN_HT40MINUS;
+                       break;
+               }
+       }
+
+       switch (superchan) {
+       case NL80211_CHAN_NO_HT:
+       case NL80211_CHAN_HT20:
+               /*
+                * allow any change that doesn't go to no-HT
+                * (if it already is no-HT no change is needed)
+                */
+               if (chantype == NL80211_CHAN_NO_HT)
+                       break;
+               superchan = chantype;
+               break;
+       case NL80211_CHAN_HT40PLUS:
+       case NL80211_CHAN_HT40MINUS:
+               /* allow smaller bandwidth and same */
+               if (chantype == NL80211_CHAN_NO_HT)
+                       break;
+               if (chantype == NL80211_CHAN_HT20)
+                       break;
+               if (superchan == chantype)
+                       break;
+               result = false;
+               goto out;
+       }
+
+       local->_oper_channel_type = superchan;
+
+       if (sdata)
+               sdata->vif.bss_conf.channel_type = chantype;
+
+       result = true;
+ out:
+       mutex_unlock(&local->iflist_mtx);
+
+       return result;
+}