summaryrefslogtreecommitdiff
path: root/libre/linux-libre/0003-wifi-ath11k-rely-on-mac80211-debugfs-handling-for-vi.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libre/linux-libre/0003-wifi-ath11k-rely-on-mac80211-debugfs-handling-for-vi.patch')
-rw-r--r--libre/linux-libre/0003-wifi-ath11k-rely-on-mac80211-debugfs-handling-for-vi.patch163
1 files changed, 163 insertions, 0 deletions
diff --git a/libre/linux-libre/0003-wifi-ath11k-rely-on-mac80211-debugfs-handling-for-vi.patch b/libre/linux-libre/0003-wifi-ath11k-rely-on-mac80211-debugfs-handling-for-vi.patch
new file mode 100644
index 000000000..e6280b215
--- /dev/null
+++ b/libre/linux-libre/0003-wifi-ath11k-rely-on-mac80211-debugfs-handling-for-vi.patch
@@ -0,0 +1,163 @@
+From 7c13cc521f78fd261de3001dac48fd572baae671 Mon Sep 17 00:00:00 2001
+From: Benjamin Berg <benjamin.berg@intel.com>
+Date: Thu, 11 Jan 2024 18:06:29 +0100
+Subject: [PATCH 3/4] wifi: ath11k: rely on mac80211 debugfs handling for vif
+
+mac80211 started to delete debugfs entries in certain cases, causing a
+conflict between ath11k also trying to delete them later on. Fix this by
+relying on mac80211 to delete the entries when appropriate and adding
+them from the vif_add_debugfs handler.
+
+Fixes: 0a3d898ee9a8 ("wifi: mac80211: add/remove driver debugfs entries as appropriate")
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=218364
+Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
+Cherry-picked-for: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/18
+---
+ drivers/net/wireless/ath/ath11k/core.h | 4 ----
+ drivers/net/wireless/ath/ath11k/debugfs.c | 25 +++++++++--------------
+ drivers/net/wireless/ath/ath11k/debugfs.h | 12 ++---------
+ drivers/net/wireless/ath/ath11k/mac.c | 12 +----------
+ 4 files changed, 13 insertions(+), 40 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h
+index f12b606e2d2e..667d55e26156 100644
+--- a/drivers/net/wireless/ath/ath11k/core.h
++++ b/drivers/net/wireless/ath/ath11k/core.h
+@@ -368,10 +368,6 @@ struct ath11k_vif {
+ struct ieee80211_chanctx_conf chanctx;
+ struct ath11k_arp_ns_offload arp_ns_offload;
+ struct ath11k_rekey_data rekey_data;
+-
+-#ifdef CONFIG_ATH11K_DEBUGFS
+- struct dentry *debugfs_twt;
+-#endif /* CONFIG_ATH11K_DEBUGFS */
+ };
+
+ struct ath11k_vif_iter {
+diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c
+index be76e7d1c436..3ba6aa077e36 100644
+--- a/drivers/net/wireless/ath/ath11k/debugfs.c
++++ b/drivers/net/wireless/ath/ath11k/debugfs.c
+@@ -1893,35 +1893,30 @@ static const struct file_operations ath11k_fops_twt_resume_dialog = {
+ .open = simple_open
+ };
+
+-void ath11k_debugfs_add_interface(struct ath11k_vif *arvif)
++void ath11k_debugfs_op_add_interface(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 dentry *debugfs_twt;
+
+ if (arvif->vif->type != NL80211_IFTYPE_AP &&
+ !(arvif->vif->type == NL80211_IFTYPE_STATION &&
+ test_bit(WMI_TLV_SERVICE_STA_TWT, ab->wmi_ab.svc_map)))
+ return;
+
+- arvif->debugfs_twt = debugfs_create_dir("twt",
+- arvif->vif->debugfs_dir);
+- debugfs_create_file("add_dialog", 0200, arvif->debugfs_twt,
++ debugfs_twt = debugfs_create_dir("twt",
++ arvif->vif->debugfs_dir);
++ debugfs_create_file("add_dialog", 0200, debugfs_twt,
+ 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);
+
+- debugfs_create_file("pause_dialog", 0200, arvif->debugfs_twt,
++ debugfs_create_file("pause_dialog", 0200, debugfs_twt,
+ 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);
+ }
+
+-void ath11k_debugfs_remove_interface(struct ath11k_vif *arvif)
+-{
+- if (!arvif->debugfs_twt)
+- return;
+-
+- debugfs_remove_recursive(arvif->debugfs_twt);
+- arvif->debugfs_twt = NULL;
+-}
+diff --git a/drivers/net/wireless/ath/ath11k/debugfs.h b/drivers/net/wireless/ath/ath11k/debugfs.h
+index 3af0169f6cf2..b0bdd5e5f82b 100644
+--- a/drivers/net/wireless/ath/ath11k/debugfs.h
++++ b/drivers/net/wireless/ath/ath11k/debugfs.h
+@@ -306,8 +306,8 @@ static inline int ath11k_debugfs_rx_filter(struct ath11k *ar)
+ return ar->debug.rx_filter;
+ }
+
+-void ath11k_debugfs_add_interface(struct ath11k_vif *arvif);
+-void ath11k_debugfs_remove_interface(struct ath11k_vif *arvif);
++void ath11k_debugfs_op_add_interface(struct ieee80211_hw *hw,
++ struct ieee80211_vif *vif);
+ void ath11k_debugfs_add_dbring_entry(struct ath11k *ar,
+ enum wmi_direct_buffer_module id,
+ enum ath11k_dbg_dbr_event event,
+@@ -386,14 +386,6 @@ static inline int ath11k_debugfs_get_fw_stats(struct ath11k *ar,
+ 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
+ ath11k_debugfs_add_dbring_entry(struct ath11k *ar,
+ enum wmi_direct_buffer_module id,
+diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
+index 7f7b39817773..6acf11fafb22 100644
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -6750,13 +6750,6 @@ static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
+ 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));
+
+ arvif->ar = ar;
+@@ -6933,8 +6926,6 @@ static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
+
+ ath11k_dp_vdev_tx_attach(ar, arvif);
+
+- ath11k_debugfs_add_interface(arvif);
+-
+ if (vif->type != NL80211_IFTYPE_MONITOR &&
+ test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
+ ret = ath11k_mac_monitor_vdev_create(ar);
+@@ -7050,8 +7041,6 @@ static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
+ /* Recalc txpower for remaining vdev */
+ ath11k_mac_txpower_recalc(ar);
+
+- ath11k_debugfs_remove_interface(arvif);
+-
+ /* TODO: recal traffic pause state based on the available vdevs */
+
+ mutex_unlock(&ar->conf_mutex);
+@@ -9149,6 +9138,7 @@ static const struct ieee80211_ops ath11k_ops = {
+ #endif
+
+ #ifdef CONFIG_ATH11K_DEBUGFS
++ .vif_add_debugfs = ath11k_debugfs_op_add_interface,
+ .sta_add_debugfs = ath11k_debugfs_sta_op_add,
+ #endif
+
+--
+2.43.0
+