Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=a0646470e8a965df59054a5c82e53e5572bf04a0
Commit:     a0646470e8a965df59054a5c82e53e5572bf04a0
Parent:     12342c475f5de17071eaf24ea2938ba8dfe285f2
Author:     Zhu Yi <[EMAIL PROTECTED]>
AuthorDate: Thu Dec 20 14:10:01 2007 +0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 15:07:54 2008 -0800

    iwlwifi: skip mac80211 conf during a hardware scan and replay it afterwards
    
    This patch skips mac80211 configuration setting during a hardware scan
    and replays it afterwards for the iwlwifi drivers.
    
    Cc: Johannes Berg <[EMAIL PROTECTED]>
    Signed-off-by: Zhu Yi <[EMAIL PROTECTED]>
    Signed-off-by: John W. Linville <[EMAIL PROTECTED]>
---
 drivers/net/wireless/iwlwifi/iwl-3945.h     |    2 +-
 drivers/net/wireless/iwlwifi/iwl-4965.h     |    2 +-
 drivers/net/wireless/iwlwifi/iwl3945-base.c |   30 +++++--------------------
 drivers/net/wireless/iwlwifi/iwl4965-base.c |   32 ++++++---------------------
 4 files changed, 15 insertions(+), 51 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h 
b/drivers/net/wireless/iwlwifi/iwl-3945.h
index f1aa4dc..e97f1fb 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.h
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.h
@@ -406,6 +406,7 @@ struct iwl3945_rx_queue {
 #define STATUS_SCAN_HW         14
 #define STATUS_POWER_PMI       15
 #define STATUS_FW_ERROR                16
+#define STATUS_CONF_PENDING    17
 
 #define MAX_TID_COUNT        9
 
@@ -694,7 +695,6 @@ struct iwl3945_priv {
        struct ieee80211_hw *hw;
        struct ieee80211_channel *ieee_channels;
        struct ieee80211_rate *ieee_rates;
-       struct ieee80211_conf *cache_conf;
 
        /* temporary frame storage list */
        struct list_head free_frames;
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.h 
b/drivers/net/wireless/iwlwifi/iwl-4965.h
index 9a975ef..241f444 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.h
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.h
@@ -425,6 +425,7 @@ struct iwl4965_rx_queue {
 #define STATUS_SCAN_HW         14
 #define STATUS_POWER_PMI       15
 #define STATUS_FW_ERROR                16
+#define STATUS_CONF_PENDING    17
 
 #define MAX_TID_COUNT        9
 
@@ -1023,7 +1024,6 @@ struct iwl4965_priv {
        struct ieee80211_hw *hw;
        struct ieee80211_channel *ieee_channels;
        struct ieee80211_rate *ieee_rates;
-       struct ieee80211_conf *cache_conf;
 
        /* temporary frame storage list */
        struct list_head free_frames;
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c 
b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 40b6918..8d60325 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -6888,8 +6888,8 @@ static void iwl3945_bg_scan_completed(struct work_struct 
*work)
        if (test_bit(STATUS_EXIT_PENDING, &priv->status))
                return;
 
-       if (priv->cache_conf)
-               iwl3945_mac_config(priv->hw, priv->cache_conf);
+       if (test_bit(STATUS_CONF_PENDING, &priv->status))
+               iwl3945_mac_config(priv->hw, ieee80211_get_hw_conf(priv->hw));
 
        ieee80211_scan_completed(priv->hw);
 
@@ -7033,27 +7033,12 @@ static int iwl3945_mac_config(struct ieee80211_hw *hw, 
struct ieee80211_conf *co
                goto out;
        }
 
-       /* TODO: Figure out how to get ieee80211_local->sta_scanning w/ only
-        * what is exposed through include/ declarations */
        if (unlikely(!iwl3945_param_disable_hw_scan &&
                     test_bit(STATUS_SCANNING, &priv->status))) {
-
-               if (priv->cache_conf)
-                       IWL_DEBUG_MAC80211("leave - still scanning\n");
-               else {
-                       /* Cache the configuration now so that we can
-                        * replay it after the hardware scan is finished. */
-                       priv->cache_conf = kmalloc(sizeof(*conf), GFP_KERNEL);
-                       if (priv->cache_conf) {
-                               memcpy(priv->cache_conf, conf, sizeof(*conf));
-                               IWL_DEBUG_MAC80211("leave - scanning\n");
-                       } else {
-                               IWL_DEBUG_MAC80211("leave - no memory\n");
-                               ret = -ENOMEM;
-                       }
-               }
+               IWL_DEBUG_MAC80211("leave - scanning\n");
+               set_bit(STATUS_CONF_PENDING, &priv->status);
                mutex_unlock(&priv->mutex);
-               return ret;
+               return 0;
        }
 
        spin_lock_irqsave(&priv->lock, flags);
@@ -7110,10 +7095,7 @@ static int iwl3945_mac_config(struct ieee80211_hw *hw, 
struct ieee80211_conf *co
        IWL_DEBUG_MAC80211("leave\n");
 
 out:
-       if (priv->cache_conf) {
-               kfree(priv->cache_conf);
-               priv->cache_conf = NULL;
-       }
+       clear_bit(STATUS_CONF_PENDING, &priv->status);
        mutex_unlock(&priv->mutex);
        return ret;
 }
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c 
b/drivers/net/wireless/iwlwifi/iwl4965-base.c
index 0708975..5a9fa42 100644
--- a/drivers/net/wireless/iwlwifi/iwl4965-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c
@@ -7332,8 +7332,8 @@ static void iwl4965_bg_scan_completed(struct work_struct 
*work)
        if (test_bit(STATUS_EXIT_PENDING, &priv->status))
                return;
 
-       if (priv->cache_conf)
-               iwl4965_mac_config(priv->hw, priv->cache_conf);
+       if (test_bit(STATUS_CONF_PENDING, &priv->status))
+               iwl4965_mac_config(priv->hw, ieee80211_get_hw_conf(priv->hw));
 
        ieee80211_scan_completed(priv->hw);
 
@@ -7476,27 +7476,12 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, 
struct ieee80211_conf *co
                goto out;
        }
 
-       /* TODO: Figure out how to get ieee80211_local->sta_scanning w/ only
-        * what is exposed through include/ declarations */
        if (unlikely(!iwl4965_param_disable_hw_scan &&
                     test_bit(STATUS_SCANNING, &priv->status))) {
-
-               if (unlikely(priv->cache_conf))
-                       IWL_DEBUG_MAC80211("leave - still scanning\n");
-               else {
-                       /* Cache the configuration now so that we can
-                        * replay it after the hardware scan is finished. */
-                       priv->cache_conf = kmalloc(sizeof(*conf), GFP_KERNEL);
-                       if (priv->cache_conf) {
-                               memcpy(priv->cache_conf, conf, sizeof(*conf));
-                               IWL_DEBUG_MAC80211("leave - scanning\n");
-                       } else {
-                               IWL_DEBUG_MAC80211("leave - no memory\n");
-                               ret = -ENOMEM;
-                       }
-               }
+               IWL_DEBUG_MAC80211("leave - scanning\n");
+               set_bit(STATUS_CONF_PENDING, &priv->status);
                mutex_unlock(&priv->mutex);
-               return ret;
+               return 0;
        }
 
        spin_lock_irqsave(&priv->lock, flags);
@@ -7564,12 +7549,9 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, 
struct ieee80211_conf *co
 
        IWL_DEBUG_MAC80211("leave\n");
 
-out:
-       if (priv->cache_conf) {
-               kfree(priv->cache_conf);
-               priv->cache_conf = NULL;
-       }
        mutex_unlock(&priv->mutex);
+out:
+       clear_bit(STATUS_CONF_PENDING, &priv->status);
        return ret;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to