ar9170: support HT receive and channel config
[linux-block.git] / net / wireless / wext-compat.c
index 0fd1db6e95bbe26ef13a9d3524a42ff5765d97c9..4e054ea9c0a06131a2959a24727018453205f099 100644 (file)
@@ -10,8 +10,8 @@
 
 #include <linux/wireless.h>
 #include <linux/nl80211.h>
+#include <linux/if_arp.h>
 #include <net/iw_handler.h>
-#include <net/wireless.h>
 #include <net/cfg80211.h>
 #include "core.h"
 
@@ -206,7 +206,6 @@ int cfg80211_wext_giwrange(struct net_device *dev,
        range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
                          IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
 
-
        for (band = 0; band < IEEE80211_NUM_BANDS; band ++) {
                int i;
                struct ieee80211_supported_band *sband;
@@ -241,3 +240,77 @@ int cfg80211_wext_giwrange(struct net_device *dev,
        return 0;
 }
 EXPORT_SYMBOL(cfg80211_wext_giwrange);
+
+int cfg80211_wext_siwmlme(struct net_device *dev,
+                         struct iw_request_info *info,
+                         struct iw_point *data, char *extra)
+{
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct iw_mlme *mlme = (struct iw_mlme *)extra;
+       struct cfg80211_registered_device *rdev;
+       union {
+               struct cfg80211_disassoc_request disassoc;
+               struct cfg80211_deauth_request deauth;
+       } cmd;
+
+       if (!wdev)
+               return -EOPNOTSUPP;
+
+       rdev = wiphy_to_dev(wdev->wiphy);
+
+       if (wdev->iftype != NL80211_IFTYPE_STATION)
+               return -EINVAL;
+
+       if (mlme->addr.sa_family != ARPHRD_ETHER)
+               return -EINVAL;
+
+       memset(&cmd, 0, sizeof(cmd));
+
+       switch (mlme->cmd) {
+       case IW_MLME_DEAUTH:
+               if (!rdev->ops->deauth)
+                       return -EOPNOTSUPP;
+               cmd.deauth.peer_addr = mlme->addr.sa_data;
+               cmd.deauth.reason_code = mlme->reason_code;
+               return rdev->ops->deauth(wdev->wiphy, dev, &cmd.deauth);
+       case IW_MLME_DISASSOC:
+               if (!rdev->ops->disassoc)
+                       return -EOPNOTSUPP;
+               cmd.disassoc.peer_addr = mlme->addr.sa_data;
+               cmd.disassoc.reason_code = mlme->reason_code;
+               return rdev->ops->disassoc(wdev->wiphy, dev, &cmd.disassoc);
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+EXPORT_SYMBOL(cfg80211_wext_siwmlme);
+
+
+/**
+ * cfg80211_wext_freq - get wext frequency for non-"auto"
+ * @wiphy: the wiphy
+ * @freq: the wext freq encoding
+ *
+ * Returns a channel, %NULL for auto, or an ERR_PTR for errors!
+ */
+struct ieee80211_channel *cfg80211_wext_freq(struct wiphy *wiphy,
+                                            struct iw_freq *freq)
+{
+       if (freq->e == 0) {
+               if (freq->m < 0)
+                       return NULL;
+               else
+                       return ieee80211_get_channel(wiphy,
+                               ieee80211_channel_to_frequency(freq->m));
+       } else {
+               int i, div = 1000000;
+               for (i = 0; i < freq->e; i++)
+                       div /= 10;
+               if (div > 0)
+                       return ieee80211_get_channel(wiphy, freq->m / div);
+               else
+                       return ERR_PTR(-EINVAL);
+       }
+
+}
+EXPORT_SYMBOL(cfg80211_wext_freq);