diff options
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-scan.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 107e173112f6..5d3f51ff2f0d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -376,6 +376,11 @@ void iwl_bg_start_internal_scan(struct work_struct *work) | |||
| 376 | 376 | ||
| 377 | mutex_lock(&priv->mutex); | 377 | mutex_lock(&priv->mutex); |
| 378 | 378 | ||
| 379 | if (priv->is_internal_short_scan == true) { | ||
| 380 | IWL_DEBUG_SCAN(priv, "Internal scan already in progress\n"); | ||
| 381 | goto unlock; | ||
| 382 | } | ||
| 383 | |||
| 379 | if (!iwl_is_ready_rf(priv)) { | 384 | if (!iwl_is_ready_rf(priv)) { |
| 380 | IWL_DEBUG_SCAN(priv, "not ready or exit pending\n"); | 385 | IWL_DEBUG_SCAN(priv, "not ready or exit pending\n"); |
| 381 | goto unlock; | 386 | goto unlock; |
| @@ -497,17 +502,27 @@ void iwl_bg_scan_completed(struct work_struct *work) | |||
| 497 | { | 502 | { |
| 498 | struct iwl_priv *priv = | 503 | struct iwl_priv *priv = |
| 499 | container_of(work, struct iwl_priv, scan_completed); | 504 | container_of(work, struct iwl_priv, scan_completed); |
| 505 | bool internal = false; | ||
| 500 | 506 | ||
| 501 | IWL_DEBUG_SCAN(priv, "SCAN complete scan\n"); | 507 | IWL_DEBUG_SCAN(priv, "SCAN complete scan\n"); |
| 502 | 508 | ||
| 503 | cancel_delayed_work(&priv->scan_check); | 509 | cancel_delayed_work(&priv->scan_check); |
| 504 | 510 | ||
| 505 | if (!priv->is_internal_short_scan) | 511 | mutex_lock(&priv->mutex); |
| 506 | ieee80211_scan_completed(priv->hw, false); | 512 | if (priv->is_internal_short_scan) { |
| 507 | else { | ||
| 508 | priv->is_internal_short_scan = false; | 513 | priv->is_internal_short_scan = false; |
| 509 | IWL_DEBUG_SCAN(priv, "internal short scan completed\n"); | 514 | IWL_DEBUG_SCAN(priv, "internal short scan completed\n"); |
| 515 | internal = true; | ||
| 510 | } | 516 | } |
| 517 | mutex_unlock(&priv->mutex); | ||
| 518 | |||
| 519 | /* | ||
| 520 | * Do not hold mutex here since this will cause mac80211 to call | ||
| 521 | * into driver again into functions that will attempt to take | ||
| 522 | * mutex. | ||
| 523 | */ | ||
| 524 | if (!internal) | ||
| 525 | ieee80211_scan_completed(priv->hw, false); | ||
| 511 | 526 | ||
| 512 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 527 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
| 513 | return; | 528 | return; |
