iwlwifi: Fix uCode error on association
authorGregory Greenman <gregory.greenman@intel.com>
Wed, 23 Jan 2008 18:15:21 +0000 (10:15 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Feb 2008 03:26:44 +0000 (19:26 -0800)
The problem is that priv->assoc_id is set when assoc. resp frame is
received. But, when it is set, LQ cmd is still not sent to the uCode, it is
done from bg_post_assoc, which is called through a workqueue.

On the other hand, when a tx arrives at the moment when this flag is set,
but LQ is still not sent, the if condition in tx_skb will not hold and
the frame will not be dropped.  Thus, it will be sent through
which is still not in the sta table in the uCoded.

Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/wireless/iwlwifi/iwl-3945.h
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl4965-base.c

index 4b07db9cd407c61101542e401e3aa670d659f15e..1da14f9bbe0f02fb1b2142f0ed1e0302bd86478b 100644 (file)
@@ -790,7 +790,6 @@ struct iwl3945_priv {
        u16 active_rate_basic;
 
        u8 call_post_assoc_from_beacon;
-       u8 assoc_station_added;
        /* Rate scaling data */
        s8 data_retry_limit;
        u8 retry_rate;
index f644c6bba85fadbfee838adeec0babf1f799384b..5d8965e0b900b3c5ab15a21f8c60aa9f9e38272d 100644 (file)
@@ -2806,7 +2806,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv,
 #endif
 
        /* drop all data frame if we are not associated */
-       if (!iwl3945_is_associated(priv) && !priv->assoc_id &&
+       if ((!iwl3945_is_associated(priv) || !priv->assoc_id) &&
            ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) {
                IWL_DEBUG_DROP("Dropping - !iwl3945_is_associated\n");
                goto drop_unlock;
index 131cf5adbd7967c2a564d414cfd45e561c123c20..abdce17f60e6a896e21f4d9a20a722be7a361603 100644 (file)
@@ -2933,8 +2933,10 @@ static int iwl4965_tx_skb(struct iwl4965_priv *priv,
 #endif
 
        /* drop all data frame if we are not associated */
-       if (!iwl4965_is_associated(priv) && !priv->assoc_id &&
-           ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) {
+       if (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) &&
+          (!iwl4965_is_associated(priv) ||
+           !priv->assoc_id ||
+           !priv->assoc_station_added)) {
                IWL_DEBUG_DROP("Dropping - !iwl4965_is_associated\n");
                goto drop_unlock;
        }