|
@@ -1882,18 +1882,6 @@ static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd)
|
|
|
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) {
|
|
@@ -3697,10 +3685,14 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet)
|
|
|
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 "
|
|
@@ -3708,9 +3700,6 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
|
|
|
- priv->status |= STATUS_DISASSOCIATING;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static int ipw_disassociate(void *data)
|
|
@@ -7672,6 +7661,8 @@ static int ipw_associate_network(struct ipw_priv *priv,
|
|
|
*/
|
|
|
priv->channel = network->channel;
|
|
|
memcpy(priv->bssid, network->bssid, ETH_ALEN);
|
|
|
+ priv->status |= STATUS_ASSOCIATING;
|
|
|
+ priv->status &= ~STATUS_SECURITY_UPDATED;
|
|
|
|
|
|
priv->assoc_network = network;
|
|
|
|
|
@@ -7685,9 +7676,6 @@ static int ipw_associate_network(struct ipw_priv *priv,
|
|
|
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));
|
|
@@ -7791,6 +7779,13 @@ static int ipw_associate(void *data)
|
|
|
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");
|