|
@@ -2100,8 +2100,9 @@ static int __orinoco_hw_setup_wep(struct orinoco_private *priv)
|
|
|
int err = 0;
|
|
|
int master_wep_flag;
|
|
|
int auth_flag;
|
|
|
+ int enc_flag;
|
|
|
|
|
|
- if (priv->wep_on)
|
|
|
+ if (priv->encode_alg == IW_ENCODE_ALG_WEP)
|
|
|
__orinoco_hw_setup_wepkeys(priv);
|
|
|
|
|
|
if (priv->wep_restrict)
|
|
@@ -2109,9 +2110,14 @@ static int __orinoco_hw_setup_wep(struct orinoco_private *priv)
|
|
|
else
|
|
|
auth_flag = HERMES_AUTH_OPEN;
|
|
|
|
|
|
+ if (priv->encode_alg == IW_ENCODE_ALG_WEP)
|
|
|
+ enc_flag = 1;
|
|
|
+ else
|
|
|
+ enc_flag = 0;
|
|
|
+
|
|
|
switch (priv->firmware_type) {
|
|
|
case FIRMWARE_TYPE_AGERE: /* Agere style WEP */
|
|
|
- if (priv->wep_on) {
|
|
|
+ if (priv->encode_alg == IW_ENCODE_ALG_WEP) {
|
|
|
/* Enable the shared-key authentication. */
|
|
|
err = hermes_write_wordrec(hw, USER_BAP,
|
|
|
HERMES_RID_CNFAUTHENTICATION_AGERE,
|
|
@@ -2119,14 +2125,14 @@ static int __orinoco_hw_setup_wep(struct orinoco_private *priv)
|
|
|
}
|
|
|
err = hermes_write_wordrec(hw, USER_BAP,
|
|
|
HERMES_RID_CNFWEPENABLED_AGERE,
|
|
|
- priv->wep_on);
|
|
|
+ enc_flag);
|
|
|
if (err)
|
|
|
return err;
|
|
|
break;
|
|
|
|
|
|
case FIRMWARE_TYPE_INTERSIL: /* Intersil style WEP */
|
|
|
case FIRMWARE_TYPE_SYMBOL: /* Symbol style WEP */
|
|
|
- if (priv->wep_on) {
|
|
|
+ if (priv->encode_alg == IW_ENCODE_ALG_WEP) {
|
|
|
if (priv->wep_restrict ||
|
|
|
(priv->firmware_type == FIRMWARE_TYPE_SYMBOL))
|
|
|
master_wep_flag = HERMES_WEP_PRIVACY_INVOKED |
|
|
@@ -3008,7 +3014,7 @@ static int orinoco_init(struct net_device *dev)
|
|
|
priv->channel = 0; /* use firmware default */
|
|
|
|
|
|
priv->promiscuous = 0;
|
|
|
- priv->wep_on = 0;
|
|
|
+ priv->encode_alg = IW_ENCODE_ALG_NONE;
|
|
|
priv->tx_key = 0;
|
|
|
|
|
|
/* Make the hardware available, as long as it hasn't been
|
|
@@ -3497,7 +3503,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
|
|
|
struct orinoco_private *priv = netdev_priv(dev);
|
|
|
int index = (erq->flags & IW_ENCODE_INDEX) - 1;
|
|
|
int setindex = priv->tx_key;
|
|
|
- int enable = priv->wep_on;
|
|
|
+ int encode_alg = priv->encode_alg;
|
|
|
int restricted = priv->wep_restrict;
|
|
|
u16 xlen = 0;
|
|
|
int err = -EINPROGRESS; /* Call commit handler */
|
|
@@ -3531,9 +3537,9 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
|
|
|
xlen = 0;
|
|
|
|
|
|
/* Switch on WEP if off */
|
|
|
- if ((!enable) && (xlen > 0)) {
|
|
|
+ if ((encode_alg != IW_ENCODE_ALG_WEP) && (xlen > 0)) {
|
|
|
setindex = index;
|
|
|
- enable = 1;
|
|
|
+ encode_alg = IW_ENCODE_ALG_WEP;
|
|
|
}
|
|
|
} else {
|
|
|
/* Important note : if the user do "iwconfig eth0 enc off",
|
|
@@ -3555,7 +3561,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
|
|
|
}
|
|
|
|
|
|
if (erq->flags & IW_ENCODE_DISABLED)
|
|
|
- enable = 0;
|
|
|
+ encode_alg = IW_ENCODE_ALG_NONE;
|
|
|
if (erq->flags & IW_ENCODE_OPEN)
|
|
|
restricted = 0;
|
|
|
if (erq->flags & IW_ENCODE_RESTRICTED)
|
|
@@ -3570,14 +3576,15 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
|
|
|
priv->tx_key = setindex;
|
|
|
|
|
|
/* Try fast key change if connected and only keys are changed */
|
|
|
- if (priv->wep_on && enable && (priv->wep_restrict == restricted) &&
|
|
|
+ if ((priv->encode_alg == encode_alg) &&
|
|
|
+ (priv->wep_restrict == restricted) &&
|
|
|
netif_carrier_ok(dev)) {
|
|
|
err = __orinoco_hw_setup_wepkeys(priv);
|
|
|
/* No need to commit if successful */
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- priv->wep_on = enable;
|
|
|
+ priv->encode_alg = encode_alg;
|
|
|
priv->wep_restrict = restricted;
|
|
|
|
|
|
out:
|
|
@@ -3606,7 +3613,7 @@ static int orinoco_ioctl_getiwencode(struct net_device *dev,
|
|
|
index = priv->tx_key;
|
|
|
|
|
|
erq->flags = 0;
|
|
|
- if (! priv->wep_on)
|
|
|
+ if (!priv->encode_alg)
|
|
|
erq->flags |= IW_ENCODE_DISABLED;
|
|
|
erq->flags |= index + 1;
|
|
|
|