Commit 2f9eec0b authored by Ben Greear's avatar Ben Greear Committed by Kalle Valo

ath10k: scan should handle scan-start-failed event properly

In case firmware fails to start the scan, then complete
the start condition and clean up so that driver does not
block on timeout.
Signed-off-by: default avatarBen Greear <greearb@candelatech.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent d5307114
...@@ -2551,6 +2551,17 @@ static int ath10k_start_scan(struct ath10k *ar, ...@@ -2551,6 +2551,17 @@ static int ath10k_start_scan(struct ath10k *ar,
return -ETIMEDOUT; return -ETIMEDOUT;
} }
/* If we failed to start the scan, return error code at
* this point. This is probably due to some issue in the
* firmware, but no need to wedge the driver due to that...
*/
spin_lock_bh(&ar->data_lock);
if (ar->scan.state == ATH10K_SCAN_IDLE) {
spin_unlock_bh(&ar->data_lock);
return -EINVAL;
}
spin_unlock_bh(&ar->data_lock);
/* Add a 200ms margin to account for event/command processing */ /* Add a 200ms margin to account for event/command processing */
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
msecs_to_jiffies(arg->max_scan_time+200)); msecs_to_jiffies(arg->max_scan_time+200));
......
...@@ -1125,6 +1125,25 @@ static void ath10k_wmi_event_scan_started(struct ath10k *ar) ...@@ -1125,6 +1125,25 @@ static void ath10k_wmi_event_scan_started(struct ath10k *ar)
} }
} }
static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar)
{
lockdep_assert_held(&ar->data_lock);
switch (ar->scan.state) {
case ATH10K_SCAN_IDLE:
case ATH10K_SCAN_RUNNING:
case ATH10K_SCAN_ABORTING:
ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n",
ath10k_scan_state_str(ar->scan.state),
ar->scan.state);
break;
case ATH10K_SCAN_STARTING:
complete(&ar->scan.started);
__ath10k_scan_finish(ar);
break;
}
}
static void ath10k_wmi_event_scan_completed(struct ath10k *ar) static void ath10k_wmi_event_scan_completed(struct ath10k *ar)
{ {
lockdep_assert_held(&ar->data_lock); lockdep_assert_held(&ar->data_lock);
...@@ -1292,6 +1311,7 @@ int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb) ...@@ -1292,6 +1311,7 @@ int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
break; break;
case WMI_SCAN_EVENT_START_FAILED: case WMI_SCAN_EVENT_START_FAILED:
ath10k_warn(ar, "received scan start failure event\n"); ath10k_warn(ar, "received scan start failure event\n");
ath10k_wmi_event_scan_start_failed(ar);
break; break;
case WMI_SCAN_EVENT_DEQUEUED: case WMI_SCAN_EVENT_DEQUEUED:
case WMI_SCAN_EVENT_PREEMPTED: case WMI_SCAN_EVENT_PREEMPTED:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment