Commit 4f6dd923 authored by Venkateswara Naralasetty's avatar Venkateswara Naralasetty Committed by Kalle Valo

ath11k: fix radar detection in 160 Mhz

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: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
Signed-off-by: default avatarVenkateswara Naralasetty <quic_vnaralas@quicinc.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/1644416019-820-2-git-send-email-quic_vnaralas@quicinc.com
parent 5ed98fb7
...@@ -6630,12 +6630,13 @@ static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw, ...@@ -6630,12 +6630,13 @@ static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
static int static int
ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif, ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
const struct cfg80211_chan_def *chandef, struct ieee80211_chanctx_conf *ctx,
bool restart) bool restart)
{ {
struct ath11k *ar = arvif->ar; struct ath11k *ar = arvif->ar;
struct ath11k_base *ab = ar->ab; struct ath11k_base *ab = ar->ab;
struct wmi_vdev_start_req_arg arg = {}; 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 he_support = arvif->vif->bss_conf.he_support;
int ret = 0; int ret = 0;
...@@ -6670,8 +6671,7 @@ ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif, ...@@ -6670,8 +6671,7 @@ ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
arg.channel.chan_radar = arg.channel.chan_radar =
!!(chandef->chan->flags & IEEE80211_CHAN_RADAR); !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
arg.channel.freq2_radar = arg.channel.freq2_radar = ctx->radar_enabled;
!!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
arg.channel.passive = arg.channel.chan_radar; arg.channel.passive = arg.channel.chan_radar;
...@@ -6781,15 +6781,15 @@ static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif) ...@@ -6781,15 +6781,15 @@ static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
} }
static int ath11k_mac_vdev_start(struct ath11k_vif *arvif, static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
const struct cfg80211_chan_def *chandef) struct ieee80211_chanctx_conf *ctx)
{ {
return ath11k_mac_vdev_start_restart(arvif, chandef, false); return ath11k_mac_vdev_start_restart(arvif, ctx, false);
} }
static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif, static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
const struct cfg80211_chan_def *chandef) struct ieee80211_chanctx_conf *ctx)
{ {
return ath11k_mac_vdev_start_restart(arvif, chandef, true); return ath11k_mac_vdev_start_restart(arvif, ctx, true);
} }
struct ath11k_mac_change_chanctx_arg { struct ath11k_mac_change_chanctx_arg {
...@@ -6864,7 +6864,7 @@ ath11k_mac_update_vif_chan(struct ath11k *ar, ...@@ -6864,7 +6864,7 @@ ath11k_mac_update_vif_chan(struct ath11k *ar,
* If vdev is down then it expect vdev_stop->vdev_start. * If vdev is down then it expect vdev_stop->vdev_start.
*/ */
if (arvif->is_up) { if (arvif->is_up) {
ret = ath11k_mac_vdev_restart(arvif, &vifs[i].new_ctx->def); ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
if (ret) { if (ret) {
ath11k_warn(ab, "failed to restart vdev %d: %d\n", ath11k_warn(ab, "failed to restart vdev %d: %d\n",
arvif->vdev_id, ret); arvif->vdev_id, ret);
...@@ -6878,7 +6878,7 @@ ath11k_mac_update_vif_chan(struct ath11k *ar, ...@@ -6878,7 +6878,7 @@ ath11k_mac_update_vif_chan(struct ath11k *ar,
continue; continue;
} }
ret = ath11k_mac_vdev_start(arvif, &vifs[i].new_ctx->def); ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
if (ret) if (ret)
ath11k_warn(ab, "failed to start vdev %d: %d\n", ath11k_warn(ab, "failed to start vdev %d: %d\n",
arvif->vdev_id, ret); arvif->vdev_id, ret);
...@@ -6967,7 +6967,8 @@ static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw, ...@@ -6967,7 +6967,8 @@ static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL)) if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
goto unlock; goto unlock;
if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
changed & IEEE80211_CHANCTX_CHANGE_RADAR)
ath11k_mac_update_active_vif_chan(ar, ctx); ath11k_mac_update_active_vif_chan(ar, ctx);
/* TODO: Recalc radar detection */ /* TODO: Recalc radar detection */
...@@ -6987,7 +6988,7 @@ static int ath11k_start_vdev_delay(struct ieee80211_hw *hw, ...@@ -6987,7 +6988,7 @@ static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
if (WARN_ON(arvif->is_started)) if (WARN_ON(arvif->is_started))
return -EBUSY; return -EBUSY;
ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx.def); ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
if (ret) { if (ret) {
ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
arvif->vdev_id, vif->addr, arvif->vdev_id, vif->addr,
...@@ -7081,7 +7082,7 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -7081,7 +7082,7 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
goto out; goto out;
} }
ret = ath11k_mac_vdev_start(arvif, &ctx->def); ret = ath11k_mac_vdev_start(arvif, ctx);
if (ret) { if (ret) {
ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n", ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
arvif->vdev_id, vif->addr, arvif->vdev_id, vif->addr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment