Skip to content

Commit

Permalink
Fixes WEP firmware error condition.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Hong Liu authored and James Ketrenos committed Nov 7, 2005
1 parent f4ff497 commit e632472
Showing 1 changed file with 13 additions and 18 deletions.
31 changes: 13 additions & 18 deletions drivers/net/wireless/ipw2200.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -3697,20 +3685,21 @@ 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 "
"failed.\n");
return;
}

priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
priv->status |= STATUS_DISASSOCIATING;

}

static int ipw_disassociate(void *data)
Expand Down Expand Up @@ -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;

Expand All @@ -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));
Expand Down Expand Up @@ -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");
Expand Down

0 comments on commit e632472

Please sign in to comment.