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: Ben Greear <greearb@candelatech.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
d53071143a
commit
2f9eec0b71
|
@ -2551,6 +2551,17 @@ static int ath10k_start_scan(struct ath10k *ar,
|
|||
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 */
|
||||
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
|
||||
msecs_to_jiffies(arg->max_scan_time+200));
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
lockdep_assert_held(&ar->data_lock);
|
||||
|
@ -1292,6 +1311,7 @@ int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
|
|||
break;
|
||||
case WMI_SCAN_EVENT_START_FAILED:
|
||||
ath10k_warn(ar, "received scan start failure event\n");
|
||||
ath10k_wmi_event_scan_start_failed(ar);
|
||||
break;
|
||||
case WMI_SCAN_EVENT_DEQUEUED:
|
||||
case WMI_SCAN_EVENT_PREEMPTED:
|
||||
|
|
Loading…
Reference in New Issue