Skip to content

Commit

Permalink
orinoco: convert mode setting to cfg80211
Browse files Browse the repository at this point in the history
Signed-off-by: David Kilroy <[email protected]>
Signed-off-by: John W. Linville <[email protected]>
  • Loading branch information
kilroyd authored and linvjw committed Jul 10, 2009
1 parent 721aa2f commit 5217c57
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 80 deletions.
46 changes: 45 additions & 1 deletion drivers/net/wireless/orinoco/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
12 changes: 8 additions & 4 deletions drivers/net/wireless/orinoco/hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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 |
Expand All @@ -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;
}

Expand Down Expand Up @@ -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 */
Expand Down
15 changes: 8 additions & 7 deletions drivers/net/wireless/orinoco/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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). */
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/orinoco.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
75 changes: 8 additions & 67 deletions drivers/net/wireless/orinoco/wext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)) {
Expand All @@ -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 |
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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),
Expand Down

0 comments on commit 5217c57

Please sign in to comment.