mac80211: Check pending scan request after having processed mgd work
When the queued management work items are processed in ieee80211_sta_work() an item could be removed. This could change the anybusy from true to false, so we better check whether we can start a new scan only after having processed the pending work first. Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com> Acked-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
15db0b7fd8
commit
5bf6fcc2bb
|
@ -2123,25 +2123,9 @@ static void ieee80211_sta_work(struct work_struct *work)
|
|||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(wk, &ifmgd->work_list, list) {
|
||||
if (wk->state != IEEE80211_MGD_STATE_IDLE) {
|
||||
anybusy = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ieee80211_recalc_idle(local);
|
||||
|
||||
if (!anybusy) {
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
|
||||
if (test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request))
|
||||
ieee80211_queue_delayed_work(&local->hw,
|
||||
&local->scan_work,
|
||||
round_jiffies_relative(0));
|
||||
return;
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(wk, tmp, &ifmgd->work_list, list) {
|
||||
if (time_is_after_jiffies(wk->timeout)) {
|
||||
/*
|
||||
|
@ -2187,6 +2171,18 @@ static void ieee80211_sta_work(struct work_struct *work)
|
|||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(wk, &ifmgd->work_list, list) {
|
||||
if (wk->state != IEEE80211_MGD_STATE_IDLE) {
|
||||
anybusy = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!anybusy &&
|
||||
test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request))
|
||||
ieee80211_queue_delayed_work(&local->hw,
|
||||
&local->scan_work,
|
||||
round_jiffies_relative(0));
|
||||
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
|
||||
list_for_each_entry_safe(wk, tmp, &free_work, list) {
|
||||
|
|
Loading…
Reference in New Issue