mac80211: add support for tx to abort low priority scan requests
Use NL80211_SCAN_FLAG_LOW_PRIORITY flag in mac80211's scan state machine to prematurely terminate scan operations if outbound traffic collides. This is useful for marking background scans so they don't affect throughput. Signed-off-by: Sam Leffler <sleffler@chromium.org> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> [set feature flag only if software scan is used] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
15d6030b4b
commit
cd2bb512cd
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user