Commit e9aac179 authored by Johannes Berg's avatar Johannes Berg
Browse files

wifi: mac80211: make some SMPS code MLD-aware



Start making some SMPS related code MLD-aware. This isn't
really done yet, but again cuts down our 'deflink' reliance.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6b41f832
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/******************************************************************************
 *
 * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2008 - 2014, 2022 Intel Corporation. All rights reserved.
 *****************************************************************************/
#include <linux/etherdevice.h>
#include <linux/kernel.h>
@@ -441,7 +441,7 @@ static void iwlagn_bt_traffic_change_work(struct work_struct *work)
		priv->current_ht_config.smps = smps_request;
		for_each_context(priv, ctx) {
			if (ctx->vif && ctx->vif->type == NL80211_IFTYPE_STATION)
				ieee80211_request_smps(ctx->vif, smps_request);
				ieee80211_request_smps(ctx->vif, 0, smps_request);
		}
	}

+1 −1
Original line number Diff line number Diff line
@@ -304,7 +304,7 @@ void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
			smps_mode = IEEE80211_SMPS_DYNAMIC;
	}

	ieee80211_request_smps(vif, smps_mode);
	ieee80211_request_smps(vif, 0, smps_mode);
}

static bool iwl_wait_stats_complete(struct iwl_notif_wait_data *notif_wait,
+2 −2
Original line number Diff line number Diff line
@@ -1600,9 +1600,9 @@ static void rtw_vif_smps_iter(void *data, u8 *mac,
		return;

	if (rtwdev->hal.txrx_1ss)
		ieee80211_request_smps(vif, IEEE80211_SMPS_STATIC);
		ieee80211_request_smps(vif, 0, IEEE80211_SMPS_STATIC);
	else
		ieee80211_request_smps(vif, IEEE80211_SMPS_OFF);
		ieee80211_request_smps(vif, 0, IEEE80211_SMPS_OFF);
}

void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool txrx_1ss)
+2 −1
Original line number Diff line number Diff line
@@ -6210,13 +6210,14 @@ void ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif,
/**
 * ieee80211_request_smps - request SM PS transition
 * @vif: &struct ieee80211_vif pointer from the add_interface callback.
 * @link_id: link ID for MLO, or 0
 * @smps_mode: new SM PS mode
 *
 * This allows the driver to request an SM PS transition in managed
 * mode. This is useful when the driver has more information than
 * the stack about possible interference, for example by bluetooth.
 */
void ieee80211_request_smps(struct ieee80211_vif *vif,
void ieee80211_request_smps(struct ieee80211_vif *vif, unsigned int link_id,
			    enum ieee80211_smps_mode smps_mode);

/**
+13 −6
Original line number Diff line number Diff line
@@ -2913,6 +2913,7 @@ static int ieee80211_testmode_dump(struct wiphy *wiphy,
#endif

int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
				 unsigned int link_id,
				 enum ieee80211_smps_mode smps_mode)
{
	const u8 *ap;
@@ -2926,8 +2927,8 @@ int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
	if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION))
		return -EINVAL;

	old_req = sdata->deflink.u.mgd.req_smps;
	sdata->deflink.u.mgd.req_smps = smps_mode;
	old_req = sdata->link[link_id]->u.mgd.req_smps;
	sdata->link[link_id]->u.mgd.req_smps = smps_mode;

	if (old_req == smps_mode &&
	    smps_mode != IEEE80211_SMPS_AUTOMATIC)
@@ -2939,10 +2940,10 @@ int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
	 * the new value until we associate.
	 */
	if (!sdata->u.mgd.associated ||
	    sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
	    sdata->vif.link_conf[link_id]->chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
		return 0;

	ap = sdata->deflink.u.mgd.bssid;
	ap = sdata->link[link_id]->u.mgd.bssid;

	rcu_read_lock();
	list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
@@ -2966,7 +2967,7 @@ int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
	err = ieee80211_send_smps_action(sdata, smps_mode,
					 ap, ap);
	if (err)
		sdata->deflink.u.mgd.req_smps = old_req;
		sdata->link[link_id]->u.mgd.req_smps = old_req;
	else if (smps_mode != IEEE80211_SMPS_OFF && tdls_peer_found)
		ieee80211_teardown_tdls_peers(sdata);

@@ -2978,6 +2979,7 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
{
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
	unsigned int link_id;

	if (sdata->vif.type != NL80211_IFTYPE_STATION)
		return -EOPNOTSUPP;
@@ -2994,7 +2996,12 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,

	/* no change, but if automatic follow powersave */
	sdata_lock(sdata);
	__ieee80211_request_smps_mgd(sdata, sdata->deflink.u.mgd.req_smps);
	for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) {
		if (!sdata->link[link_id])
			continue;
		__ieee80211_request_smps_mgd(sdata, link_id,
					     sdata->link[link_id]->u.mgd.req_smps);
	}
	sdata_unlock(sdata);

	if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
Loading