mac80211: ath11k: sync with ath-next
[openwrt/staging/wigyori.git] / package / kernel / mac80211 / patches / ath11k / 0025-wifi-ath11k-fix-CAC-running-state-during-virtual-int.patch
diff --git a/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-fix-CAC-running-state-during-virtual-int.patch b/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-fix-CAC-running-state-during-virtual-int.patch
new file mode 100644 (file)
index 0000000..eee0bf0
--- /dev/null
@@ -0,0 +1,80 @@
+From 69fcb525905600a151997cd16367bb92c34a2b14 Mon Sep 17 00:00:00 2001
+From: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Date: Tue, 3 Oct 2023 17:26:54 +0300
+Subject: [PATCH] wifi: ath11k: fix CAC running state during virtual interface
+ start
+
+Currently channel definition's primary channel's DFS CAC time
+as well as primary channel's state i.e usable are used to set
+the CAC_RUNNING flag for the ath11k radio structure. However,
+this is wrong since certain channel definition are possbile
+where primary channel may not be a DFS channel but, secondary
+channel is a DFS channel. For example - channel 36 with 160 MHz
+bandwidth.
+In such cases, the flag will not be set which is wrong.
+
+Fix this issue by using cfg80211_chandef_dfs_usable() function
+from cfg80211 which return trues if at least one channel is in
+usable state.
+
+While at it, modify the CAC running debug log message to print
+the CAC time as well in milli-seconds.
+
+Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://lore.kernel.org/r/20230912051857.2284-3-quic_adisi@quicinc.com
+---
+ drivers/net/wireless/ath/ath11k/mac.c | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -5,6 +5,7 @@
+  */
+ #include <net/mac80211.h>
++#include <net/cfg80211.h>
+ #include <linux/etherdevice.h>
+ #include <linux/bitfield.h>
+ #include <linux/inetdevice.h>
+@@ -7196,6 +7197,7 @@ ath11k_mac_vdev_start_restart(struct ath
+       struct wmi_vdev_start_req_arg arg = {};
+       const struct cfg80211_chan_def *chandef = &ctx->def;
+       int ret = 0;
++      unsigned int dfs_cac_time;
+       lockdep_assert_held(&ar->conf_mutex);
+@@ -7275,20 +7277,21 @@ ath11k_mac_vdev_start_restart(struct ath
+       ath11k_dbg(ab, ATH11K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
+                  arvif->vif->addr, arvif->vdev_id);
+-      /* Enable CAC Flag in the driver by checking the channel DFS cac time,
+-       * i.e dfs_cac_ms value which will be valid only for radar channels
+-       * and state as NL80211_DFS_USABLE which indicates CAC needs to be
++      /* Enable CAC Flag in the driver by checking the all sub-channel's DFS
++       * state as NL80211_DFS_USABLE which indicates CAC needs to be
+        * done before channel usage. This flags is used to drop rx packets.
+        * during CAC.
+        */
+       /* TODO Set the flag for other interface types as required */
+-      if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
+-          chandef->chan->dfs_cac_ms &&
+-          chandef->chan->dfs_state == NL80211_DFS_USABLE) {
++      if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
++          cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) {
+               set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
++              dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy,
++                                                           chandef);
+               ath11k_dbg(ab, ATH11K_DBG_MAC,
+-                         "CAC Started in chan_freq %d for vdev %d\n",
+-                         arg.channel.freq, arg.vdev_id);
++                         "cac started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
++                         dfs_cac_time, arg.channel.freq, chandef->center_freq1,
++                         arg.vdev_id);
+       }
+       ret = ath11k_mac_set_txbf_conf(arvif);