Fixes WEP firmware error condition.

The problem is caused by the patch in bug455 -- Channel change flood
generates fatal error.

The patch set the DISASSOCIATING status bit after sending the command.
The process was scheduled out when waiting for the command to be sent to
the card. The disassociated notification clears the DISASSOCIATING bit
in the tasklet before the process set the bit.

Move the bit setting code before sending the command now.

Signed-off-by: Hong Liu <hong.liu@intel.com>
Signed-off-by: James Ketrenos <jketreno@linux.intel.com>
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index 549f582..a763092 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -1882,18 +1882,6 @@
 		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 @@
 			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 @@
 		return;
 	}
 
-	priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
-	priv->status |= STATUS_DISASSOCIATING;
-
 }
 
 static int ipw_disassociate(void *data)
@@ -7672,6 +7661,8 @@
 	 */
 	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 @@
 		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 @@
 		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");