diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 11:59:37 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 14:20:42 +0200 | 
| commit | dbb6be6d5e974c42bbecd183effaa0df69e1dd8b (patch) | |
| tree | 5735cb47e70853d057a9881dd0ce44b83e88fa63 /drivers/net/wireless/iwlwifi/iwl-scan.c | |
| parent | 6a867a395558a7f882d041783e4cdea6744ca2bf (diff) | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| download | olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.tar.xz olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.zip  | |
Merge branch 'linus' into timers/core
Reason: Further posix_cpu_timer patches depend on mainline changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-scan.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-scan.c | 32 | 
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index bd2f7c42056..12e455a4b90 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c @@ -25,6 +25,7 @@   *  Intel Linux Wireless <ilw@linux.intel.com>   * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497   *****************************************************************************/ +#include <linux/slab.h>  #include <linux/types.h>  #include <linux/etherdevice.h>  #include <net/mac80211.h> @@ -469,6 +470,8 @@ EXPORT_SYMBOL(iwl_init_scan_params);  static int iwl_scan_initiate(struct iwl_priv *priv)  { +	WARN_ON(!mutex_is_locked(&priv->mutex)); +  	IWL_DEBUG_INFO(priv, "Starting scan...\n");  	set_bit(STATUS_SCANNING, &priv->status);  	priv->is_internal_short_scan = false; @@ -546,24 +549,31 @@ EXPORT_SYMBOL(iwl_mac_hw_scan);   * internal short scan, this function should only been called while associated.   * It will reset and tune the radio to prevent possible RF related problem   */ -int iwl_internal_short_hw_scan(struct iwl_priv *priv) +void iwl_internal_short_hw_scan(struct iwl_priv *priv)  { -	int ret = 0; +	queue_work(priv->workqueue, &priv->start_internal_scan); +} + +static void iwl_bg_start_internal_scan(struct work_struct *work) +{ +	struct iwl_priv *priv = +		container_of(work, struct iwl_priv, start_internal_scan); + +	mutex_lock(&priv->mutex);  	if (!iwl_is_ready_rf(priv)) { -		ret = -EIO;  		IWL_DEBUG_SCAN(priv, "not ready or exit pending\n"); -		goto out; +		goto unlock;  	} +  	if (test_bit(STATUS_SCANNING, &priv->status)) {  		IWL_DEBUG_SCAN(priv, "Scan already in progress.\n"); -		ret = -EAGAIN; -		goto out; +		goto unlock;  	} +  	if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {  		IWL_DEBUG_SCAN(priv, "Scan request while abort pending\n"); -		ret = -EAGAIN; -		goto out; +		goto unlock;  	}  	priv->scan_bands = 0; @@ -576,9 +586,8 @@ int iwl_internal_short_hw_scan(struct iwl_priv *priv)  	set_bit(STATUS_SCANNING, &priv->status);  	priv->is_internal_short_scan = true;  	queue_work(priv->workqueue, &priv->request_scan); - -out: -	return ret; + unlock: +	mutex_unlock(&priv->mutex);  }  EXPORT_SYMBOL(iwl_internal_short_hw_scan); @@ -964,6 +973,7 @@ void iwl_setup_scan_deferred_work(struct iwl_priv *priv)  	INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);  	INIT_WORK(&priv->request_scan, iwl_bg_request_scan);  	INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); +	INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan);  	INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check);  }  EXPORT_SYMBOL(iwl_setup_scan_deferred_work);  |