#include "iwm.h"
 #include "commands.h"
 
-static int iwm_wext_siwfreq(struct net_device *dev,
-                           struct iw_request_info *info,
-                           struct iw_freq *freq, char *extra)
-{
-       struct iwm_priv *iwm = ndev_to_iwm(dev);
-
-       switch (iwm->conf.mode) {
-       case UMAC_MODE_IBSS:
-               return cfg80211_ibss_wext_siwfreq(dev, info, freq, extra);
-       default:
-               return -EOPNOTSUPP;
-       }
-}
-
-static int iwm_wext_giwfreq(struct net_device *dev,
-                           struct iw_request_info *info,
-                           struct iw_freq *freq, char *extra)
-{
-       struct iwm_priv *iwm = ndev_to_iwm(dev);
-
-       switch (iwm->conf.mode) {
-       case UMAC_MODE_IBSS:
-               return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
-       case UMAC_MODE_BSS:
-               return cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
-       default:
-               return -EOPNOTSUPP;
-       }
-}
-
 static int iwm_wext_siwap(struct net_device *dev, struct iw_request_info *info,
                          struct sockaddr *ap_addr, char *extra)
 {
        (iw_handler) cfg80211_wext_giwname,             /* SIOCGIWNAME */
        (iw_handler) NULL,                              /* SIOCSIWNWID */
        (iw_handler) NULL,                              /* SIOCGIWNWID */
-       (iw_handler) iwm_wext_siwfreq,                  /* SIOCSIWFREQ */
-       (iw_handler) iwm_wext_giwfreq,                  /* SIOCGIWFREQ */
+       (iw_handler) cfg80211_wext_siwfreq,             /* SIOCSIWFREQ */
+       (iw_handler) cfg80211_wext_giwfreq,             /* SIOCGIWFREQ */
        (iw_handler) cfg80211_wext_siwmode,             /* SIOCSIWMODE */
        (iw_handler) cfg80211_wext_giwmode,             /* SIOCGIWMODE */
        (iw_handler) NULL,                              /* SIOCSIWSENS */
 
 int cfg80211_wext_giwrange(struct net_device *dev,
                           struct iw_request_info *info,
                           struct iw_point *data, char *extra);
-int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
-                              struct iw_request_info *info,
-                              struct iw_freq *freq, char *extra);
-int cfg80211_ibss_wext_giwfreq(struct net_device *dev,
-                              struct iw_request_info *info,
-                              struct iw_freq *freq, char *extra);
 int cfg80211_ibss_wext_siwessid(struct net_device *dev,
                                struct iw_request_info *info,
                                struct iw_point *data, char *ssid);
                             struct iw_request_info *info,
                             struct sockaddr *ap_addr, char *extra);
 
-int cfg80211_mgd_wext_siwfreq(struct net_device *dev,
-                             struct iw_request_info *info,
-                             struct iw_freq *freq, char *extra);
-int cfg80211_mgd_wext_giwfreq(struct net_device *dev,
-                             struct iw_request_info *info,
-                             struct iw_freq *freq, char *extra);
 int cfg80211_mgd_wext_siwessid(struct net_device *dev,
                               struct iw_request_info *info,
                               struct iw_point *data, char *ssid);
                          struct iw_request_info *info,
                          struct iw_param *data, char *extra);
 
-struct ieee80211_channel *cfg80211_wext_freq(struct wiphy *wiphy,
-                                            struct iw_freq *freq);
+int cfg80211_wext_siwfreq(struct net_device *dev,
+                         struct iw_request_info *info,
+                         struct iw_freq *freq, char *extra);
+int cfg80211_wext_giwfreq(struct net_device *dev,
+                         struct iw_request_info *info,
+                         struct iw_freq *freq, char *extra);
 
 int cfg80211_wext_siwrate(struct net_device *dev,
                          struct iw_request_info *info,
 
 #include "aes_ccm.h"
 
 
-static int ieee80211_ioctl_siwfreq(struct net_device *dev,
-                                  struct iw_request_info *info,
-                                  struct iw_freq *freq, char *extra)
-{
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-       struct ieee80211_local *local = sdata->local;
-       struct ieee80211_channel *chan;
-
-       if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
-               return cfg80211_ibss_wext_siwfreq(dev, info, freq, extra);
-       else if (sdata->vif.type == NL80211_IFTYPE_STATION)
-               return cfg80211_mgd_wext_siwfreq(dev, info, freq, extra);
-
-       /* freq->e == 0: freq->m = channel; otherwise freq = m * 10^e */
-       if (freq->e == 0) {
-               if (freq->m < 0)
-                       return -EINVAL;
-               else
-                       chan = ieee80211_get_channel(local->hw.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 -EINVAL;
-               chan = ieee80211_get_channel(local->hw.wiphy, freq->m / div);
-       }
-
-       if (!chan)
-               return -EINVAL;
-
-       if (chan->flags & IEEE80211_CHAN_DISABLED)
-               return -EINVAL;
-
-       /*
-        * no change except maybe auto -> fixed, ignore the HT
-        * setting so you can fix a channel you're on already
-        */
-       if (local->oper_channel == chan)
-               return 0;
-
-       local->oper_channel = chan;
-       local->oper_channel_type = NL80211_CHAN_NO_HT;
-       ieee80211_hw_config(local, 0);
-
-       return 0;
-}
-
-
-static int ieee80211_ioctl_giwfreq(struct net_device *dev,
-                                  struct iw_request_info *info,
-                                  struct iw_freq *freq, char *extra)
-{
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-
-       if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
-               return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
-       else if (sdata->vif.type == NL80211_IFTYPE_STATION)
-               return cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
-
-       freq->m = local->oper_channel->center_freq;
-       freq->e = 6;
-
-       return 0;
-}
-
-
 static int ieee80211_ioctl_siwessid(struct net_device *dev,
                                    struct iw_request_info *info,
                                    struct iw_point *data, char *ssid)
        (iw_handler) cfg80211_wext_giwname,             /* SIOCGIWNAME */
        (iw_handler) NULL,                              /* SIOCSIWNWID */
        (iw_handler) NULL,                              /* SIOCGIWNWID */
-       (iw_handler) ieee80211_ioctl_siwfreq,           /* SIOCSIWFREQ */
-       (iw_handler) ieee80211_ioctl_giwfreq,           /* SIOCGIWFREQ */
+       (iw_handler) cfg80211_wext_siwfreq,             /* SIOCSIWFREQ */
+       (iw_handler) cfg80211_wext_giwfreq,             /* SIOCGIWFREQ */
        (iw_handler) cfg80211_wext_siwmode,             /* SIOCSIWMODE */
        (iw_handler) cfg80211_wext_giwmode,             /* SIOCGIWMODE */
        (iw_handler) NULL,                              /* SIOCSIWSENS */
 
        struct work_struct conn_work;
        struct work_struct event_work;
 
+       /* current channel */
+       struct ieee80211_channel *channel;
+
 #ifdef CONFIG_CFG80211_DEBUGFS
        /* Debugfs entries */
        struct wiphy_debugfsdentries {
 
 #include <linux/etherdevice.h>
 #include <linux/if_arp.h>
 #include <net/cfg80211.h>
+#include "wext-compat.h"
 #include "nl80211.h"
 
 
 
        return err;
 }
-/* temporary symbol - mark GPL - in the future the handler won't be */
-EXPORT_SYMBOL_GPL(cfg80211_ibss_wext_siwfreq);
 
 int cfg80211_ibss_wext_giwfreq(struct net_device *dev,
                               struct iw_request_info *info,
        /* no channel if not joining */
        return -EINVAL;
 }
-/* temporary symbol - mark GPL - in the future the handler won't be */
-EXPORT_SYMBOL_GPL(cfg80211_ibss_wext_giwfreq);
 
 int cfg80211_ibss_wext_siwessid(struct net_device *dev,
                                struct iw_request_info *info,
 
                                                channel_type);
                if (result)
                        goto bad_res;
+
+               rdev->channel = chan;
        }
 
        changed = 0;
 
 #include <linux/etherdevice.h>
 #include <net/iw_handler.h>
 #include <net/cfg80211.h>
+#include "wext-compat.h"
 #include "core.h"
 
 int cfg80211_wext_giwname(struct net_device *dev,
                return ERR_PTR(-EINVAL);
        return chan;
 }
-EXPORT_SYMBOL_GPL(cfg80211_wext_freq);
 
 int cfg80211_wext_siwrts(struct net_device *dev,
                         struct iw_request_info *info,
 }
 EXPORT_SYMBOL_GPL(cfg80211_wext_giwencode);
 
+int cfg80211_wext_siwfreq(struct net_device *dev,
+                         struct iw_request_info *info,
+                         struct iw_freq *freq, char *extra)
+{
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
+       struct ieee80211_channel *chan;
+       int err;
+
+       switch (wdev->iftype) {
+       case NL80211_IFTYPE_STATION:
+               return cfg80211_mgd_wext_siwfreq(dev, info, freq, extra);
+       case NL80211_IFTYPE_ADHOC:
+               return cfg80211_ibss_wext_siwfreq(dev, info, freq, extra);
+       default:
+               chan = cfg80211_wext_freq(wdev->wiphy, freq);
+               if (!chan)
+                       return -EINVAL;
+               if (IS_ERR(chan))
+                       return PTR_ERR(chan);
+               err = rdev->ops->set_channel(wdev->wiphy, chan,
+                                            NL80211_CHAN_NO_HT);
+               if (err)
+                       return err;
+               rdev->channel = chan;
+               return 0;
+       }
+}
+EXPORT_SYMBOL_GPL(cfg80211_wext_siwfreq);
+
+int cfg80211_wext_giwfreq(struct net_device *dev,
+                         struct iw_request_info *info,
+                         struct iw_freq *freq, char *extra)
+{
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
+
+       switch (wdev->iftype) {
+       case NL80211_IFTYPE_STATION:
+               return cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
+       case NL80211_IFTYPE_ADHOC:
+               return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
+       default:
+               if (!rdev->channel)
+                       return -EINVAL;
+               freq->m = rdev->channel->center_freq;
+               freq->e = 6;
+               return 0;
+       }
+}
+EXPORT_SYMBOL_GPL(cfg80211_wext_giwfreq);
+
 int cfg80211_wext_siwtxpower(struct net_device *dev,
                             struct iw_request_info *info,
                             union iwreq_data *data, char *extra)
 
--- /dev/null
+#ifndef __WEXT_COMPAT
+#define __WEXT_COMPAT
+
+int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
+                              struct iw_request_info *info,
+                              struct iw_freq *freq, char *extra);
+int cfg80211_ibss_wext_giwfreq(struct net_device *dev,
+                              struct iw_request_info *info,
+                              struct iw_freq *freq, char *extra);
+
+int cfg80211_mgd_wext_siwfreq(struct net_device *dev,
+                             struct iw_request_info *info,
+                             struct iw_freq *freq, char *extra);
+int cfg80211_mgd_wext_giwfreq(struct net_device *dev,
+                             struct iw_request_info *info,
+                             struct iw_freq *freq, char *extra);
+
+struct ieee80211_channel *cfg80211_wext_freq(struct wiphy *wiphy,
+                                            struct iw_freq *freq);
+
+#endif /* __WEXT_COMPAT */
 
 #include <linux/etherdevice.h>
 #include <linux/if_arp.h>
 #include <net/cfg80211.h>
+#include "wext-compat.h"
 #include "nl80211.h"
 
 int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
        cfg80211_unlock_rdev(rdev);
        return err;
 }
-/* temporary symbol - mark GPL - in the future the handler won't be */
-EXPORT_SYMBOL_GPL(cfg80211_mgd_wext_siwfreq);
 
 int cfg80211_mgd_wext_giwfreq(struct net_device *dev,
                              struct iw_request_info *info,
        /* no channel if not joining */
        return -EINVAL;
 }
-/* temporary symbol - mark GPL - in the future the handler won't be */
-EXPORT_SYMBOL_GPL(cfg80211_mgd_wext_giwfreq);
 
 int cfg80211_mgd_wext_siwessid(struct net_device *dev,
                               struct iw_request_info *info,