wireless fixes for v6.8-rc2

The most visible fix here is the ath11k crash fix which was introduced
 in v6.7. We also have a fix for iwlwifi memory corruption and few
 smaller fixes in the stack.
 -----BEGIN PGP SIGNATURE-----
 
 iQFFBAABCgAvFiEEiBjanGPFTz4PRfLobhckVSbrbZsFAmWuipMRHGt2YWxvQGtl
 cm5lbC5vcmcACgkQbhckVSbrbZt17wgAhrkxpwRpMuRrV6VxHl9m+NXk7is2vni2
 JZbqlvMIw1Hm+40K9D0WgFdNZUeAtBcd567MAbiqdzqRNB9DtEvnsXIKlKINwxIA
 QFskkXR1f0sj79Hz3q7iWQq+jxDvAU5tge/WU65Na7+224sdyzBg7DZab8/buOsm
 1xdx69MtGNU+dm4+V1Xp8h9jB7WAjq7N+ZhC6YfH6QSCL7JSL9Co/NC098gBnAEx
 cm59vPOxk8+QoHKDjjmClTIhxOEgR6pSM8T3Dne9OYO8ONhxqdVSgd0Br+mEZgQ4
 r61i88zK6ZmVZYckk6fhuGCLiKC6CFwS0eCLDQnKK1ufyRxDi84Y/Q==
 =Cwmf
 -----END PGP SIGNATURE-----

Merge tag 'wireless-2024-01-22' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless

Kalle Valo says:

====================
wireless fixes for v6.8-rc2

The most visible fix here is the ath11k crash fix which was introduced
in v6.7. We also have a fix for iwlwifi memory corruption and few
smaller fixes in the stack.

* tag 'wireless-2024-01-22' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless:
  wifi: mac80211: fix race condition on enabling fast-xmit
  wifi: iwlwifi: fix a memory corruption
  wifi: mac80211: fix potential sta-link leak
  wifi: cfg80211/mac80211: remove dependency on non-existing option
  wifi: cfg80211: fix missing interfaces when dumping
  wifi: ath11k: rely on mac80211 debugfs handling for vif
  wifi: p54: fix GCC format truncation warning with wiphy->fw_version
====================

Link: https://lore.kernel.org/r/20240122153434.E0254C433C7@smtp.kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2024-01-23 08:38:13 -08:00
commit 1347775dea
11 changed files with 24 additions and 47 deletions

View file

@ -368,10 +368,6 @@ struct ath11k_vif {
struct ieee80211_chanctx_conf chanctx; struct ieee80211_chanctx_conf chanctx;
struct ath11k_arp_ns_offload arp_ns_offload; struct ath11k_arp_ns_offload arp_ns_offload;
struct ath11k_rekey_data rekey_data; struct ath11k_rekey_data rekey_data;
#ifdef CONFIG_ATH11K_DEBUGFS
struct dentry *debugfs_twt;
#endif /* CONFIG_ATH11K_DEBUGFS */
}; };
struct ath11k_vif_iter { struct ath11k_vif_iter {

View file

@ -1894,35 +1894,30 @@ static const struct file_operations ath11k_fops_twt_resume_dialog = {
.open = simple_open .open = simple_open
}; };
void ath11k_debugfs_add_interface(struct ath11k_vif *arvif) void ath11k_debugfs_op_vif_add(struct ieee80211_hw *hw,
struct ieee80211_vif *vif)
{ {
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
struct ath11k_base *ab = arvif->ar->ab; struct ath11k_base *ab = arvif->ar->ab;
struct dentry *debugfs_twt;
if (arvif->vif->type != NL80211_IFTYPE_AP && if (arvif->vif->type != NL80211_IFTYPE_AP &&
!(arvif->vif->type == NL80211_IFTYPE_STATION && !(arvif->vif->type == NL80211_IFTYPE_STATION &&
test_bit(WMI_TLV_SERVICE_STA_TWT, ab->wmi_ab.svc_map))) test_bit(WMI_TLV_SERVICE_STA_TWT, ab->wmi_ab.svc_map)))
return; return;
arvif->debugfs_twt = debugfs_create_dir("twt", debugfs_twt = debugfs_create_dir("twt",
arvif->vif->debugfs_dir); arvif->vif->debugfs_dir);
debugfs_create_file("add_dialog", 0200, arvif->debugfs_twt, debugfs_create_file("add_dialog", 0200, debugfs_twt,
arvif, &ath11k_fops_twt_add_dialog); arvif, &ath11k_fops_twt_add_dialog);
debugfs_create_file("del_dialog", 0200, arvif->debugfs_twt, debugfs_create_file("del_dialog", 0200, debugfs_twt,
arvif, &ath11k_fops_twt_del_dialog); arvif, &ath11k_fops_twt_del_dialog);
debugfs_create_file("pause_dialog", 0200, arvif->debugfs_twt, debugfs_create_file("pause_dialog", 0200, debugfs_twt,
arvif, &ath11k_fops_twt_pause_dialog); arvif, &ath11k_fops_twt_pause_dialog);
debugfs_create_file("resume_dialog", 0200, arvif->debugfs_twt, debugfs_create_file("resume_dialog", 0200, debugfs_twt,
arvif, &ath11k_fops_twt_resume_dialog); arvif, &ath11k_fops_twt_resume_dialog);
} }
void ath11k_debugfs_remove_interface(struct ath11k_vif *arvif)
{
if (!arvif->debugfs_twt)
return;
debugfs_remove_recursive(arvif->debugfs_twt);
arvif->debugfs_twt = NULL;
}

View file

@ -307,8 +307,8 @@ static inline int ath11k_debugfs_rx_filter(struct ath11k *ar)
return ar->debug.rx_filter; return ar->debug.rx_filter;
} }
void ath11k_debugfs_add_interface(struct ath11k_vif *arvif); void ath11k_debugfs_op_vif_add(struct ieee80211_hw *hw,
void ath11k_debugfs_remove_interface(struct ath11k_vif *arvif); struct ieee80211_vif *vif);
void ath11k_debugfs_add_dbring_entry(struct ath11k *ar, void ath11k_debugfs_add_dbring_entry(struct ath11k *ar,
enum wmi_direct_buffer_module id, enum wmi_direct_buffer_module id,
enum ath11k_dbg_dbr_event event, enum ath11k_dbg_dbr_event event,
@ -387,14 +387,6 @@ static inline int ath11k_debugfs_get_fw_stats(struct ath11k *ar,
return 0; return 0;
} }
static inline void ath11k_debugfs_add_interface(struct ath11k_vif *arvif)
{
}
static inline void ath11k_debugfs_remove_interface(struct ath11k_vif *arvif)
{
}
static inline void static inline void
ath11k_debugfs_add_dbring_entry(struct ath11k *ar, ath11k_debugfs_add_dbring_entry(struct ath11k *ar,
enum wmi_direct_buffer_module id, enum wmi_direct_buffer_module id,

View file

@ -6756,13 +6756,6 @@ static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
goto err; goto err;
} }
/* In the case of hardware recovery, debugfs files are
* not deleted since ieee80211_ops.remove_interface() is
* not invoked. In such cases, try to delete the files.
* These will be re-created later.
*/
ath11k_debugfs_remove_interface(arvif);
memset(arvif, 0, sizeof(*arvif)); memset(arvif, 0, sizeof(*arvif));
arvif->ar = ar; arvif->ar = ar;
@ -6939,8 +6932,6 @@ static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
ath11k_dp_vdev_tx_attach(ar, arvif); ath11k_dp_vdev_tx_attach(ar, arvif);
ath11k_debugfs_add_interface(arvif);
if (vif->type != NL80211_IFTYPE_MONITOR && if (vif->type != NL80211_IFTYPE_MONITOR &&
test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) { test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
ret = ath11k_mac_monitor_vdev_create(ar); ret = ath11k_mac_monitor_vdev_create(ar);
@ -7056,8 +7047,6 @@ static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
/* Recalc txpower for remaining vdev */ /* Recalc txpower for remaining vdev */
ath11k_mac_txpower_recalc(ar); ath11k_mac_txpower_recalc(ar);
ath11k_debugfs_remove_interface(arvif);
/* TODO: recal traffic pause state based on the available vdevs */ /* TODO: recal traffic pause state based on the available vdevs */
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
@ -9153,6 +9142,7 @@ static const struct ieee80211_ops ath11k_ops = {
#endif #endif
#ifdef CONFIG_ATH11K_DEBUGFS #ifdef CONFIG_ATH11K_DEBUGFS
.vif_add_debugfs = ath11k_debugfs_op_vif_add,
.sta_add_debugfs = ath11k_debugfs_sta_op_add, .sta_add_debugfs = ath11k_debugfs_sta_op_add,
#endif #endif

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/* /*
* Copyright (C) 2018-2023 Intel Corporation * Copyright (C) 2018-2024 Intel Corporation
*/ */
#include <linux/firmware.h> #include <linux/firmware.h>
#include "iwl-drv.h" #include "iwl-drv.h"
@ -1096,7 +1096,7 @@ static int iwl_dbg_tlv_override_trig_node(struct iwl_fw_runtime *fwrt,
node_trig = (void *)node_tlv->data; node_trig = (void *)node_tlv->data;
} }
memcpy(node_trig->data + offset, trig->data, trig_data_len); memcpy((u8 *)node_trig->data + offset, trig->data, trig_data_len);
node_tlv->length = cpu_to_le32(size); node_tlv->length = cpu_to_le32(size);
if (policy & IWL_FW_INI_APPLY_POLICY_OVERRIDE_CFG) { if (policy & IWL_FW_INI_APPLY_POLICY_OVERRIDE_CFG) {

View file

@ -125,7 +125,7 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
"FW rev %s - Softmac protocol %x.%x\n", "FW rev %s - Softmac protocol %x.%x\n",
fw_version, priv->fw_var >> 8, priv->fw_var & 0xff); fw_version, priv->fw_var >> 8, priv->fw_var & 0xff);
snprintf(dev->wiphy->fw_version, sizeof(dev->wiphy->fw_version), snprintf(dev->wiphy->fw_version, sizeof(dev->wiphy->fw_version),
"%s - %x.%x", fw_version, "%.19s - %x.%x", fw_version,
priv->fw_var >> 8, priv->fw_var & 0xff); priv->fw_var >> 8, priv->fw_var & 0xff);
} }

View file

@ -62,7 +62,6 @@ config MAC80211_KUNIT_TEST
depends on KUNIT depends on KUNIT
depends on MAC80211 depends on MAC80211
default KUNIT_ALL_TESTS default KUNIT_ALL_TESTS
depends on !KERNEL_6_2
help help
Enable this option to test mac80211 internals with kunit. Enable this option to test mac80211 internals with kunit.

View file

@ -404,7 +404,10 @@ void sta_info_free(struct ieee80211_local *local, struct sta_info *sta)
int i; int i;
for (i = 0; i < ARRAY_SIZE(sta->link); i++) { for (i = 0; i < ARRAY_SIZE(sta->link); i++) {
if (!(sta->sta.valid_links & BIT(i))) struct link_sta_info *link_sta;
link_sta = rcu_access_pointer(sta->link[i]);
if (!link_sta)
continue; continue;
sta_remove_link(sta, i, false); sta_remove_link(sta, i, false);
@ -910,6 +913,8 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
if (ieee80211_vif_is_mesh(&sdata->vif)) if (ieee80211_vif_is_mesh(&sdata->vif))
mesh_accept_plinks_update(sdata); mesh_accept_plinks_update(sdata);
ieee80211_check_fast_xmit(sta);
return 0; return 0;
out_remove: out_remove:
if (sta->sta.valid_links) if (sta->sta.valid_links)

View file

@ -3048,7 +3048,7 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
sdata->vif.type == NL80211_IFTYPE_STATION) sdata->vif.type == NL80211_IFTYPE_STATION)
goto out; goto out;
if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED)) if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED) || !sta->uploaded)
goto out; goto out;
if (test_sta_flag(sta, WLAN_STA_PS_STA) || if (test_sta_flag(sta, WLAN_STA_PS_STA) ||

View file

@ -206,7 +206,6 @@ config CFG80211_KUNIT_TEST
depends on KUNIT depends on KUNIT
depends on CFG80211 depends on CFG80211
default KUNIT_ALL_TESTS default KUNIT_ALL_TESTS
depends on !KERNEL_6_2
help help
Enable this option to test cfg80211 functions with kunit. Enable this option to test cfg80211 functions with kunit.

View file

@ -4020,6 +4020,7 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *
} }
wiphy_unlock(&rdev->wiphy); wiphy_unlock(&rdev->wiphy);
if_start = 0;
wp_idx++; wp_idx++;
} }
out: out: