wifi: ath12k: fix radar detection in 160 MHz
authorManish Dharanenthiran <quic_mdharane@quicinc.com>
Tue, 5 Sep 2023 13:29:41 +0000 (16:29 +0300)
committerKalle Valo <quic_kvalo@quicinc.com>
Wed, 20 Sep 2023 13:14:41 +0000 (16:14 +0300)
Radar detection fails in the secondary 80 MHz when the
the AP's primary 80 MHz is in non-DFS region in 160 MHz.

This is due to WMI channel flag WMI_CHAN_INFO_DFS_FREQ2 is not set
properly in case of the primary 80 MHz is in non-DFS region.
HALPHY detects the radar pulses in the secondary 80 MHz only when
WMI_CHAN_INFO_DFS_FREQ2 is set.

Fix this issue by setting WMI channel flag WMI_CHAN_INFO_DFS_FREQ2
based on the radar_enabled flag from the channel context.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Signed-off-by: Manish Dharanenthiran <quic_mdharane@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230802085852.19821-3-quic_mdharane@quicinc.com
drivers/net/wireless/ath/ath12k/mac.c

index 092081d69626c6ff9d7752c928d1d4c8a7a8336f..85602d64b607e80ffce3e7ffbbc092f4b1072e41 100644 (file)
@@ -5790,12 +5790,13 @@ static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
 
 static int
 ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
-                             const struct cfg80211_chan_def *chandef,
+                             struct ieee80211_chanctx_conf *ctx,
                              bool restart)
 {
        struct ath12k *ar = arvif->ar;
        struct ath12k_base *ab = ar->ab;
        struct wmi_vdev_start_req_arg arg = {};
+       const struct cfg80211_chan_def *chandef = &ctx->def;
        int he_support = arvif->vif->bss_conf.he_support;
        int ret;
 
@@ -5829,6 +5830,8 @@ ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
                /* For now allow DFS for AP mode */
                arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
 
+               arg.freq2_radar = ctx->radar_enabled;
+
                arg.passive = arg.chan_radar;
 
                spin_lock_bh(&ab->base_lock);
@@ -5936,15 +5939,15 @@ err:
 }
 
 static int ath12k_mac_vdev_start(struct ath12k_vif *arvif,
-                                const struct cfg80211_chan_def *chandef)
+                                struct ieee80211_chanctx_conf *ctx)
 {
-       return ath12k_mac_vdev_start_restart(arvif, chandef, false);
+       return ath12k_mac_vdev_start_restart(arvif, ctx, false);
 }
 
 static int ath12k_mac_vdev_restart(struct ath12k_vif *arvif,
-                                  const struct cfg80211_chan_def *chandef)
+                                  struct ieee80211_chanctx_conf *ctx)
 {
-       return ath12k_mac_vdev_start_restart(arvif, chandef, true);
+       return ath12k_mac_vdev_start_restart(arvif, ctx, true);
 }
 
 struct ath12k_mac_change_chanctx_arg {
@@ -6043,7 +6046,7 @@ ath12k_mac_update_vif_chan(struct ath12k *ar,
                 * If vdev is down then it expect vdev_stop->vdev_start.
                 */
                if (arvif->is_up) {
-                       ret = ath12k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def);
+                       ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
                        if (ret) {
                                ath12k_warn(ab, "failed to restart vdev %d: %d\n",
                                            arvif->vdev_id, ret);
@@ -6057,7 +6060,7 @@ ath12k_mac_update_vif_chan(struct ath12k *ar,
                                continue;
                        }
 
-                       ret = ath12k_mac_vdev_start(arvif, &vifs[i].new_ctx->def);
+                       ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
                        if (ret)
                                ath12k_warn(ab, "failed to start vdev %d: %d\n",
                                            arvif->vdev_id, ret);
@@ -6133,7 +6136,8 @@ static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
        if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
                goto unlock;
 
-       if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH)
+       if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
+           changed & IEEE80211_CHANCTX_CHANGE_RADAR)
                ath12k_mac_update_active_vif_chan(ar, ctx);
 
        /* TODO: Recalc radar detection */
@@ -6153,7 +6157,7 @@ static int ath12k_start_vdev_delay(struct ieee80211_hw *hw,
        if (WARN_ON(arvif->is_started))
                return -EBUSY;
 
-       ret = ath12k_mac_vdev_start(arvif, &arvif->chanctx.def);
+       ret = ath12k_mac_vdev_start(arvif, &arvif->chanctx);
        if (ret) {
                ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
                            arvif->vdev_id, vif->addr,
@@ -6233,7 +6237,7 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
                goto out;
        }
 
-       ret = ath12k_mac_vdev_start(arvif, &ctx->def);
+       ret = ath12k_mac_vdev_start(arvif, ctx);
        if (ret) {
                ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
                            arvif->vdev_id, vif->addr,