return -EAGAIN;
}
- if (priv->status & STATUS_ASSOCIATING) {
- IPW_DEBUG_HC("abandon a command while associating\n");
- spin_unlock_irqrestore(&priv->lock, flags);
- return -1;
- }
-
- if (priv->status & STATUS_DISASSOCIATING) {
- IPW_DEBUG_HC("abandon a command while disassociating\n");
- spin_unlock_irqrestore(&priv->lock, flags);
- return -1;
- }
-
priv->status |= STATUS_HCMD_ACTIVE;
if (priv->cmdlog) {
MAC_ARG(priv->assoc_request.bssid),
priv->assoc_request.channel);
+ priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
+ priv->status |= STATUS_DISASSOCIATING;
+
if (quiet)
priv->assoc_request.assoc_type = HC_DISASSOC_QUIET;
else
priv->assoc_request.assoc_type = HC_DISASSOCIATE;
+
err = ipw_send_associate(priv, &priv->assoc_request);
if (err) {
IPW_DEBUG_HC("Attempt to send [dis]associate command "
return;
}
- priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
- priv->status |= STATUS_DISASSOCIATING;
-
}
static int ipw_disassociate(void *data)
*/
priv->channel = network->channel;
memcpy(priv->bssid, network->bssid, ETH_ALEN);
+ priv->status |= STATUS_ASSOCIATING;
+ priv->status &= ~STATUS_SECURITY_UPDATED;
priv->assoc_network = network;
return err;
}
- priv->status |= STATUS_ASSOCIATING;
- priv->status &= ~STATUS_SECURITY_UPDATED;
-
IPW_DEBUG(IPW_DL_STATE, "associating: '%s' " MAC_FMT " \n",
escape_essid(priv->essid, priv->essid_len),
MAC_ARG(priv->bssid));
return 0;
}
+ if (priv->status & STATUS_DISASSOCIATING) {
+ IPW_DEBUG_ASSOC("Not attempting association (in "
+ "disassociating)\n ");
+ queue_work(priv->workqueue, &priv->associate);
+ return 0;
+ }
+
if (!ipw_is_init(priv) || (priv->status & STATUS_SCANNING)) {
IPW_DEBUG_ASSOC("Not attempting association (scanning or not "
"initialized)\n");