Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5bf6fcc2 authored by Jouni Malinen's avatar Jouni Malinen Committed by John W. Linville
Browse files

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: default avatarJouni Malinen <jouni.malinen@atheros.com>
Acked-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 15db0b7f
Loading
Loading
Loading
Loading
+12 −16
Original line number Diff line number Diff line
@@ -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) {