|
@@ -2306,6 +2306,7 @@ void ath10k_halt(struct ath10k *ar)
|
|
|
}
|
|
|
|
|
|
del_timer_sync(&ar->scan.timeout);
|
|
|
+ ath10k_reset_scan((unsigned long)ar);
|
|
|
ath10k_offchan_tx_purge(ar);
|
|
|
ath10k_mgmt_over_wmi_tx_purge(ar);
|
|
|
ath10k_peer_cleanup_all(ar);
|
|
@@ -2313,12 +2314,6 @@ void ath10k_halt(struct ath10k *ar)
|
|
|
ath10k_hif_power_down(ar);
|
|
|
|
|
|
spin_lock_bh(&ar->data_lock);
|
|
|
- if (ar->scan.in_progress) {
|
|
|
- del_timer(&ar->scan.timeout);
|
|
|
- ar->scan.in_progress = false;
|
|
|
- ieee80211_scan_completed(ar->hw, true);
|
|
|
- }
|
|
|
-
|
|
|
list_for_each_entry(arvif, &ar->arvifs, list) {
|
|
|
if (!arvif->beacon)
|
|
|
continue;
|
|
@@ -2401,8 +2396,18 @@ static int ath10k_start(struct ieee80211_hw *hw)
|
|
|
|
|
|
mutex_lock(&ar->conf_mutex);
|
|
|
|
|
|
- if (ar->state != ATH10K_STATE_OFF &&
|
|
|
- ar->state != ATH10K_STATE_RESTARTING) {
|
|
|
+ switch (ar->state) {
|
|
|
+ case ATH10K_STATE_OFF:
|
|
|
+ ar->state = ATH10K_STATE_ON;
|
|
|
+ break;
|
|
|
+ case ATH10K_STATE_RESTARTING:
|
|
|
+ ath10k_halt(ar);
|
|
|
+ ar->state = ATH10K_STATE_RESTARTED;
|
|
|
+ break;
|
|
|
+ case ATH10K_STATE_ON:
|
|
|
+ case ATH10K_STATE_RESTARTED:
|
|
|
+ case ATH10K_STATE_WEDGED:
|
|
|
+ WARN_ON(1);
|
|
|
ret = -EINVAL;
|
|
|
goto err;
|
|
|
}
|
|
@@ -2419,11 +2424,6 @@ static int ath10k_start(struct ieee80211_hw *hw)
|
|
|
goto err_power_down;
|
|
|
}
|
|
|
|
|
|
- if (ar->state == ATH10K_STATE_OFF)
|
|
|
- ar->state = ATH10K_STATE_ON;
|
|
|
- else if (ar->state == ATH10K_STATE_RESTARTING)
|
|
|
- ar->state = ATH10K_STATE_RESTARTED;
|
|
|
-
|
|
|
ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pmf_qos, 1);
|
|
|
if (ret) {
|
|
|
ath10k_warn("failed to enable PMF QOS: %d\n", ret);
|
|
@@ -2482,12 +2482,10 @@ static void ath10k_stop(struct ieee80211_hw *hw)
|
|
|
struct ath10k *ar = hw->priv;
|
|
|
|
|
|
mutex_lock(&ar->conf_mutex);
|
|
|
- if (ar->state == ATH10K_STATE_ON ||
|
|
|
- ar->state == ATH10K_STATE_RESTARTED ||
|
|
|
- ar->state == ATH10K_STATE_WEDGED)
|
|
|
+ if (ar->state != ATH10K_STATE_OFF) {
|
|
|
ath10k_halt(ar);
|
|
|
-
|
|
|
- ar->state = ATH10K_STATE_OFF;
|
|
|
+ ar->state = ATH10K_STATE_OFF;
|
|
|
+ }
|
|
|
mutex_unlock(&ar->conf_mutex);
|
|
|
|
|
|
ath10k_mgmt_over_wmi_tx_purge(ar);
|