Commit 8f79d2f1 authored by Ilan Peer's avatar Ilan Peer Committed by Johannes Berg
Browse files

wifi: mac80211: Track NAN interface start/stop



In case that NAN is started, mark the device as non idle,
and set LED triggering similar to scan and ROC. Set the
device to idle once NAN is stopped.

Signed-off-by: default avatarIlan Peer <ilan.peer@intel.com>
Reviewed-by: default avatarAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Reviewed-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250908140015.2711d62fce22.I9b9f826490e50967a66788d713b0eba985879873@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 488d2e0b
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -320,6 +320,9 @@ static int ieee80211_start_nan(struct wiphy *wiphy,

	lockdep_assert_wiphy(sdata->local->hw.wiphy);

	if (sdata->u.nan.started)
		return -EALREADY;

	ret = ieee80211_check_combinations(sdata, NULL, 0, 0, -1);
	if (ret < 0)
		return ret;
@@ -329,12 +332,18 @@ static int ieee80211_start_nan(struct wiphy *wiphy,
		return ret;

	ret = drv_start_nan(sdata->local, sdata, conf);
	if (ret)
	if (ret) {
		ieee80211_sdata_stop(sdata);
		return ret;
	}

	sdata->u.nan.conf = *conf;
	sdata->u.nan.started = true;
	ieee80211_recalc_idle(sdata->local);

	return ret;
	sdata->u.nan.conf.master_pref = conf->master_pref;
	sdata->u.nan.conf.bands = conf->bands;

	return 0;
}

static void ieee80211_stop_nan(struct wiphy *wiphy,
@@ -342,8 +351,13 @@ static void ieee80211_stop_nan(struct wiphy *wiphy,
{
	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);

	if (!sdata->u.nan.started)
		return;

	drv_stop_nan(sdata->local, sdata);
	sdata->u.nan.started = false;
	ieee80211_sdata_stop(sdata);
	ieee80211_recalc_idle(sdata->local);
}

static int ieee80211_nan_change_conf(struct wiphy *wiphy,
+2 −0
Original line number Diff line number Diff line
@@ -985,11 +985,13 @@ struct ieee80211_if_mntr {
 * struct ieee80211_if_nan - NAN state
 *
 * @conf: current NAN configuration
 * @started: true iff NAN is started
 * @func_lock: lock for @func_inst_ids
 * @function_inst_ids: a bitmap of available instance_id's
 */
struct ieee80211_if_nan {
	struct cfg80211_nan_conf conf;
	bool started;

	/* protects function_inst_ids */
	spinlock_t func_lock;
+9 −0
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ static u32 __ieee80211_recalc_idle(struct ieee80211_local *local,
{
	bool working, scanning, active;
	unsigned int led_trig_start = 0, led_trig_stop = 0;
	struct ieee80211_sub_if_data *iter;

	lockdep_assert_wiphy(local->hw.wiphy);

@@ -117,6 +118,14 @@ static u32 __ieee80211_recalc_idle(struct ieee80211_local *local,
	working = !local->ops->remain_on_channel &&
		  !list_empty(&local->roc_list);

	list_for_each_entry(iter, &local->interfaces, list) {
		if (iter->vif.type == NL80211_IFTYPE_NAN &&
		    iter->u.nan.started) {
			working = true;
			break;
		}
	}

	scanning = test_bit(SCAN_SW_SCANNING, &local->scanning) ||
		   test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning);