|
@@ -3449,14 +3449,13 @@ void __ath10k_scan_finish(struct ath10k *ar)
|
|
case ATH10K_SCAN_IDLE:
|
|
case ATH10K_SCAN_IDLE:
|
|
break;
|
|
break;
|
|
case ATH10K_SCAN_RUNNING:
|
|
case ATH10K_SCAN_RUNNING:
|
|
- if (ar->scan.is_roc)
|
|
|
|
- ieee80211_remain_on_channel_expired(ar->hw);
|
|
|
|
- /* fall through */
|
|
|
|
case ATH10K_SCAN_ABORTING:
|
|
case ATH10K_SCAN_ABORTING:
|
|
if (!ar->scan.is_roc)
|
|
if (!ar->scan.is_roc)
|
|
ieee80211_scan_completed(ar->hw,
|
|
ieee80211_scan_completed(ar->hw,
|
|
(ar->scan.state ==
|
|
(ar->scan.state ==
|
|
ATH10K_SCAN_ABORTING));
|
|
ATH10K_SCAN_ABORTING));
|
|
|
|
+ else if (ar->scan.roc_notify)
|
|
|
|
+ ieee80211_remain_on_channel_expired(ar->hw);
|
|
/* fall through */
|
|
/* fall through */
|
|
case ATH10K_SCAN_STARTING:
|
|
case ATH10K_SCAN_STARTING:
|
|
ar->scan.state = ATH10K_SCAN_IDLE;
|
|
ar->scan.state = ATH10K_SCAN_IDLE;
|
|
@@ -5459,6 +5458,7 @@ static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
|
|
ar->scan.is_roc = true;
|
|
ar->scan.is_roc = true;
|
|
ar->scan.vdev_id = arvif->vdev_id;
|
|
ar->scan.vdev_id = arvif->vdev_id;
|
|
ar->scan.roc_freq = chan->center_freq;
|
|
ar->scan.roc_freq = chan->center_freq;
|
|
|
|
+ ar->scan.roc_notify = true;
|
|
ret = 0;
|
|
ret = 0;
|
|
break;
|
|
break;
|
|
case ATH10K_SCAN_STARTING:
|
|
case ATH10K_SCAN_STARTING:
|
|
@@ -5522,7 +5522,13 @@ static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw)
|
|
struct ath10k *ar = hw->priv;
|
|
struct ath10k *ar = hw->priv;
|
|
|
|
|
|
mutex_lock(&ar->conf_mutex);
|
|
mutex_lock(&ar->conf_mutex);
|
|
|
|
+
|
|
|
|
+ spin_lock_bh(&ar->data_lock);
|
|
|
|
+ ar->scan.roc_notify = false;
|
|
|
|
+ spin_unlock_bh(&ar->data_lock);
|
|
|
|
+
|
|
ath10k_scan_abort(ar);
|
|
ath10k_scan_abort(ar);
|
|
|
|
+
|
|
mutex_unlock(&ar->conf_mutex);
|
|
mutex_unlock(&ar->conf_mutex);
|
|
|
|
|
|
cancel_delayed_work_sync(&ar->scan.timeout);
|
|
cancel_delayed_work_sync(&ar->scan.timeout);
|