[PATCH v7 9/9] wifi: ath12k: add monitor interface support on QCN9274
Vasanthakumar Thiagarajan
vasanthakumar.thiagarajan at oss.qualcomm.com
Sat Feb 22 06:14:05 PST 2025
On 2/22/2025 9:00 AM, Karthikeyan Periyasamy wrote:
> From: P Praneesh <quic_ppranees at quicinc.com>
>
> Currently, the monitor interface is not supported. To support the monitor
> interface, configure the monitor vdev state identifier, configure the HTT
> filter setup, subscribe the mac80211 NO_VIRTUAL_MONITOR feature and
> prevent monitor interface to transmit packet. Therefore, add these
> procedures to add monitor interface support and enable the monitor
> interface support on the QCN9274 platform through the hardware parameter.
>
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
> Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
>
> Signed-off-by: P Praneesh <quic_ppranees at quicinc.com>
> Signed-off-by: Karthikeyan Periyasamy <quic_periyasa at quicinc.com>
> ---
> drivers/net/wireless/ath/ath12k/core.c | 5 +++++
> drivers/net/wireless/ath/ath12k/dp_tx.c | 6 +++++
> drivers/net/wireless/ath/ath12k/hw.c | 4 ++--
> drivers/net/wireless/ath/ath12k/mac.c | 30 ++++++++++++++++++++++++-
> 4 files changed, 42 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c
> index 0b2dec081c6e..ed7365ce7f95 100644
> --- a/drivers/net/wireless/ath/ath12k/core.c
> +++ b/drivers/net/wireless/ath/ath12k/core.c
> @@ -1306,6 +1306,11 @@ static void ath12k_core_pre_reconfigure_recovery(struct ath12k_base *ab)
> ath12k_mac_tx_mgmt_pending_free, ar);
> idr_destroy(&ar->txmgmt_idr);
> wake_up(&ar->txmgmt_empty_waitq);
> +
> + ar->monitor_vdev_id = -1;
> + ar->monitor_conf_enabled = false;
> + ar->monitor_vdev_created = false;
> + ar->monitor_started = false;
> }
> }
>
> diff --git a/drivers/net/wireless/ath/ath12k/dp_tx.c b/drivers/net/wireless/ath/ath12k/dp_tx.c
> index 46a55554c19c..a74afa8b2236 100644
> --- a/drivers/net/wireless/ath/ath12k/dp_tx.c
> +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c
> @@ -7,6 +7,7 @@
> #include "core.h"
> #include "dp_tx.h"
> #include "debug.h"
> +#include "debugfs.h"
> #include "hw.h"
> #include "peer.h"
> #include "mac.h"
> @@ -1431,6 +1432,11 @@ int ath12k_dp_tx_htt_rx_monitor_mode_ring_config(struct ath12k *ar, bool reset)
> HTT_RX_MON_MO_CTRL_FILTER_FLASG3 |
> HTT_RX_MON_FP_DATA_FILTER_FLASG3 |
> HTT_RX_MON_MO_DATA_FILTER_FLASG3;
> + } else {
> + tlv_filter = ath12k_mac_mon_status_filter_default;
> +
> + if (ath12k_debugfs_is_extd_rx_stats_enabled(ar))
> + tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar);
> }
>
> if (ab->hw_params->rxdma1_enable) {
> diff --git a/drivers/net/wireless/ath/ath12k/hw.c b/drivers/net/wireless/ath/ath12k/hw.c
> index a106ebed7870..021a4b565e8b 100644
> --- a/drivers/net/wireless/ath/ath12k/hw.c
> +++ b/drivers/net/wireless/ath/ath12k/hw.c
> @@ -1,7 +1,7 @@
> // SPDX-License-Identifier: BSD-3-Clause-Clear
> /*
> * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
> - * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
> + * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
> */
>
> #include <linux/types.h>
> @@ -1049,7 +1049,7 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
> BIT(NL80211_IFTYPE_AP) |
> BIT(NL80211_IFTYPE_MESH_POINT) |
> BIT(NL80211_IFTYPE_AP_VLAN),
> - .supports_monitor = false,
> + .supports_monitor = true,
>
> .idle_ps = false,
> .download_calib = true,
> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
> index 54af9cbbf7cb..b90dad5cb2e0 100644
> --- a/drivers/net/wireless/ath/ath12k/mac.c
> +++ b/drivers/net/wireless/ath/ath12k/mac.c
> @@ -1349,9 +1349,15 @@ static int ath12k_mac_monitor_start(struct ath12k *ar)
> return ret;
> }
>
> + ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
> + if (ret) {
> + ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret);
> + return ret;
> + }
> +
> ar->monitor_started = true;
> ar->num_started_vdevs++;
> - ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
> +
> ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started ret %d\n", ret);
>
> return ret;
> @@ -7334,6 +7340,11 @@ static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
> u8 link_id;
> int ret;
>
> + if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
> + ieee80211_free_txskb(hw, skb);
> + return;
> + }
> +
> link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
> memset(skb_cb, 0, sizeof(*skb_cb));
> skb_cb->vif = vif;
> @@ -8083,6 +8094,9 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
>
> lockdep_assert_wiphy(hw->wiphy);
>
> + if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created)
> + return -EINVAL;
> +
Some comment on the scenario that is being handled here might be helpful?
Vasanth
More information about the ath12k
mailing list