mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
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 -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEpeA8sTs3M8SN2hR410qiO8sPaAAFAmSJcf0ACgkQ10qiO8sP aAC77Q//TOZSUoAFnMqsA23SXwN8CeNQC5yBmYwxVMcsqBTO6+7k0NphpFGJUcLA OG8Leo6gwJdhLFYt7bl7RfHGSQrAZcNeYB9pv9J96vGQGnCComAAANEWSo8OBT2a 03yYrfcKfkXAUNm2dxKvwmi3D3/VPyOgj+O6LNEs1DogHw0V6GdthW3J6s/vl6RU MPCQqlIFY9j20mXEKPFMaIZ8fyQKh38xa5YttGmeFrSUKYSljWUqqUooSMIkeyS4 D5mYdzbsqCiihnN1FenEjkBUe2eS6BzxL+KVLaY2vth4tQytGeasvCaGcLcB83nc BxGR0rbEkrwp7nBqE4ZpMmhzHG3hpWus2+hJtMWsQku7qzE/vMh4qv2s2+QUVk/3 jCXGv233bIgvQ2d1SUqp7CenGjJ0eBfKKRVzM+Hyiz+V6kWsugMxNaBmi59JVB7w 5JilT85LfV2cRJgHtkDY7kMpDWnVYfwenvSywoXaRdVuKiowMUhZ9P19wLE0gn7K qtKIaLnkrLE2QHdqlxcuyMPBLhfga2+qXuo94SIYMFNURW7jjJcSVlN8ZVqqBvvp ib51XCyx/95zAr1Vyly/Pc7puuCMiiQk0ZhQBgqFPrnjs37JIzHDNo4Cq6H9+FlY 0EncP/akjy8t7PsBdTmQv1UG3wq4EG5Wmh+wLDpa5QKKs2IqcCQ= =IPqO -----END PGP SIGNATURE----- Merge tag 'wireless-2023-06-14' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless 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: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
37cec6ed8d
@ -2692,7 +2692,7 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,
|
|||||||
|
|
||||||
lq_sta = mvm_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,
|
iwl_mvm_hwrate_to_tx_rate_v1(lq_sta->last_rate_n_flags,
|
||||||
info->band, &info->control.rates[0]);
|
info->band, &info->control.rates[0]);
|
||||||
info->control.rates[0].count = 1;
|
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,
|
iwl_mvm_hwrate_to_tx_rate_v1(last_ucode_rate, info->band,
|
||||||
&txrc->reported_rate);
|
&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,
|
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
|
/* If it's locked we are in middle of init flow
|
||||||
* just wait for next tx status to update the lq_sta data
|
* 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;
|
return;
|
||||||
|
|
||||||
__iwl_mvm_rs_tx_status(mvm, sta, tid, info, ndp);
|
__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
|
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||||
@ -4117,9 +4117,9 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm,
|
|||||||
} else {
|
} else {
|
||||||
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
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);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4865,11 +4865,16 @@ static int ieee80211_add_intf_link(struct wiphy *wiphy,
|
|||||||
unsigned int link_id)
|
unsigned int link_id)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||||
|
int res;
|
||||||
|
|
||||||
if (wdev->use_4addr)
|
if (wdev->use_4addr)
|
||||||
return -EOPNOTSUPP;
|
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,
|
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);
|
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);
|
ieee80211_vif_set_links(sdata, wdev->valid_links);
|
||||||
|
mutex_unlock(&sdata->local->mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sta_add_link_station(struct ieee80211_local *local,
|
static int sta_add_link_station(struct ieee80211_local *local,
|
||||||
|
@ -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);
|
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];
|
extern const int ieee802_1d_to_ac[8];
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* MLO link handling
|
* MLO link handling
|
||||||
*
|
*
|
||||||
* Copyright (C) 2022 Intel Corporation
|
* Copyright (C) 2022-2023 Intel Corporation
|
||||||
*/
|
*/
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
@ -409,6 +409,7 @@ static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata,
|
|||||||
IEEE80211_CHANCTX_SHARED);
|
IEEE80211_CHANCTX_SHARED);
|
||||||
WARN_ON_ONCE(ret);
|
WARN_ON_ONCE(ret);
|
||||||
|
|
||||||
|
ieee80211_mgd_set_link_qos_params(link);
|
||||||
ieee80211_link_info_change_notify(sdata, link,
|
ieee80211_link_info_change_notify(sdata, link,
|
||||||
BSS_CHANGED_ERP_CTS_PROT |
|
BSS_CHANGED_ERP_CTS_PROT |
|
||||||
BSS_CHANGED_ERP_PREAMBLE |
|
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_TWT |
|
||||||
BSS_CHANGED_HE_OBSS_PD |
|
BSS_CHANGED_HE_OBSS_PD |
|
||||||
BSS_CHANGED_HE_BSS_COLOR);
|
BSS_CHANGED_HE_BSS_COLOR);
|
||||||
ieee80211_mgd_set_link_qos_params(link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
old_active = sdata->vif.active_links;
|
old_active = sdata->vif.active_links;
|
||||||
|
@ -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,
|
ieee80211_add_non_inheritance_elem(skb, outer_present_elems,
|
||||||
link_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)
|
static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||||
|
@ -4445,7 +4445,7 @@ static void ieee80211_mlo_multicast_tx(struct net_device *dev,
|
|||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
unsigned long links = sdata->vif.valid_links;
|
unsigned long links = sdata->vif.active_links;
|
||||||
unsigned int link;
|
unsigned int link;
|
||||||
u32 ctrl_flags = IEEE80211_TX_CTRL_MCAST_MLO_FIRST_TX;
|
u32 ctrl_flags = IEEE80211_TX_CTRL_MCAST_MLO_FIRST_TX;
|
||||||
|
|
||||||
@ -6040,7 +6040,7 @@ void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (WARN_ON_ONCE(link == ARRAY_SIZE(sdata->vif.link_conf)))
|
if (WARN_ON_ONCE(link == ARRAY_SIZE(sdata->vif.link_conf)))
|
||||||
link = ffs(sdata->vif.valid_links) - 1;
|
link = ffs(sdata->vif.active_links) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEEE80211_SKB_CB(skb)->control.flags |=
|
IEEE80211_SKB_CB(skb)->control.flags |=
|
||||||
@ -6076,7 +6076,7 @@ void ieee80211_tx_skb_tid(struct ieee80211_sub_if_data *sdata,
|
|||||||
band = chanctx_conf->def.chan->band;
|
band = chanctx_conf->def.chan->band;
|
||||||
} else {
|
} else {
|
||||||
WARN_ON(link_id >= 0 &&
|
WARN_ON(link_id >= 0 &&
|
||||||
!(sdata->vif.valid_links & BIT(link_id)));
|
!(sdata->vif.active_links & BIT(link_id)));
|
||||||
/* MLD transmissions must not rely on the band */
|
/* MLD transmissions must not rely on the band */
|
||||||
band = 0;
|
band = 0;
|
||||||
}
|
}
|
||||||
|
@ -5049,7 +5049,7 @@ u8 *ieee80211_ie_build_eht_cap(u8 *pos,
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
unsigned int elem_len;
|
unsigned int elem_len;
|
||||||
|
|
||||||
@ -5069,7 +5069,7 @@ void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos)
|
|||||||
memmove(len_pos + 255 + 3, len_pos + 255 + 1, elem_len);
|
memmove(len_pos + 255 + 3, len_pos + 255 + 1, elem_len);
|
||||||
/* place the fragment ID */
|
/* place the fragment ID */
|
||||||
len_pos += 255 + 1;
|
len_pos += 255 + 1;
|
||||||
*len_pos = WLAN_EID_FRAGMENT;
|
*len_pos = frag_id;
|
||||||
/* and point to fragment length to update later */
|
/* and point to fragment length to update later */
|
||||||
len_pos++;
|
len_pos++;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
* Portions of this file
|
* Portions of this file
|
||||||
* Copyright(c) 2016-2017 Intel Deutschland GmbH
|
* Copyright(c) 2016-2017 Intel Deutschland GmbH
|
||||||
* Copyright (C) 2018, 2021-2022 Intel Corporation
|
* Copyright (C) 2018, 2021-2023 Intel Corporation
|
||||||
*/
|
*/
|
||||||
#ifndef __CFG80211_RDEV_OPS
|
#ifndef __CFG80211_RDEV_OPS
|
||||||
#define __CFG80211_RDEV_OPS
|
#define __CFG80211_RDEV_OPS
|
||||||
@ -1441,8 +1441,8 @@ rdev_del_intf_link(struct cfg80211_registered_device *rdev,
|
|||||||
unsigned int link_id)
|
unsigned int link_id)
|
||||||
{
|
{
|
||||||
trace_rdev_del_intf_link(&rdev->wiphy, wdev, link_id);
|
trace_rdev_del_intf_link(&rdev->wiphy, wdev, link_id);
|
||||||
if (rdev->ops->add_intf_link)
|
if (rdev->ops->del_intf_link)
|
||||||
rdev->ops->add_intf_link(&rdev->wiphy, wdev, link_id);
|
rdev->ops->del_intf_link(&rdev->wiphy, wdev, link_id);
|
||||||
trace_rdev_return_void(&rdev->wiphy);
|
trace_rdev_return_void(&rdev->wiphy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2404,11 +2404,8 @@ static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
|
|||||||
case NL80211_IFTYPE_P2P_GO:
|
case NL80211_IFTYPE_P2P_GO:
|
||||||
case NL80211_IFTYPE_ADHOC:
|
case NL80211_IFTYPE_ADHOC:
|
||||||
case NL80211_IFTYPE_MESH_POINT:
|
case NL80211_IFTYPE_MESH_POINT:
|
||||||
wiphy_lock(wiphy);
|
|
||||||
ret = cfg80211_reg_can_beacon_relax(wiphy, &chandef,
|
ret = cfg80211_reg_can_beacon_relax(wiphy, &chandef,
|
||||||
iftype);
|
iftype);
|
||||||
wiphy_unlock(wiphy);
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Copyright 2007-2009 Johannes Berg <johannes@sipsolutions.net>
|
* Copyright 2007-2009 Johannes Berg <johannes@sipsolutions.net>
|
||||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||||
* Copyright 2017 Intel Deutschland GmbH
|
* Copyright 2017 Intel Deutschland GmbH
|
||||||
* Copyright (C) 2018-2022 Intel Corporation
|
* Copyright (C) 2018-2023 Intel Corporation
|
||||||
*/
|
*/
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
@ -2558,6 +2558,13 @@ void cfg80211_remove_links(struct wireless_dev *wdev)
|
|||||||
{
|
{
|
||||||
unsigned int link_id;
|
unsigned int link_id;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* links are controlled by upper layers (userspace/cfg)
|
||||||
|
* only for AP mode, so only remove them here for AP
|
||||||
|
*/
|
||||||
|
if (wdev->iftype != NL80211_IFTYPE_AP)
|
||||||
|
return;
|
||||||
|
|
||||||
wdev_lock(wdev);
|
wdev_lock(wdev);
|
||||||
if (wdev->valid_links) {
|
if (wdev->valid_links) {
|
||||||
for_each_valid_link(wdev, link_id)
|
for_each_valid_link(wdev, link_id)
|
||||||
|
Loading…
Reference in New Issue
Block a user