Commit 6241d79f authored by Aditya Kumar Singh's avatar Aditya Kumar Singh Committed by Johannes Berg
Browse files

Revert "wifi: mac80211: move radar detect work to sdata"



This reverts commit ce9e660e ("wifi: mac80211: move radar detect work to sdata").

To enable radar detection with MLO, it’s essential to handle it on a
per-link basis. This is because when using MLO, multiple links may already
be active and beaconing. In this scenario, another link should be able to
initiate a radar detection. Also, if underlying links are associated with
different hardware devices but grouped together for MLO, they could
potentially start radar detection simultaneously. Therefore, it makes
sense to manage radar detection settings separately for each link by moving
them back to a per-link data structure.

Signed-off-by: default avatarAditya Kumar Singh <quic_adisi@quicinc.com>
Link: https://patch.msgid.link/20240906064426.2101315-2-quic_adisi@quicinc.com


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 3702a332
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1664,7 +1664,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,

	if (sdata->wdev.cac_started) {
		chandef = link_conf->chanreq.oper;
		wiphy_delayed_work_cancel(wiphy, &sdata->dfs_cac_timer_work);
		wiphy_delayed_work_cancel(wiphy, &link->dfs_cac_timer_work);
		cfg80211_cac_event(sdata->dev, &chandef,
				   NL80211_RADAR_CAC_ABORTED,
				   GFP_KERNEL);
@@ -3485,7 +3485,7 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy,
	if (err)
		goto out_unlock;

	wiphy_delayed_work_queue(wiphy, &sdata->dfs_cac_timer_work,
	wiphy_delayed_work_queue(wiphy, &sdata->deflink.dfs_cac_timer_work,
				 msecs_to_jiffies(cac_time_ms));

 out_unlock:
@@ -3502,7 +3502,7 @@ static void ieee80211_end_cac(struct wiphy *wiphy,

	list_for_each_entry(sdata, &local->interfaces, list) {
		wiphy_delayed_work_cancel(wiphy,
					  &sdata->dfs_cac_timer_work);
					  &sdata->deflink.dfs_cac_timer_work);

		if (sdata->wdev.cac_started) {
			ieee80211_link_release_channel(&sdata->deflink);
+1 −2
Original line number Diff line number Diff line
@@ -1067,6 +1067,7 @@ struct ieee80211_link_data {
	int ap_power_level; /* in dBm */

	bool radar_required;
	struct wiphy_delayed_work dfs_cac_timer_work;

	union {
		struct ieee80211_link_data_managed mgd;
@@ -1165,8 +1166,6 @@ struct ieee80211_sub_if_data {
	struct ieee80211_link_data deflink;
	struct ieee80211_link_data __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS];

	struct wiphy_delayed_work dfs_cac_timer_work;

	/* for ieee80211_set_active_links_async() */
	struct wiphy_work activate_links_work;
	u16 desired_active_links;
+1 −3
Original line number Diff line number Diff line
@@ -550,7 +550,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
	wiphy_work_cancel(local->hw.wiphy,
			  &sdata->deflink.color_change_finalize_work);
	wiphy_delayed_work_cancel(local->hw.wiphy,
				  &sdata->dfs_cac_timer_work);
				  &sdata->deflink.dfs_cac_timer_work);

	if (sdata->wdev.cac_started) {
		chandef = sdata->vif.bss_conf.chanreq.oper;
@@ -1729,8 +1729,6 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
	wiphy_work_init(&sdata->work, ieee80211_iface_work);
	wiphy_work_init(&sdata->activate_links_work,
			ieee80211_activate_links_work);
	wiphy_delayed_work_init(&sdata->dfs_cac_timer_work,
				ieee80211_dfs_cac_timer_work);

	switch (type) {
	case NL80211_IFTYPE_P2P_GO:
+2 −0
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
			  ieee80211_color_collision_detection_work);
	INIT_LIST_HEAD(&link->assigned_chanctx_list);
	INIT_LIST_HEAD(&link->reserved_chanctx_list);
	wiphy_delayed_work_init(&link->dfs_cac_timer_work,
				ieee80211_dfs_cac_timer_work);

	if (!deflink) {
		switch (sdata->vif.type) {
+5 −4
Original line number Diff line number Diff line
@@ -3031,15 +3031,16 @@ void ieee80211_dynamic_ps_timer(struct timer_list *t)

void ieee80211_dfs_cac_timer_work(struct wiphy *wiphy, struct wiphy_work *work)
{
	struct ieee80211_sub_if_data *sdata =
		container_of(work, struct ieee80211_sub_if_data,
	struct ieee80211_link_data *link =
		container_of(work, struct ieee80211_link_data,
			     dfs_cac_timer_work.work);
	struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chanreq.oper;
	struct cfg80211_chan_def chandef = link->conf->chanreq.oper;
	struct ieee80211_sub_if_data *sdata = link->sdata;

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

	if (sdata->wdev.cac_started) {
		ieee80211_link_release_channel(&sdata->deflink);
		ieee80211_link_release_channel(link);
		cfg80211_cac_event(sdata->dev, &chandef,
				   NL80211_RADAR_CAC_FINISHED,
				   GFP_KERNEL);
Loading