Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0646470 authored by Zhu Yi's avatar Zhu Yi Committed by David S. Miller
Browse files

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: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 12342c47
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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;
+6 −24
Original line number Diff line number Diff line
@@ -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;
			}
		}
		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;
}
+7 −25
Original line number Diff line number Diff line
@@ -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;
			}
		}
		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;
}