diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ipw2200.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 9ced5b778a77..4cdb4748b761 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -1884,6 +1884,18 @@ static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) | |||
1884 | return -EAGAIN; | 1884 | return -EAGAIN; |
1885 | } | 1885 | } |
1886 | 1886 | ||
1887 | if (priv->status & STATUS_ASSOCIATING) { | ||
1888 | IPW_DEBUG_HC("abandon a command while associating\n"); | ||
1889 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1890 | return -1; | ||
1891 | } | ||
1892 | |||
1893 | if (priv->status & STATUS_DISASSOCIATING) { | ||
1894 | IPW_DEBUG_HC("abandon a command while disassociating\n"); | ||
1895 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1896 | return -1; | ||
1897 | } | ||
1898 | |||
1887 | priv->status |= STATUS_HCMD_ACTIVE; | 1899 | priv->status |= STATUS_HCMD_ACTIVE; |
1888 | 1900 | ||
1889 | if (priv->cmdlog) { | 1901 | if (priv->cmdlog) { |
@@ -3671,7 +3683,13 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet) | |||
3671 | { | 3683 | { |
3672 | int err; | 3684 | int err; |
3673 | 3685 | ||
3674 | if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED))) { | 3686 | if (priv->status & STATUS_ASSOCIATING) { |
3687 | IPW_DEBUG_ASSOC("Disassociating while associating.\n"); | ||
3688 | queue_work(priv->workqueue, &priv->disassociate); | ||
3689 | return; | ||
3690 | } | ||
3691 | |||
3692 | if (!(priv->status & STATUS_ASSOCIATED)) { | ||
3675 | IPW_DEBUG_ASSOC("Disassociating while not associated.\n"); | 3693 | IPW_DEBUG_ASSOC("Disassociating while not associated.\n"); |
3676 | return; | 3694 | return; |
3677 | } | 3695 | } |
@@ -3681,9 +3699,6 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet) | |||
3681 | MAC_ARG(priv->assoc_request.bssid), | 3699 | MAC_ARG(priv->assoc_request.bssid), |
3682 | priv->assoc_request.channel); | 3700 | priv->assoc_request.channel); |
3683 | 3701 | ||
3684 | priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); | ||
3685 | priv->status |= STATUS_DISASSOCIATING; | ||
3686 | |||
3687 | if (quiet) | 3702 | if (quiet) |
3688 | priv->assoc_request.assoc_type = HC_DISASSOC_QUIET; | 3703 | priv->assoc_request.assoc_type = HC_DISASSOC_QUIET; |
3689 | else | 3704 | else |
@@ -3695,6 +3710,9 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet) | |||
3695 | return; | 3710 | return; |
3696 | } | 3711 | } |
3697 | 3712 | ||
3713 | priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED); | ||
3714 | priv->status |= STATUS_DISASSOCIATING; | ||
3715 | |||
3698 | } | 3716 | } |
3699 | 3717 | ||
3700 | static int ipw_disassociate(void *data) | 3718 | static int ipw_disassociate(void *data) |
@@ -7625,8 +7643,6 @@ static int ipw_associate_network(struct ipw_priv *priv, | |||
7625 | */ | 7643 | */ |
7626 | priv->channel = network->channel; | 7644 | priv->channel = network->channel; |
7627 | memcpy(priv->bssid, network->bssid, ETH_ALEN); | 7645 | memcpy(priv->bssid, network->bssid, ETH_ALEN); |
7628 | priv->status |= STATUS_ASSOCIATING; | ||
7629 | priv->status &= ~STATUS_SECURITY_UPDATED; | ||
7630 | 7646 | ||
7631 | priv->assoc_network = network; | 7647 | priv->assoc_network = network; |
7632 | 7648 | ||
@@ -7640,6 +7656,9 @@ static int ipw_associate_network(struct ipw_priv *priv, | |||
7640 | return err; | 7656 | return err; |
7641 | } | 7657 | } |
7642 | 7658 | ||
7659 | priv->status |= STATUS_ASSOCIATING; | ||
7660 | priv->status &= ~STATUS_SECURITY_UPDATED; | ||
7661 | |||
7643 | IPW_DEBUG(IPW_DL_STATE, "associating: '%s' " MAC_FMT " \n", | 7662 | IPW_DEBUG(IPW_DL_STATE, "associating: '%s' " MAC_FMT " \n", |
7644 | escape_essid(priv->essid, priv->essid_len), | 7663 | escape_essid(priv->essid, priv->essid_len), |
7645 | MAC_ARG(priv->bssid)); | 7664 | MAC_ARG(priv->bssid)); |