orinoco: convert mode setting to cfg80211
authorDavid Kilroy <kilroyd@googlemail.com>
Thu, 18 Jun 2009 22:21:32 +0000 (23:21 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 10 Jul 2009 19:01:46 +0000 (15:01 -0400)
Signed-off-by: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/orinoco/cfg.c
drivers/net/wireless/orinoco/hw.c
drivers/net/wireless/orinoco/main.c
drivers/net/wireless/orinoco/orinoco.h
drivers/net/wireless/orinoco/wext.c

index 9a616ddac0917c3f2df76f530d2ee8de29d169b7..9e59d90b32e419ec315a8f89660c8542027ca0ca 100644 (file)
@@ -93,6 +93,50 @@ int orinoco_wiphy_register(struct wiphy *wiphy)
        return wiphy_register(wiphy);
 }
 
-const struct cfg80211_ops orinoco_cfg_ops = {
+static int orinoco_change_vif(struct wiphy *wiphy, struct net_device *dev,
+                             enum nl80211_iftype type, u32 *flags,
+                             struct vif_params *params)
+{
+       struct orinoco_private *priv = wiphy_priv(wiphy);
+       int err = 0;
+       unsigned long lock;
+
+       if (orinoco_lock(priv, &lock) != 0)
+               return -EBUSY;
+
+       switch (type) {
+       case NL80211_IFTYPE_ADHOC:
+               if (!priv->has_ibss && !priv->has_port3)
+                       err = -EINVAL;
+               break;
+
+       case NL80211_IFTYPE_STATION:
+               break;
+
+       case NL80211_IFTYPE_MONITOR:
+               if (priv->broken_monitor && !force_monitor) {
+                       printk(KERN_WARNING "%s: Monitor mode support is "
+                              "buggy in this firmware, not enabling\n",
+                              wiphy_name(wiphy));
+                       err = -EINVAL;
+               }
+               break;
+
+       default:
+               err = -EINVAL;
+       }
 
+       if (!err) {
+               priv->iw_mode = type;
+               set_port_type(priv);
+               err = orinoco_commit(priv);
+       }
+
+       orinoco_unlock(priv, &lock);
+
+       return err;
+}
+
+const struct cfg80211_ops orinoco_cfg_ops = {
+       .change_virtual_intf = orinoco_change_vif,
 };
index 56627d91aa706cb802668165e95d876d38e46edf..4600fe4a7e1caed44eeb831f4e5beb89dd02012e 100644 (file)
@@ -7,7 +7,7 @@
 #include <linux/if_arp.h>
 #include <linux/ieee80211.h>
 #include <linux/wireless.h>
-
+#include <net/cfg80211.h>
 #include "hermes.h"
 #include "hermes_rid.h"
 #include "orinoco.h"
@@ -409,6 +409,7 @@ void orinoco_get_ratemode_cfg(int ratemode, int *bitrate, int *automatic)
 int orinoco_hw_program_rids(struct orinoco_private *priv)
 {
        struct net_device *dev = priv->ndev;
+       struct wireless_dev *wdev = netdev_priv(dev);
        hermes_t *hw = &priv->hw;
        int err;
        struct hermes_idstring idbuf;
@@ -431,7 +432,7 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
                return err;
        }
        /* Set the channel/frequency */
-       if (priv->channel != 0 && priv->iw_mode != IW_MODE_INFRA) {
+       if (priv->channel != 0 && priv->iw_mode != NL80211_IFTYPE_STATION) {
                err = hermes_write_wordrec(hw, USER_BAP,
                                           HERMES_RID_CNFOWNCHANNEL,
                                           priv->channel);
@@ -612,7 +613,7 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
                }
        }
 
-       if (priv->iw_mode == IW_MODE_MONITOR) {
+       if (priv->iw_mode == NL80211_IFTYPE_MONITOR) {
                /* Enable monitor mode */
                dev->type = ARPHRD_IEEE80211;
                err = hermes_docmd_wait(hw, HERMES_CMD_TEST |
@@ -630,6 +631,9 @@ int orinoco_hw_program_rids(struct orinoco_private *priv)
        priv->promiscuous = 0;
        priv->mc_count = 0;
 
+       /* Record mode change */
+       wdev->iftype = priv->iw_mode;
+
        return 0;
 }
 
@@ -884,7 +888,7 @@ int __orinoco_hw_setup_enc(struct orinoco_private *priv)
                } else
                        master_wep_flag = 0;
 
-               if (priv->iw_mode == IW_MODE_MONITOR)
+               if (priv->iw_mode == NL80211_IFTYPE_MONITOR)
                        master_wep_flag |= HERMES_WEP_HOST_DECRYPT;
 
                /* Master WEP setting : on/off */
index dab6649ad0cbcc05e7dd4b552b9245aa942b27c3..ebf92ae6e365b1057f422920b06e9116327110a8 100644 (file)
@@ -222,11 +222,11 @@ static int __orinoco_commit(struct orinoco_private *priv);
 void set_port_type(struct orinoco_private *priv)
 {
        switch (priv->iw_mode) {
-       case IW_MODE_INFRA:
+       case NL80211_IFTYPE_STATION:
                priv->port_type = 1;
                priv->createibss = 0;
                break;
-       case IW_MODE_ADHOC:
+       case NL80211_IFTYPE_ADHOC:
                if (priv->prefer_port3) {
                        priv->port_type = 3;
                        priv->createibss = 0;
@@ -235,7 +235,7 @@ void set_port_type(struct orinoco_private *priv)
                        priv->createibss = 1;
                }
                break;
-       case IW_MODE_MONITOR:
+       case NL80211_IFTYPE_MONITOR:
                priv->port_type = 3;
                priv->createibss = 0;
                break;
@@ -359,7 +359,8 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
                return NETDEV_TX_BUSY;
        }
 
-       if (!netif_carrier_ok(dev) || (priv->iw_mode == IW_MODE_MONITOR)) {
+       if (!netif_carrier_ok(dev) ||
+           (priv->iw_mode == NL80211_IFTYPE_MONITOR)) {
                /* Oops, the firmware hasn't established a connection,
                   silently drop the packet (this seems to be the
                   safest approach). */
@@ -820,7 +821,7 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
        }
 
        /* Handle frames in monitor mode */
-       if (priv->iw_mode == IW_MODE_MONITOR) {
+       if (priv->iw_mode == NL80211_IFTYPE_MONITOR) {
                orinoco_rx_monitor(dev, rxfid, desc);
                goto out;
        }
@@ -1331,7 +1332,7 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
                u16 newstatus;
                int connected;
 
-               if (priv->iw_mode == IW_MODE_MONITOR)
+               if (priv->iw_mode == NL80211_IFTYPE_MONITOR)
                        break;
 
                if (len != sizeof(linkstatus)) {
@@ -1981,7 +1982,7 @@ int orinoco_init(struct orinoco_private *priv)
        }
 
        /* Set up the default configuration */
-       priv->iw_mode = IW_MODE_INFRA;
+       priv->iw_mode = NL80211_IFTYPE_STATION;
        /* By default use IEEE/IBSS ad-hoc mode if we have it */
        priv->prefer_port3 = priv->has_port3 && (!priv->has_ibss);
        set_port_type(priv);
index 4ee85f8f6bc77beb5be0c2ca024e551a10e90b2a..0c89c281e3e2b1b5b4e6eb47cf1b058f407424ac 100644 (file)
@@ -121,7 +121,7 @@ struct orinoco_private {
        unsigned int broken_monitor:1;
 
        /* Configuration paramaters */
-       u32 iw_mode;
+       enum nl80211_iftype iw_mode;
        int prefer_port3;
        u16 encode_alg, wep_restrict, tx_key;
        struct orinoco_key keys[ORINOCO_MAX_KEYS];
index 4c20b1d5c2a2ccfaccec51c9585d5d9ce677233c..9cd991a41ad44eb4aaec4aeaa4543b2ea0d37c5a 100644 (file)
@@ -52,7 +52,7 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
         * here so we're not safe to sleep here. */
        hermes_inquire(hw, HERMES_INQ_TALLIES);
 
-       if (priv->iw_mode == IW_MODE_ADHOC) {
+       if (priv->iw_mode == NL80211_IFTYPE_ADHOC) {
                memset(&wstats->qual, 0, sizeof(wstats->qual));
                /* If a spy address is defined, we report stats of the
                 * first spy address - Jean II */
@@ -124,7 +124,7 @@ static int orinoco_ioctl_setwap(struct net_device *dev,
                goto out;
        }
 
-       if (priv->iw_mode != IW_MODE_INFRA) {
+       if (priv->iw_mode != NL80211_IFTYPE_STATION) {
                printk(KERN_WARNING "%s: Manual roaming supported only in "
                       "managed mode\n", dev->name);
                err = -EOPNOTSUPP;
@@ -172,65 +172,6 @@ static int orinoco_ioctl_getwap(struct net_device *dev,
        return err;
 }
 
-static int orinoco_ioctl_setmode(struct net_device *dev,
-                                struct iw_request_info *info,
-                                u32 *mode,
-                                char *extra)
-{
-       struct orinoco_private *priv = ndev_priv(dev);
-       int err = -EINPROGRESS;         /* Call commit handler */
-       unsigned long flags;
-
-       if (priv->iw_mode == *mode)
-               return 0;
-
-       if (orinoco_lock(priv, &flags) != 0)
-               return -EBUSY;
-
-       switch (*mode) {
-       case IW_MODE_ADHOC:
-               if (!priv->has_ibss && !priv->has_port3)
-                       err = -EOPNOTSUPP;
-               break;
-
-       case IW_MODE_INFRA:
-               break;
-
-       case IW_MODE_MONITOR:
-               if (priv->broken_monitor && !force_monitor) {
-                       printk(KERN_WARNING "%s: Monitor mode support is "
-                              "buggy in this firmware, not enabling\n",
-                              dev->name);
-                       err = -EOPNOTSUPP;
-               }
-               break;
-
-       default:
-               err = -EOPNOTSUPP;
-               break;
-       }
-
-       if (err == -EINPROGRESS) {
-               priv->iw_mode = *mode;
-               set_port_type(priv);
-       }
-
-       orinoco_unlock(priv, &flags);
-
-       return err;
-}
-
-static int orinoco_ioctl_getmode(struct net_device *dev,
-                                struct iw_request_info *info,
-                                u32 *mode,
-                                char *extra)
-{
-       struct orinoco_private *priv = ndev_priv(dev);
-
-       *mode = priv->iw_mode;
-       return 0;
-}
-
 static int orinoco_ioctl_getiwrange(struct net_device *dev,
                                    struct iw_request_info *info,
                                    struct iw_point *rrq,
@@ -280,7 +221,7 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev,
        if (priv->has_wpa)
                range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_CIPHER_TKIP;
 
-       if ((priv->iw_mode == IW_MODE_ADHOC) && (!SPY_NUMBER(priv))) {
+       if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) && (!SPY_NUMBER(priv))) {
                /* Quality stats meaningless in ad-hoc mode */
        } else {
                range->max_qual.qual = 0x8b - 0x2f;
@@ -596,7 +537,7 @@ static int orinoco_ioctl_setfreq(struct net_device *dev,
        int err = -EINPROGRESS;         /* Call commit handler */
 
        /* In infrastructure mode the AP sets the channel */
-       if (priv->iw_mode == IW_MODE_INFRA)
+       if (priv->iw_mode == NL80211_IFTYPE_STATION)
                return -EBUSY;
 
        if ((frq->e == 0) && (frq->m <= 1000)) {
@@ -622,7 +563,7 @@ static int orinoco_ioctl_setfreq(struct net_device *dev,
                return -EBUSY;
 
        priv->channel = chan;
-       if (priv->iw_mode == IW_MODE_MONITOR) {
+       if (priv->iw_mode == NL80211_IFTYPE_MONITOR) {
                /* Fast channel change - no commit if successful */
                hermes_t *hw = &priv->hw;
                err = hermes_docmd_wait(hw, HERMES_CMD_TEST |
@@ -1673,7 +1614,7 @@ static int orinoco_ioctl_setscan(struct net_device *dev,
        /* In monitor mode, the scan results are always empty.
         * Probe responses are passed to the driver as received
         * frames and could be processed in software. */
-       if (priv->iw_mode == IW_MODE_MONITOR) {
+       if (priv->iw_mode == NL80211_IFTYPE_MONITOR) {
                err = -EOPNOTSUPP;
                goto out;
        }
@@ -2209,8 +2150,8 @@ static const iw_handler   orinoco_handler[] = {
        STD_IW_HANDLER(SIOCGIWNAME,     cfg80211_wext_giwname),
        STD_IW_HANDLER(SIOCSIWFREQ,     orinoco_ioctl_setfreq),
        STD_IW_HANDLER(SIOCGIWFREQ,     orinoco_ioctl_getfreq),
-       STD_IW_HANDLER(SIOCSIWMODE,     orinoco_ioctl_setmode),
-       STD_IW_HANDLER(SIOCGIWMODE,     orinoco_ioctl_getmode),
+       STD_IW_HANDLER(SIOCSIWMODE,     cfg80211_wext_siwmode),
+       STD_IW_HANDLER(SIOCGIWMODE,     cfg80211_wext_giwmode),
        STD_IW_HANDLER(SIOCSIWSENS,     orinoco_ioctl_setsens),
        STD_IW_HANDLER(SIOCGIWSENS,     orinoco_ioctl_getsens),
        STD_IW_HANDLER(SIOCGIWRANGE,    orinoco_ioctl_getiwrange),