diff options
author | Zhu Yi <yi.zhu@intel.com> | 2007-12-20 06:10:01 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 23:07:54 (GMT) |
commit | a0646470e8a965df59054a5c82e53e5572bf04a0 (patch) | |
tree | fe4b434a1b8f2accdcfd3e1055b903ffb20e5d8b /drivers/net/wireless | |
parent | 12342c475f5de17071eaf24ea2938ba8dfe285f2 (diff) | |
download | linux-fsl-qoriq-a0646470e8a965df59054a5c82e53e5572bf04a0.tar.xz |
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 <johannes@sipsolutions.net>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 30 | ||||
-rw-r--r-- | 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; } |