]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/ipw2100.c
[bug 667] Fix the notorious "No space for Tx" bug.
[linux-2.6] / drivers / net / wireless / ipw2100.c
index cf5da20d1d453697294d35dc69a5d0720a3c05e5..eaf47078ee564c7d1727c6674048ffbb26b30968 100644 (file)
@@ -5102,6 +5102,10 @@ static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
        };
        int err = 0;
 
+       if (tx_power != IPW_TX_POWER_DEFAULT)
+               tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
+                   (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
+
        cmd.host_command_parameters[0] = tx_power;
 
        if (priv->ieee->iw_mode == IW_MODE_ADHOC)
@@ -5876,9 +5880,27 @@ static int ipw2100_wpa_set_param(struct net_device *dev, u8 name, u32 value)
 
                break;
 
-       case IPW2100_PARAM_DROP_UNENCRYPTED:
-               priv->ieee->drop_unencrypted = value;
-               break;
+       case IPW2100_PARAM_DROP_UNENCRYPTED:{
+                       /* See IW_AUTH_DROP_UNENCRYPTED handling for details */
+                       struct ieee80211_security sec = {
+                               .flags = SEC_ENABLED,
+                               .enabled = value,
+                       };
+                       priv->ieee->drop_unencrypted = value;
+                       /* We only change SEC_LEVEL for open mode. Others
+                        * are set by ipw_wpa_set_encryption.
+                        */
+                       if (!value) {
+                               sec.flags |= SEC_LEVEL;
+                               sec.level = SEC_LEVEL_0;
+                       } else {
+                               sec.flags |= SEC_LEVEL;
+                               sec.level = SEC_LEVEL_1;
+                       }
+                       if (priv->ieee->set_security)
+                               priv->ieee->set_security(priv->ieee->dev, &sec);
+                       break;
+               }
 
        case IPW2100_PARAM_PRIVACY_INVOKED:
                priv->ieee->privacy_invoked = value;
@@ -7523,8 +7545,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
                    wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
                        return -EINVAL;
 
-               value = (wrqu->txpower.value - IPW_TX_POWER_MIN_DBM) * 16 /
-                   (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
+               value = wrqu->txpower.value;
        }
 
        down(&priv->action_sem);
@@ -7564,11 +7585,7 @@ static int ipw2100_wx_get_txpow(struct net_device *dev,
        } else {
                wrqu->power.disabled = 0;
                wrqu->power.fixed = 1;
-               wrqu->power.value =
-                   (priv->tx_power *
-                    (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM)) /
-                   (IPW_TX_POWER_MAX - IPW_TX_POWER_MIN) +
-                   IPW_TX_POWER_MIN_DBM;
+               wrqu->power.value = priv->tx_power;
        }
 
        wrqu->power.flags = IW_TXPOW_DBM;