diff options
Diffstat (limited to 'drivers/net/wireless/libertas/assoc.c')
-rw-r--r-- | drivers/net/wireless/libertas/assoc.c | 95 |
1 files changed, 45 insertions, 50 deletions
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c index 751067369ba..f03d5e4e59c 100644 --- a/drivers/net/wireless/libertas/assoc.c +++ b/drivers/net/wireless/libertas/assoc.c | |||
@@ -390,10 +390,8 @@ int lbs_cmd_802_11_rate_adapt_rateset(struct lbs_private *priv, | |||
390 | cmd.enablehwauto = cpu_to_le16(priv->enablehwauto); | 390 | cmd.enablehwauto = cpu_to_le16(priv->enablehwauto); |
391 | cmd.bitmap = lbs_rate_to_fw_bitmap(priv->cur_rate, priv->enablehwauto); | 391 | cmd.bitmap = lbs_rate_to_fw_bitmap(priv->cur_rate, priv->enablehwauto); |
392 | ret = lbs_cmd_with_response(priv, CMD_802_11_RATE_ADAPT_RATESET, &cmd); | 392 | ret = lbs_cmd_with_response(priv, CMD_802_11_RATE_ADAPT_RATESET, &cmd); |
393 | if (!ret && cmd_action == CMD_ACT_GET) { | 393 | if (!ret && cmd_action == CMD_ACT_GET) |
394 | priv->ratebitmap = le16_to_cpu(cmd.bitmap); | ||
395 | priv->enablehwauto = le16_to_cpu(cmd.enablehwauto); | 394 | priv->enablehwauto = le16_to_cpu(cmd.enablehwauto); |
396 | } | ||
397 | 395 | ||
398 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); | 396 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); |
399 | return ret; | 397 | return ret; |
@@ -807,8 +805,7 @@ static int lbs_try_associate(struct lbs_private *priv, | |||
807 | } | 805 | } |
808 | 806 | ||
809 | /* Use short preamble only when both the BSS and firmware support it */ | 807 | /* Use short preamble only when both the BSS and firmware support it */ |
810 | if ((priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && | 808 | if (assoc_req->bss.capability & WLAN_CAPABILITY_SHORT_PREAMBLE) |
811 | (assoc_req->bss.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) | ||
812 | preamble = RADIO_PREAMBLE_SHORT; | 809 | preamble = RADIO_PREAMBLE_SHORT; |
813 | 810 | ||
814 | ret = lbs_set_radio(priv, preamble, 1); | 811 | ret = lbs_set_radio(priv, preamble, 1); |
@@ -939,8 +936,7 @@ static int lbs_adhoc_join(struct lbs_private *priv, | |||
939 | } | 936 | } |
940 | 937 | ||
941 | /* Use short preamble only when both the BSS and firmware support it */ | 938 | /* Use short preamble only when both the BSS and firmware support it */ |
942 | if ((priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && | 939 | if (bss->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) { |
943 | (bss->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) { | ||
944 | lbs_deb_join("AdhocJoin: Short preamble\n"); | 940 | lbs_deb_join("AdhocJoin: Short preamble\n"); |
945 | preamble = RADIO_PREAMBLE_SHORT; | 941 | preamble = RADIO_PREAMBLE_SHORT; |
946 | } | 942 | } |
@@ -1049,7 +1045,7 @@ static int lbs_adhoc_start(struct lbs_private *priv, | |||
1049 | struct assoc_request *assoc_req) | 1045 | struct assoc_request *assoc_req) |
1050 | { | 1046 | { |
1051 | struct cmd_ds_802_11_ad_hoc_start cmd; | 1047 | struct cmd_ds_802_11_ad_hoc_start cmd; |
1052 | u8 preamble = RADIO_PREAMBLE_LONG; | 1048 | u8 preamble = RADIO_PREAMBLE_SHORT; |
1053 | size_t ratesize = 0; | 1049 | size_t ratesize = 0; |
1054 | u16 tmpcap = 0; | 1050 | u16 tmpcap = 0; |
1055 | int ret = 0; | 1051 | int ret = 0; |
@@ -1057,11 +1053,6 @@ static int lbs_adhoc_start(struct lbs_private *priv, | |||
1057 | 1053 | ||
1058 | lbs_deb_enter(LBS_DEB_ASSOC); | 1054 | lbs_deb_enter(LBS_DEB_ASSOC); |
1059 | 1055 | ||
1060 | if (priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) { | ||
1061 | lbs_deb_join("ADHOC_START: Will use short preamble\n"); | ||
1062 | preamble = RADIO_PREAMBLE_SHORT; | ||
1063 | } | ||
1064 | |||
1065 | ret = lbs_set_radio(priv, preamble, 1); | 1056 | ret = lbs_set_radio(priv, preamble, 1); |
1066 | if (ret) | 1057 | if (ret) |
1067 | goto out; | 1058 | goto out; |
@@ -1169,11 +1160,11 @@ int lbs_adhoc_stop(struct lbs_private *priv) | |||
1169 | static inline int match_bss_no_security(struct lbs_802_11_security *secinfo, | 1160 | static inline int match_bss_no_security(struct lbs_802_11_security *secinfo, |
1170 | struct bss_descriptor *match_bss) | 1161 | struct bss_descriptor *match_bss) |
1171 | { | 1162 | { |
1172 | if (!secinfo->wep_enabled && !secinfo->WPAenabled | 1163 | if (!secinfo->wep_enabled && |
1173 | && !secinfo->WPA2enabled | 1164 | !secinfo->WPAenabled && !secinfo->WPA2enabled && |
1174 | && match_bss->wpa_ie[0] != WLAN_EID_GENERIC | 1165 | match_bss->wpa_ie[0] != WLAN_EID_GENERIC && |
1175 | && match_bss->rsn_ie[0] != WLAN_EID_RSN | 1166 | match_bss->rsn_ie[0] != WLAN_EID_RSN && |
1176 | && !(match_bss->capability & WLAN_CAPABILITY_PRIVACY)) | 1167 | !(match_bss->capability & WLAN_CAPABILITY_PRIVACY)) |
1177 | return 1; | 1168 | return 1; |
1178 | else | 1169 | else |
1179 | return 0; | 1170 | return 0; |
@@ -1182,9 +1173,9 @@ static inline int match_bss_no_security(struct lbs_802_11_security *secinfo, | |||
1182 | static inline int match_bss_static_wep(struct lbs_802_11_security *secinfo, | 1173 | static inline int match_bss_static_wep(struct lbs_802_11_security *secinfo, |
1183 | struct bss_descriptor *match_bss) | 1174 | struct bss_descriptor *match_bss) |
1184 | { | 1175 | { |
1185 | if (secinfo->wep_enabled && !secinfo->WPAenabled | 1176 | if (secinfo->wep_enabled && |
1186 | && !secinfo->WPA2enabled | 1177 | !secinfo->WPAenabled && !secinfo->WPA2enabled && |
1187 | && (match_bss->capability & WLAN_CAPABILITY_PRIVACY)) | 1178 | (match_bss->capability & WLAN_CAPABILITY_PRIVACY)) |
1188 | return 1; | 1179 | return 1; |
1189 | else | 1180 | else |
1190 | return 0; | 1181 | return 0; |
@@ -1193,8 +1184,8 @@ static inline int match_bss_static_wep(struct lbs_802_11_security *secinfo, | |||
1193 | static inline int match_bss_wpa(struct lbs_802_11_security *secinfo, | 1184 | static inline int match_bss_wpa(struct lbs_802_11_security *secinfo, |
1194 | struct bss_descriptor *match_bss) | 1185 | struct bss_descriptor *match_bss) |
1195 | { | 1186 | { |
1196 | if (!secinfo->wep_enabled && secinfo->WPAenabled | 1187 | if (!secinfo->wep_enabled && secinfo->WPAenabled && |
1197 | && (match_bss->wpa_ie[0] == WLAN_EID_GENERIC) | 1188 | (match_bss->wpa_ie[0] == WLAN_EID_GENERIC) |
1198 | /* privacy bit may NOT be set in some APs like LinkSys WRT54G | 1189 | /* privacy bit may NOT be set in some APs like LinkSys WRT54G |
1199 | && (match_bss->capability & WLAN_CAPABILITY_PRIVACY) */ | 1190 | && (match_bss->capability & WLAN_CAPABILITY_PRIVACY) */ |
1200 | ) | 1191 | ) |
@@ -1219,11 +1210,11 @@ static inline int match_bss_wpa2(struct lbs_802_11_security *secinfo, | |||
1219 | static inline int match_bss_dynamic_wep(struct lbs_802_11_security *secinfo, | 1210 | static inline int match_bss_dynamic_wep(struct lbs_802_11_security *secinfo, |
1220 | struct bss_descriptor *match_bss) | 1211 | struct bss_descriptor *match_bss) |
1221 | { | 1212 | { |
1222 | if (!secinfo->wep_enabled && !secinfo->WPAenabled | 1213 | if (!secinfo->wep_enabled && |
1223 | && !secinfo->WPA2enabled | 1214 | !secinfo->WPAenabled && !secinfo->WPA2enabled && |
1224 | && (match_bss->wpa_ie[0] != WLAN_EID_GENERIC) | 1215 | (match_bss->wpa_ie[0] != WLAN_EID_GENERIC) && |
1225 | && (match_bss->rsn_ie[0] != WLAN_EID_RSN) | 1216 | (match_bss->rsn_ie[0] != WLAN_EID_RSN) && |
1226 | && (match_bss->capability & WLAN_CAPABILITY_PRIVACY)) | 1217 | (match_bss->capability & WLAN_CAPABILITY_PRIVACY)) |
1227 | return 1; | 1218 | return 1; |
1228 | else | 1219 | else |
1229 | return 0; | 1220 | return 0; |
@@ -1534,8 +1525,8 @@ static int assoc_helper_associate(struct lbs_private *priv, | |||
1534 | /* If we're given and 'any' BSSID, try associating based on SSID */ | 1525 | /* If we're given and 'any' BSSID, try associating based on SSID */ |
1535 | 1526 | ||
1536 | if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) { | 1527 | if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) { |
1537 | if (compare_ether_addr(bssid_any, assoc_req->bssid) | 1528 | if (compare_ether_addr(bssid_any, assoc_req->bssid) && |
1538 | && compare_ether_addr(bssid_off, assoc_req->bssid)) { | 1529 | compare_ether_addr(bssid_off, assoc_req->bssid)) { |
1539 | ret = assoc_helper_bssid(priv, assoc_req); | 1530 | ret = assoc_helper_bssid(priv, assoc_req); |
1540 | done = 1; | 1531 | done = 1; |
1541 | } | 1532 | } |
@@ -1621,11 +1612,9 @@ static int assoc_helper_channel(struct lbs_private *priv, | |||
1621 | goto restore_mesh; | 1612 | goto restore_mesh; |
1622 | } | 1613 | } |
1623 | 1614 | ||
1624 | if ( assoc_req->secinfo.wep_enabled | 1615 | if (assoc_req->secinfo.wep_enabled && |
1625 | && (assoc_req->wep_keys[0].len | 1616 | (assoc_req->wep_keys[0].len || assoc_req->wep_keys[1].len || |
1626 | || assoc_req->wep_keys[1].len | 1617 | assoc_req->wep_keys[2].len || assoc_req->wep_keys[3].len)) { |
1627 | || assoc_req->wep_keys[2].len | ||
1628 | || assoc_req->wep_keys[3].len)) { | ||
1629 | /* Make sure WEP keys are re-sent to firmware */ | 1618 | /* Make sure WEP keys are re-sent to firmware */ |
1630 | set_bit(ASSOC_FLAG_WEP_KEYS, &assoc_req->flags); | 1619 | set_bit(ASSOC_FLAG_WEP_KEYS, &assoc_req->flags); |
1631 | } | 1620 | } |
@@ -1992,14 +1981,14 @@ void lbs_association_worker(struct work_struct *work) | |||
1992 | assoc_req->secinfo.auth_mode); | 1981 | assoc_req->secinfo.auth_mode); |
1993 | 1982 | ||
1994 | /* If 'any' SSID was specified, find an SSID to associate with */ | 1983 | /* If 'any' SSID was specified, find an SSID to associate with */ |
1995 | if (test_bit(ASSOC_FLAG_SSID, &assoc_req->flags) | 1984 | if (test_bit(ASSOC_FLAG_SSID, &assoc_req->flags) && |
1996 | && !assoc_req->ssid_len) | 1985 | !assoc_req->ssid_len) |
1997 | find_any_ssid = 1; | 1986 | find_any_ssid = 1; |
1998 | 1987 | ||
1999 | /* But don't use 'any' SSID if there's a valid locked BSSID to use */ | 1988 | /* But don't use 'any' SSID if there's a valid locked BSSID to use */ |
2000 | if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) { | 1989 | if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) { |
2001 | if (compare_ether_addr(assoc_req->bssid, bssid_any) | 1990 | if (compare_ether_addr(assoc_req->bssid, bssid_any) && |
2002 | && compare_ether_addr(assoc_req->bssid, bssid_off)) | 1991 | compare_ether_addr(assoc_req->bssid, bssid_off)) |
2003 | find_any_ssid = 0; | 1992 | find_any_ssid = 0; |
2004 | } | 1993 | } |
2005 | 1994 | ||
@@ -2061,13 +2050,6 @@ void lbs_association_worker(struct work_struct *work) | |||
2061 | goto out; | 2050 | goto out; |
2062 | } | 2051 | } |
2063 | 2052 | ||
2064 | if ( test_bit(ASSOC_FLAG_WEP_KEYS, &assoc_req->flags) | ||
2065 | || test_bit(ASSOC_FLAG_WEP_TX_KEYIDX, &assoc_req->flags)) { | ||
2066 | ret = assoc_helper_wep_keys(priv, assoc_req); | ||
2067 | if (ret) | ||
2068 | goto out; | ||
2069 | } | ||
2070 | |||
2071 | if (test_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags)) { | 2053 | if (test_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags)) { |
2072 | ret = assoc_helper_secinfo(priv, assoc_req); | 2054 | ret = assoc_helper_secinfo(priv, assoc_req); |
2073 | if (ret) | 2055 | if (ret) |
@@ -2080,18 +2062,31 @@ void lbs_association_worker(struct work_struct *work) | |||
2080 | goto out; | 2062 | goto out; |
2081 | } | 2063 | } |
2082 | 2064 | ||
2083 | if (test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags) | 2065 | /* |
2084 | || test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) { | 2066 | * v10 FW wants WPA keys to be set/cleared before WEP key operations, |
2067 | * otherwise it will fail to correctly associate to WEP networks. | ||
2068 | * Other firmware versions don't appear to care. | ||
2069 | */ | ||
2070 | if (test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags) || | ||
2071 | test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) { | ||
2085 | ret = assoc_helper_wpa_keys(priv, assoc_req); | 2072 | ret = assoc_helper_wpa_keys(priv, assoc_req); |
2086 | if (ret) | 2073 | if (ret) |
2087 | goto out; | 2074 | goto out; |
2088 | } | 2075 | } |
2089 | 2076 | ||
2077 | if (test_bit(ASSOC_FLAG_WEP_KEYS, &assoc_req->flags) || | ||
2078 | test_bit(ASSOC_FLAG_WEP_TX_KEYIDX, &assoc_req->flags)) { | ||
2079 | ret = assoc_helper_wep_keys(priv, assoc_req); | ||
2080 | if (ret) | ||
2081 | goto out; | ||
2082 | } | ||
2083 | |||
2084 | |||
2090 | /* SSID/BSSID should be the _last_ config option set, because they | 2085 | /* SSID/BSSID should be the _last_ config option set, because they |
2091 | * trigger the association attempt. | 2086 | * trigger the association attempt. |
2092 | */ | 2087 | */ |
2093 | if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags) | 2088 | if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags) || |
2094 | || test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) { | 2089 | test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) { |
2095 | int success = 1; | 2090 | int success = 1; |
2096 | 2091 | ||
2097 | ret = assoc_helper_associate(priv, assoc_req); | 2092 | ret = assoc_helper_associate(priv, assoc_req); |