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; }
/* Commit handler, called after set operations */ static int orinoco_ioctl_commit(struct net_device *dev, struct iw_request_info *info, void *wrqu, char *extra) { struct orinoco_private *priv = ndev_priv(dev); unsigned long flags; int err = 0; if (!priv->open) return 0; if (orinoco_lock(priv, &flags) != 0) return err; err = orinoco_commit(priv); orinoco_unlock(priv, &flags); return err; }
static int orinoco_set_wiphy_params(struct wiphy *wiphy, u32 changed) { struct orinoco_private *priv = wiphy_priv(wiphy); int frag_value = -1; int rts_value = -1; int err = 0; if (changed & WIPHY_PARAM_RETRY_SHORT) { err = -EINVAL; } if (changed & WIPHY_PARAM_RETRY_LONG) { err = -EINVAL; } if (changed & WIPHY_PARAM_FRAG_THRESHOLD) { if (priv->has_mwo) { if (wiphy->frag_threshold < 0) frag_value = 0; else { printk(KERN_WARNING "%s: Fixed fragmentation " "is not supported on this firmware. " "Using MWO robust instead.\n", priv->ndev->name); frag_value = 1; } } else { if (wiphy->frag_threshold < 0) frag_value = 2346; else if ((wiphy->frag_threshold < 257) || (wiphy->frag_threshold > 2347)) err = -EINVAL; else frag_value = wiphy->frag_threshold & ~0x1; } } if (changed & WIPHY_PARAM_RTS_THRESHOLD) { if (wiphy->rts_threshold < 0) rts_value = 2347; else if (wiphy->rts_threshold > 2347) err = -EINVAL; else rts_value = wiphy->rts_threshold; } if (!err) { unsigned long flags; if (orinoco_lock(priv, &flags) != 0) return -EBUSY; if (frag_value >= 0) { if (priv->has_mwo) priv->mwo_robust = frag_value; else priv->frag_thresh = frag_value; } if (rts_value >= 0) priv->rts_thresh = rts_value; err = orinoco_commit(priv); orinoco_unlock(priv, &flags); } return err; }
static int orinoco_set_wiphy_params(struct wiphy *wiphy, u32 changed) { struct orinoco_private *priv = wiphy_priv(wiphy); int frag_value = -1; int rts_value = -1; int err = 0; if (changed & WIPHY_PARAM_RETRY_SHORT) { /* Setting short retry not supported */ err = -EINVAL; } if (changed & WIPHY_PARAM_RETRY_LONG) { /* Setting long retry not supported */ err = -EINVAL; } if (changed & WIPHY_PARAM_FRAG_THRESHOLD) { /* Set fragmentation */ if (priv->has_mwo) { if (wiphy->frag_threshold == -1) frag_value = 0; else { printk(KERN_WARNING "%s: Fixed fragmentation " "is not supported on this firmware. " "Using MWO robust instead.\n", priv->ndev->name); frag_value = 1; } } else { if (wiphy->frag_threshold == -1) frag_value = 2346; else if ((wiphy->frag_threshold < 257) || (wiphy->frag_threshold > 2347)) err = -EINVAL; else /* cfg80211 value is 257-2347 (odd only) * orinoco rid has range 256-2346 (even only) */ frag_value = wiphy->frag_threshold & ~0x1; } } if (changed & WIPHY_PARAM_RTS_THRESHOLD) { /* Set RTS. * * Prism documentation suggests default of 2432, * and a range of 0-3000. * * Current implementation uses 2347 as the default and * the upper limit. */ if (wiphy->rts_threshold == -1) rts_value = 2347; else if (wiphy->rts_threshold > 2347) err = -EINVAL; else rts_value = wiphy->rts_threshold; } if (!err) { unsigned long flags; if (orinoco_lock(priv, &flags) != 0) return -EBUSY; if (frag_value >= 0) { if (priv->has_mwo) priv->mwo_robust = frag_value; else priv->frag_thresh = frag_value; } if (rts_value >= 0) priv->rts_thresh = rts_value; err = orinoco_commit(priv); orinoco_unlock(priv, &flags); } return err; }