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

Commit b739a42c authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by John W. Linville
Browse files

wl1271: Fix scan failure detection



In scan_complete_work, because the mutex is released before accessing the
scan->failed flag, it is possible for unfounded hardware recovery rounds
to be executed.

Fix this.

Signed-off-by: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
parent fb2382c7
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -1056,6 +1056,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl)
		wl->scan.state = WL1271_SCAN_STATE_IDLE;
		kfree(wl->scan.scanned_ch);
		wl->scan.scanned_ch = NULL;
		wl->scan.req = NULL;
		ieee80211_scan_completed(wl->hw, true);
	}

@@ -1676,6 +1677,16 @@ static int wl1271_op_hw_scan(struct ieee80211_hw *hw,

	mutex_lock(&wl->mutex);

	if (wl->state == WL1271_STATE_OFF) {
		/*
		 * We cannot return -EBUSY here because cfg80211 will expect
		 * a call to ieee80211_scan_completed if we do - in this case
		 * there won't be any call.
		 */
		ret = -EAGAIN;
		goto out;
	}

	ret = wl1271_ps_elp_wakeup(wl, false);
	if (ret < 0)
		goto out;
+3 −2
Original line number Diff line number Diff line
@@ -48,14 +48,15 @@ void wl1271_scan_complete_work(struct work_struct *work)
	wl->scan.state = WL1271_SCAN_STATE_IDLE;
	kfree(wl->scan.scanned_ch);
	wl->scan.scanned_ch = NULL;
	mutex_unlock(&wl->mutex);

	wl->scan.req = NULL;
	ieee80211_scan_completed(wl->hw, false);

	if (wl->scan.failed) {
		wl1271_info("Scan completed due to error.");
		ieee80211_queue_work(wl->hw, &wl->recovery_work);
	}
	mutex_unlock(&wl->mutex);

}