diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2009-10-16 01:18:57 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-10-27 16:48:27 -0400 |
commit | 9829e1b510214956bc9d5e278be49d781e1a6fbf (patch) | |
tree | 412d0c279ee0a341ad467da3d466e7d8f505b1fd /drivers/net/wireless/iwmc3200wifi/main.c | |
parent | 56e3f085f5b5e49cca37a3d1b0aa4266b984eb12 (diff) |
iwmc3200wifi: Try shared auth when open WEP fails
When we fail to associate with an open WEP AP, we fall back to shared auth.
This allows us to support joining a shared auth WEP AP with iwconfig.
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwmc3200wifi/main.c')
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/main.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwmc3200wifi/main.c b/drivers/net/wireless/iwmc3200wifi/main.c index 3147fe7b5130..952701e6127e 100644 --- a/drivers/net/wireless/iwmc3200wifi/main.c +++ b/drivers/net/wireless/iwmc3200wifi/main.c | |||
@@ -207,6 +207,33 @@ static void iwm_reset_worker(struct work_struct *work) | |||
207 | mutex_unlock(&iwm->mutex); | 207 | mutex_unlock(&iwm->mutex); |
208 | } | 208 | } |
209 | 209 | ||
210 | static void iwm_auth_retry_worker(struct work_struct *work) | ||
211 | { | ||
212 | struct iwm_priv *iwm; | ||
213 | int i, ret; | ||
214 | |||
215 | iwm = container_of(work, struct iwm_priv, auth_retry_worker); | ||
216 | if (iwm->umac_profile_active) { | ||
217 | ret = iwm_invalidate_mlme_profile(iwm); | ||
218 | if (ret < 0) | ||
219 | return; | ||
220 | } | ||
221 | |||
222 | iwm->umac_profile->sec.auth_type = UMAC_AUTH_TYPE_LEGACY_PSK; | ||
223 | |||
224 | ret = iwm_send_mlme_profile(iwm); | ||
225 | if (ret < 0) | ||
226 | return; | ||
227 | |||
228 | for (i = 0; i < IWM_NUM_KEYS; i++) | ||
229 | if (iwm->keys[i].key_len) | ||
230 | iwm_set_key(iwm, 0, &iwm->keys[i]); | ||
231 | |||
232 | iwm_set_tx_key(iwm, iwm->default_key); | ||
233 | } | ||
234 | |||
235 | |||
236 | |||
210 | static void iwm_watchdog(unsigned long data) | 237 | static void iwm_watchdog(unsigned long data) |
211 | { | 238 | { |
212 | struct iwm_priv *iwm = (struct iwm_priv *)data; | 239 | struct iwm_priv *iwm = (struct iwm_priv *)data; |
@@ -240,6 +267,7 @@ int iwm_priv_init(struct iwm_priv *iwm) | |||
240 | INIT_DELAYED_WORK(&iwm->disconnect, iwm_disconnect_work); | 267 | INIT_DELAYED_WORK(&iwm->disconnect, iwm_disconnect_work); |
241 | INIT_DELAYED_WORK(&iwm->ct_kill_delay, iwm_ct_kill_work); | 268 | INIT_DELAYED_WORK(&iwm->ct_kill_delay, iwm_ct_kill_work); |
242 | INIT_WORK(&iwm->reset_worker, iwm_reset_worker); | 269 | INIT_WORK(&iwm->reset_worker, iwm_reset_worker); |
270 | INIT_WORK(&iwm->auth_retry_worker, iwm_auth_retry_worker); | ||
243 | INIT_LIST_HEAD(&iwm->bss_list); | 271 | INIT_LIST_HEAD(&iwm->bss_list); |
244 | 272 | ||
245 | skb_queue_head_init(&iwm->rx_list); | 273 | skb_queue_head_init(&iwm->rx_list); |