mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-05 00:07:48 -04:00
Merge tag 'wireless-next-2026-01-12' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next
Johannes Berg says: ==================== First set of changes for the current -next cycle, of note: - ath12k gets an overhaul to support multi-wiphy device wiphy and pave the way for future device support in the same driver (rather than splitting to ath13k) - mac80211 gets some better iteration macros * tag 'wireless-next-2026-01-12' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next: (120 commits) wifi: mac80211: remove width argument from ieee80211_parse_bitrates wifi: mac80211_hwsim: remove NAN by default wifi: mac80211: improve station iteration ergonomics wifi: mac80211: improve interface iteration ergonomics wifi: cfg80211: include S1G_NO_PRIMARY flag when sending channel wifi: mac80211: unexport ieee80211_get_bssid() wl1251: Replace strncpy with strscpy in wl1251_acx_fw_version wifi: iwlegacy: 3945-rs: remove redundant pointer check in il3945_rs_tx_status() and il3945_rs_get_rate() wifi: mac80211: don't send an unused argument to ieee80211_check_combinations wifi: libertas: fix WARNING in usb_tx_block wifi: mwifiex: Allocate dev name earlier for interface workqueue name wifi: wlcore: sdio: Use pm_ptr instead of #ifdef CONFIG_PM wifi: cfg80211: Fix use_for flag update on BSS refresh wifi: brcmfmac: rename function that frees vif wifi: brcmfmac: fix/add kernel-doc comments wifi: mac80211: Update csa_finalize to use link_id wifi: cfg80211: add cfg80211_stop_link() for per-link teardown wifi: ath12k: Skip DP peer creation for scan vdev wifi: ath12k: move firmware stats request outside of atomic context wifi: ath12k: add the missing RCU lock in ath12k_dp_tx_free_txbuf() ... ==================== Link: https://patch.msgid.link/20260112185836.378736-3-johannes@sipsolutions.net Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -2125,8 +2125,7 @@ static int sta_link_apply_parameters(struct ieee80211_local *local,
|
||||
|
||||
if (params->supported_rates &&
|
||||
params->supported_rates_len &&
|
||||
!ieee80211_parse_bitrates(link->conf->chanreq.oper.width,
|
||||
sband, params->supported_rates,
|
||||
!ieee80211_parse_bitrates(sband, params->supported_rates,
|
||||
params->supported_rates_len,
|
||||
&link_sta->pub->supp_rates[sband->band]))
|
||||
return -EINVAL;
|
||||
@@ -2987,8 +2986,7 @@ static int ieee80211_change_bss(struct wiphy *wiphy,
|
||||
return -EINVAL;
|
||||
|
||||
if (params->basic_rates) {
|
||||
if (!ieee80211_parse_bitrates(link->conf->chanreq.oper.width,
|
||||
wiphy->bands[sband->band],
|
||||
if (!ieee80211_parse_bitrates(sband,
|
||||
params->basic_rates,
|
||||
params->basic_rates_len,
|
||||
&link->conf->basic_rates))
|
||||
@@ -4151,12 +4149,21 @@ static int __ieee80211_csa_finalize(struct ieee80211_link_data *link_data)
|
||||
static void ieee80211_csa_finalize(struct ieee80211_link_data *link_data)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = link_data->sdata;
|
||||
int link_id = -1;
|
||||
|
||||
if (__ieee80211_csa_finalize(link_data)) {
|
||||
sdata_info(sdata, "failed to finalize CSA on link %d, disconnecting\n",
|
||||
link_data->link_id);
|
||||
cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev,
|
||||
GFP_KERNEL);
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
sdata->vif.type == NL80211_IFTYPE_P2P_GO)
|
||||
/*
|
||||
* link_id is expected only for AP/P2P_GO type
|
||||
* currently
|
||||
*/
|
||||
link_id = link_data->link_id;
|
||||
|
||||
cfg80211_stop_link(sdata->local->hw.wiphy, &sdata->wdev,
|
||||
link_id, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4400,7 +4407,7 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||
goto out;
|
||||
|
||||
/* if reservation is invalid then this will fail */
|
||||
err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0, -1);
|
||||
err = ieee80211_check_combinations(sdata, NULL, 0, 0, -1);
|
||||
if (err) {
|
||||
ieee80211_link_unreserve_chanctx(link_data);
|
||||
goto out;
|
||||
|
||||
@@ -2660,8 +2660,7 @@ u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata);
|
||||
u8 *ieee80211_ie_build_he_oper(u8 *pos, const struct cfg80211_chan_def *chandef);
|
||||
u8 *ieee80211_ie_build_eht_oper(u8 *pos, const struct cfg80211_chan_def *chandef,
|
||||
const struct ieee80211_sta_eht_cap *eht_cap);
|
||||
int ieee80211_parse_bitrates(enum nl80211_chan_width width,
|
||||
const struct ieee80211_supported_band *sband,
|
||||
int ieee80211_parse_bitrates(const struct ieee80211_supported_band *sband,
|
||||
const u8 *srates, int srates_len, u32 *rates);
|
||||
u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo);
|
||||
void ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
@@ -1548,7 +1548,7 @@ static void ieee80211_assoc_add_rates(struct ieee80211_local *local,
|
||||
* in the association request (e.g. D-Link DAP 1353 in
|
||||
* b-only mode)...
|
||||
*/
|
||||
ieee80211_parse_bitrates(width, sband,
|
||||
ieee80211_parse_bitrates(sband,
|
||||
assoc_data->supp_rates,
|
||||
assoc_data->supp_rates_len,
|
||||
&rates);
|
||||
|
||||
@@ -1115,8 +1115,7 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
|
||||
}
|
||||
EXPORT_SYMBOL_IF_KUNIT(ieee802_11_parse_elems_full);
|
||||
|
||||
int ieee80211_parse_bitrates(enum nl80211_chan_width width,
|
||||
const struct ieee80211_supported_band *sband,
|
||||
int ieee80211_parse_bitrates(const struct ieee80211_supported_band *sband,
|
||||
const u8 *srates, int srates_len, u32 *rates)
|
||||
{
|
||||
struct ieee80211_rate *br;
|
||||
|
||||
@@ -101,7 +101,6 @@ u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_get_bssid);
|
||||
|
||||
void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
|
||||
{
|
||||
@@ -800,20 +799,56 @@ void ieee80211_iterate_active_interfaces_atomic(
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
|
||||
|
||||
void ieee80211_iterate_active_interfaces_mtx(
|
||||
struct ieee80211_hw *hw, u32 iter_flags,
|
||||
void (*iterator)(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif),
|
||||
void *data)
|
||||
struct ieee80211_vif *
|
||||
__ieee80211_iterate_interfaces(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *prev,
|
||||
u32 iter_flags)
|
||||
{
|
||||
bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE;
|
||||
struct ieee80211_sub_if_data *sdata = NULL, *monitor;
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
|
||||
lockdep_assert_wiphy(hw->wiphy);
|
||||
|
||||
__iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
|
||||
iterator, data);
|
||||
if (prev)
|
||||
sdata = vif_to_sdata(prev);
|
||||
|
||||
monitor = rcu_dereference_check(local->monitor_sdata,
|
||||
lockdep_is_held(&hw->wiphy->mtx));
|
||||
if (monitor && monitor == sdata)
|
||||
return NULL;
|
||||
|
||||
sdata = list_prepare_entry(sdata, &local->interfaces, list);
|
||||
list_for_each_entry_continue(sdata, &local->interfaces, list) {
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) &&
|
||||
!ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
|
||||
continue;
|
||||
break;
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) &&
|
||||
active_only && !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
|
||||
continue;
|
||||
if ((iter_flags & IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER) &&
|
||||
!(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
|
||||
continue;
|
||||
if (ieee80211_sdata_running(sdata) || !active_only)
|
||||
return &sdata->vif;
|
||||
}
|
||||
|
||||
if (monitor && ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) &&
|
||||
(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || !active_only ||
|
||||
monitor->flags & IEEE80211_SDATA_IN_DRIVER))
|
||||
return &monitor->vif;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_mtx);
|
||||
EXPORT_SYMBOL_GPL(__ieee80211_iterate_interfaces);
|
||||
|
||||
static void __iterate_stations(struct ieee80211_local *local,
|
||||
void (*iterator)(void *data,
|
||||
@@ -844,18 +879,29 @@ void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic);
|
||||
|
||||
void ieee80211_iterate_stations_mtx(struct ieee80211_hw *hw,
|
||||
void (*iterator)(void *data,
|
||||
struct ieee80211_sta *sta),
|
||||
void *data)
|
||||
struct ieee80211_sta *
|
||||
__ieee80211_iterate_stations(struct ieee80211_hw *hw,
|
||||
struct ieee80211_sta *prev)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct sta_info *sta = NULL;
|
||||
|
||||
lockdep_assert_wiphy(local->hw.wiphy);
|
||||
|
||||
__iterate_stations(local, iterator, data);
|
||||
if (prev)
|
||||
sta = container_of(prev, struct sta_info, sta);
|
||||
|
||||
sta = list_prepare_entry(sta, &local->sta_list, list);
|
||||
list_for_each_entry_continue(sta, &local->sta_list, list) {
|
||||
if (!sta->uploaded)
|
||||
continue;
|
||||
|
||||
return &sta->sta;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_mtx);
|
||||
EXPORT_SYMBOL_GPL(__ieee80211_iterate_stations);
|
||||
|
||||
struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user