|
@@ -469,6 +469,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 +548,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 +585,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 +972,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);
|