Commit 37cec6ed authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files
Johannes Berg says:

====================
A couple of straggler fixes, mostly in the stack:
 - fix fragmentation for multi-link related elements
 - fix callback copy/paste error
 - fix multi-link locking
 - remove double-locking of wiphy mutex
 - transmit only on active links, not all
 - activate links in the correct order
 - don't remove links that weren't added
 - disable soft-IRQs for LQ lock in iwlwifi

* tag 'wireless-2023-06-14' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless:
  wifi: iwlwifi: mvm: spin_lock_bh() to fix lockdep regression
  wifi: mac80211: fragment per STA profile correctly
  wifi: mac80211: Use active_links instead of valid_links in Tx
  wifi: cfg80211: remove links only on AP
  wifi: mac80211: take lock before setting vif links
  wifi: cfg80211: fix link del callback to call correct handler
  wifi: mac80211: fix link activation settings order
  wifi: cfg80211: fix double lock bug in reg_wdev_chan_valid()
====================

Link: https://lore.kernel.org/r/20230614075502.11765-1-johannes@sipsolutions.net


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents bef68e20 f1a0898b
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -2692,7 +2692,7 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,

	lq_sta = mvm_sta;

	spin_lock(&lq_sta->pers.lock);
	spin_lock_bh(&lq_sta->pers.lock);
	iwl_mvm_hwrate_to_tx_rate_v1(lq_sta->last_rate_n_flags,
				     info->band, &info->control.rates[0]);
	info->control.rates[0].count = 1;
@@ -2707,7 +2707,7 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,
		iwl_mvm_hwrate_to_tx_rate_v1(last_ucode_rate, info->band,
					     &txrc->reported_rate);
	}
	spin_unlock(&lq_sta->pers.lock);
	spin_unlock_bh(&lq_sta->pers.lock);
}

static void *rs_drv_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta,
@@ -3264,11 +3264,11 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
	/* If it's locked we are in middle of init flow
	 * just wait for next tx status to update the lq_sta data
	 */
	if (!spin_trylock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock))
	if (!spin_trylock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock))
		return;

	__iwl_mvm_rs_tx_status(mvm, sta, tid, info, ndp);
	spin_unlock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);
	spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);
}

#ifdef CONFIG_MAC80211_DEBUGFS
@@ -4117,9 +4117,9 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm,
	} else {
		struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);

		spin_lock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);
		spin_lock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);
		rs_drv_rate_init(mvm, sta, band);
		spin_unlock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);
		spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);
	}
}

+8 −1
Original line number Diff line number Diff line
@@ -4865,11 +4865,16 @@ static int ieee80211_add_intf_link(struct wiphy *wiphy,
				   unsigned int link_id)
{
	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
	int res;

	if (wdev->use_4addr)
		return -EOPNOTSUPP;

	return ieee80211_vif_set_links(sdata, wdev->valid_links);
	mutex_lock(&sdata->local->mtx);
	res = ieee80211_vif_set_links(sdata, wdev->valid_links);
	mutex_unlock(&sdata->local->mtx);

	return res;
}

static void ieee80211_del_intf_link(struct wiphy *wiphy,
@@ -4878,7 +4883,9 @@ static void ieee80211_del_intf_link(struct wiphy *wiphy,
{
	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);

	mutex_lock(&sdata->local->mtx);
	ieee80211_vif_set_links(sdata, wdev->valid_links);
	mutex_unlock(&sdata->local->mtx);
}

static int sta_add_link_station(struct ieee80211_local *local,
+1 −1
Original line number Diff line number Diff line
@@ -2312,7 +2312,7 @@ ieee802_11_parse_elems(const u8 *start, size_t len, bool action,
	return ieee802_11_parse_elems_crc(start, len, action, 0, 0, bss);
}

void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos);
void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos, u8 frag_id);

extern const int ieee802_1d_to_ac[8];

+2 −2
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
/*
 * MLO link handling
 *
 * Copyright (C) 2022 Intel Corporation
 * Copyright (C) 2022-2023 Intel Corporation
 */
#include <linux/slab.h>
#include <linux/kernel.h>
@@ -409,6 +409,7 @@ static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata,
						 IEEE80211_CHANCTX_SHARED);
		WARN_ON_ONCE(ret);

		ieee80211_mgd_set_link_qos_params(link);
		ieee80211_link_info_change_notify(sdata, link,
						  BSS_CHANGED_ERP_CTS_PROT |
						  BSS_CHANGED_ERP_PREAMBLE |
@@ -423,7 +424,6 @@ static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata,
						  BSS_CHANGED_TWT |
						  BSS_CHANGED_HE_OBSS_PD |
						  BSS_CHANGED_HE_BSS_COLOR);
		ieee80211_mgd_set_link_qos_params(link);
	}

	old_active = sdata->vif.active_links;
+3 −2
Original line number Diff line number Diff line
@@ -1372,10 +1372,11 @@ static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
		ieee80211_add_non_inheritance_elem(skb, outer_present_elems,
						   link_present_elems);

		ieee80211_fragment_element(skb, subelem_len);
		ieee80211_fragment_element(skb, subelem_len,
					   IEEE80211_MLE_SUBELEM_FRAGMENT);
	}

	ieee80211_fragment_element(skb, ml_elem_len);
	ieee80211_fragment_element(skb, ml_elem_len, WLAN_EID_FRAGMENT);
}

static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
Loading