|
@@ -466,6 +466,7 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
|
|
|
sizeof(*local->hw_scan_req) +
|
|
|
req->n_channels * sizeof(req->channels[0]);
|
|
|
local->hw_scan_req->ie = ies;
|
|
|
+ local->hw_scan_req->flags = req->flags;
|
|
|
|
|
|
local->hw_scan_band = 0;
|
|
|
|
|
@@ -566,6 +567,7 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
|
|
|
unsigned long min_beacon_int = 0;
|
|
|
struct ieee80211_sub_if_data *sdata;
|
|
|
struct ieee80211_channel *next_chan;
|
|
|
+ enum mac80211_scan_state next_scan_state;
|
|
|
|
|
|
/*
|
|
|
* check if at least one STA interface is associated,
|
|
@@ -624,10 +626,18 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
|
|
|
usecs_to_jiffies(min_beacon_int * 1024) *
|
|
|
local->hw.conf.listen_interval);
|
|
|
|
|
|
- if (associated && (!tx_empty || bad_latency || listen_int_exceeded))
|
|
|
- local->next_scan_state = SCAN_SUSPEND;
|
|
|
- else
|
|
|
- local->next_scan_state = SCAN_SET_CHANNEL;
|
|
|
+ if (associated && !tx_empty) {
|
|
|
+ if (local->scan_req->flags & NL80211_SCAN_FLAG_LOW_PRIORITY)
|
|
|
+ next_scan_state = SCAN_ABORT;
|
|
|
+ else
|
|
|
+ next_scan_state = SCAN_SUSPEND;
|
|
|
+ } else if (associated && (bad_latency || listen_int_exceeded)) {
|
|
|
+ next_scan_state = SCAN_SUSPEND;
|
|
|
+ } else {
|
|
|
+ next_scan_state = SCAN_SET_CHANNEL;
|
|
|
+ }
|
|
|
+
|
|
|
+ local->next_scan_state = next_scan_state;
|
|
|
|
|
|
*next_delay = 0;
|
|
|
}
|
|
@@ -798,6 +808,9 @@ void ieee80211_scan_work(struct work_struct *work)
|
|
|
case SCAN_RESUME:
|
|
|
ieee80211_scan_state_resume(local, &next_delay);
|
|
|
break;
|
|
|
+ case SCAN_ABORT:
|
|
|
+ aborted = true;
|
|
|
+ goto out_complete;
|
|
|
}
|
|
|
} while (next_delay == 0);
|
|
|
|