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>
This commit is contained in:
parent
12342c475f
commit
a0646470e8
|
@ -406,6 +406,7 @@ struct iwl3945_rx_queue {
|
||||||
#define STATUS_SCAN_HW 14
|
#define STATUS_SCAN_HW 14
|
||||||
#define STATUS_POWER_PMI 15
|
#define STATUS_POWER_PMI 15
|
||||||
#define STATUS_FW_ERROR 16
|
#define STATUS_FW_ERROR 16
|
||||||
|
#define STATUS_CONF_PENDING 17
|
||||||
|
|
||||||
#define MAX_TID_COUNT 9
|
#define MAX_TID_COUNT 9
|
||||||
|
|
||||||
|
@ -694,7 +695,6 @@ struct iwl3945_priv {
|
||||||
struct ieee80211_hw *hw;
|
struct ieee80211_hw *hw;
|
||||||
struct ieee80211_channel *ieee_channels;
|
struct ieee80211_channel *ieee_channels;
|
||||||
struct ieee80211_rate *ieee_rates;
|
struct ieee80211_rate *ieee_rates;
|
||||||
struct ieee80211_conf *cache_conf;
|
|
||||||
|
|
||||||
/* temporary frame storage list */
|
/* temporary frame storage list */
|
||||||
struct list_head free_frames;
|
struct list_head free_frames;
|
||||||
|
|
|
@ -425,6 +425,7 @@ struct iwl4965_rx_queue {
|
||||||
#define STATUS_SCAN_HW 14
|
#define STATUS_SCAN_HW 14
|
||||||
#define STATUS_POWER_PMI 15
|
#define STATUS_POWER_PMI 15
|
||||||
#define STATUS_FW_ERROR 16
|
#define STATUS_FW_ERROR 16
|
||||||
|
#define STATUS_CONF_PENDING 17
|
||||||
|
|
||||||
#define MAX_TID_COUNT 9
|
#define MAX_TID_COUNT 9
|
||||||
|
|
||||||
|
@ -1023,7 +1024,6 @@ struct iwl4965_priv {
|
||||||
struct ieee80211_hw *hw;
|
struct ieee80211_hw *hw;
|
||||||
struct ieee80211_channel *ieee_channels;
|
struct ieee80211_channel *ieee_channels;
|
||||||
struct ieee80211_rate *ieee_rates;
|
struct ieee80211_rate *ieee_rates;
|
||||||
struct ieee80211_conf *cache_conf;
|
|
||||||
|
|
||||||
/* temporary frame storage list */
|
/* temporary frame storage list */
|
||||||
struct list_head free_frames;
|
struct list_head free_frames;
|
||||||
|
|
|
@ -6888,8 +6888,8 @@ static void iwl3945_bg_scan_completed(struct work_struct *work)
|
||||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (priv->cache_conf)
|
if (test_bit(STATUS_CONF_PENDING, &priv->status))
|
||||||
iwl3945_mac_config(priv->hw, priv->cache_conf);
|
iwl3945_mac_config(priv->hw, ieee80211_get_hw_conf(priv->hw));
|
||||||
|
|
||||||
ieee80211_scan_completed(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;
|
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 &&
|
if (unlikely(!iwl3945_param_disable_hw_scan &&
|
||||||
test_bit(STATUS_SCANNING, &priv->status))) {
|
test_bit(STATUS_SCANNING, &priv->status))) {
|
||||||
|
IWL_DEBUG_MAC80211("leave - scanning\n");
|
||||||
if (priv->cache_conf)
|
set_bit(STATUS_CONF_PENDING, &priv->status);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
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");
|
IWL_DEBUG_MAC80211("leave\n");
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (priv->cache_conf) {
|
clear_bit(STATUS_CONF_PENDING, &priv->status);
|
||||||
kfree(priv->cache_conf);
|
|
||||||
priv->cache_conf = NULL;
|
|
||||||
}
|
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7332,8 +7332,8 @@ static void iwl4965_bg_scan_completed(struct work_struct *work)
|
||||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (priv->cache_conf)
|
if (test_bit(STATUS_CONF_PENDING, &priv->status))
|
||||||
iwl4965_mac_config(priv->hw, priv->cache_conf);
|
iwl4965_mac_config(priv->hw, ieee80211_get_hw_conf(priv->hw));
|
||||||
|
|
||||||
ieee80211_scan_completed(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;
|
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 &&
|
if (unlikely(!iwl4965_param_disable_hw_scan &&
|
||||||
test_bit(STATUS_SCANNING, &priv->status))) {
|
test_bit(STATUS_SCANNING, &priv->status))) {
|
||||||
|
IWL_DEBUG_MAC80211("leave - scanning\n");
|
||||||
if (unlikely(priv->cache_conf))
|
set_bit(STATUS_CONF_PENDING, &priv->status);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
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");
|
IWL_DEBUG_MAC80211("leave\n");
|
||||||
|
|
||||||
out:
|
|
||||||
if (priv->cache_conf) {
|
|
||||||
kfree(priv->cache_conf);
|
|
||||||
priv->cache_conf = NULL;
|
|
||||||
}
|
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
|
out:
|
||||||
|
clear_bit(STATUS_CONF_PENDING, &priv->status);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue