]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/ieee80211/ieee80211_wx.c
[TIPC] Group protocols with sub-options in Kconfig
[karo-tx-linux.git] / net / ieee80211 / ieee80211_wx.c
index ee7a70a132500c5834c8bb8d5e826f2bb8c0c235..23e1630f50b7cf872e01286c01a108cbc66c478f 100644 (file)
@@ -42,7 +42,7 @@ static const char *ieee80211_modes[] = {
 };
 
 #define MAX_CUSTOM_LEN 64
-static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee,
+static char *ipw2100_translate_scan(struct ieee80211_device *ieee,
                                           char *start, char *stop,
                                           struct ieee80211_network *network)
 {
@@ -152,15 +152,20 @@ static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee,
                iwe.u.qual.level = 0;
        } else {
                iwe.u.qual.level = network->stats.rssi;
-               iwe.u.qual.qual =
-                   (100 *
-                    (ieee->perfect_rssi - ieee->worst_rssi) *
-                    (ieee->perfect_rssi - ieee->worst_rssi) -
-                    (ieee->perfect_rssi - network->stats.rssi) *
-                    (15 * (ieee->perfect_rssi - ieee->worst_rssi) +
-                     62 * (ieee->perfect_rssi - network->stats.rssi))) /
-                   ((ieee->perfect_rssi - ieee->worst_rssi) *
-                    (ieee->perfect_rssi - ieee->worst_rssi));
+               if (ieee->perfect_rssi == ieee->worst_rssi)
+                       iwe.u.qual.qual = 100;
+               else
+                       iwe.u.qual.qual =
+                           (100 *
+                            (ieee->perfect_rssi - ieee->worst_rssi) *
+                            (ieee->perfect_rssi - ieee->worst_rssi) -
+                            (ieee->perfect_rssi - network->stats.rssi) *
+                            (15 * (ieee->perfect_rssi - ieee->worst_rssi) +
+                             62 * (ieee->perfect_rssi -
+                                   network->stats.rssi))) /
+                           ((ieee->perfect_rssi -
+                             ieee->worst_rssi) * (ieee->perfect_rssi -
+                                                  ieee->worst_rssi));
                if (iwe.u.qual.qual > 100)
                        iwe.u.qual.qual = 100;
                else if (iwe.u.qual.qual < 1)
@@ -279,7 +284,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee,
        };
        int i, key, key_provided, len;
        struct ieee80211_crypt_data **crypt;
-       int host_crypto = ieee->host_encrypt || ieee->host_decrypt;
+       int host_crypto = ieee->host_encrypt || ieee->host_decrypt || ieee->host_build_iv;
 
        IEEE80211_DEBUG_WX("SET_ENCODE\n");
 
@@ -517,7 +522,8 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
                crypt = &ieee->crypt[idx];
                group_key = 1;
        } else {
-               if (idx != 0)
+               /* some Cisco APs use idx>0 for unicast in dynamic WEP */
+               if (idx != 0 && ext->alg != IW_ENCODE_ALG_WEP)
                        return -EINVAL;
                if (ieee->iw_mode == IW_MODE_INFRA)
                        crypt = &ieee->crypt[idx];
@@ -685,7 +691,8 @@ int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee,
        } else
                idx = ieee->tx_keyidx;
 
-       if (!ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
+       if (!ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY &&
+           ext->alg != IW_ENCODE_ALG_WEP)
                if (idx != 0 || ieee->iw_mode != IW_MODE_INFRA)
                        return -EINVAL;