Message ID | 20250127114030.43479-8-quic_periyasa@quicinc.com |
---|---|
State | New |
Headers | show |
Series | wifi: ath12k: Add monitor interface support on QCN9274 | expand |
On 1/27/2025 5:10 PM, Karthikeyan Periyasamy wrote: > From: P Praneesh <quic_ppranees@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 WANT_MONITOR_VIF 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@quicinc.com> > Signed-off-by: Karthikeyan Periyasamy <quic_periyasa@quicinc.com> > Tested-by: Nicolas Escande <nico.escande@gmail.com> > --- > drivers/net/wireless/ath/ath12k/core.c | 5 +++++ > drivers/net/wireless/ath/ath12k/dp_tx.c | 8 +++++++- > drivers/net/wireless/ath/ath12k/hw.c | 4 ++-- > drivers/net/wireless/ath/ath12k/mac.c | 22 +++++++++++++++++++++- > 4 files changed, 35 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c > index 2dd0666959cd..ec2c2b23bc1c 100644 > --- a/drivers/net/wireless/ath/ath12k/core.c > +++ b/drivers/net/wireless/ath/ath12k/core.c > @@ -1272,6 +1272,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 aa8058dd2da6..63b048626128 100644 > --- a/drivers/net/wireless/ath/ath12k/dp_tx.c > +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c > @@ -1,12 +1,13 @@ > // 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 "core.h" > #include "dp_tx.h" > #include "debug.h" > +#include "debugfs.h" > #include "hw.h" > #include "peer.h" > #include "mac.h" > @@ -1409,6 +1410,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 a00dc02adb5d..59cb22a8e8d1 100644 > --- a/drivers/net/wireless/ath/ath12k/mac.c > +++ b/drivers/net/wireless/ath/ath12k/mac.c > @@ -1356,9 +1356,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; > @@ -7269,6 +7275,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; > @@ -8130,6 +8141,9 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif) > } > > err_vdev_del: > + if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) > + ar->monitor_vdev_id = -1; > + > ath12k_wmi_vdev_delete(ar, arvif->vdev_id); > ar->num_created_vdevs--; > arvif->is_created = false; > @@ -11060,6 +11074,7 @@ static int ath12k_mac_hw_register(struct ath12k_hw *ah) > ieee80211_hw_set(hw, QUEUE_CONTROL); > ieee80211_hw_set(hw, SUPPORTS_TX_FRAG); > ieee80211_hw_set(hw, REPORTS_LOW_ACK); > + ieee80211_hw_set(hw, WANT_MONITOR_VIF); > > if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) { > ieee80211_hw_set(hw, AMPDU_AGGREGATION); > @@ -11257,6 +11272,11 @@ static void ath12k_mac_setup(struct ath12k *ar) > > wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); > skb_queue_head_init(&ar->wmi_mgmt_tx_queue); > + > + ar->monitor_vdev_id = -1; > + ar->monitor_conf_enabled = false; > + ar->monitor_vdev_created = false; > + ar->monitor_started = false; > } > > static int __ath12k_mac_mlo_setup(struct ath12k *ar) Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c index 2dd0666959cd..ec2c2b23bc1c 100644 --- a/drivers/net/wireless/ath/ath12k/core.c +++ b/drivers/net/wireless/ath/ath12k/core.c @@ -1272,6 +1272,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 aa8058dd2da6..63b048626128 100644 --- a/drivers/net/wireless/ath/ath12k/dp_tx.c +++ b/drivers/net/wireless/ath/ath12k/dp_tx.c @@ -1,12 +1,13 @@ // 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 "core.h" #include "dp_tx.h" #include "debug.h" +#include "debugfs.h" #include "hw.h" #include "peer.h" #include "mac.h" @@ -1409,6 +1410,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 a00dc02adb5d..59cb22a8e8d1 100644 --- a/drivers/net/wireless/ath/ath12k/mac.c +++ b/drivers/net/wireless/ath/ath12k/mac.c @@ -1356,9 +1356,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; @@ -7269,6 +7275,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; @@ -8130,6 +8141,9 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif) } err_vdev_del: + if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) + ar->monitor_vdev_id = -1; + ath12k_wmi_vdev_delete(ar, arvif->vdev_id); ar->num_created_vdevs--; arvif->is_created = false; @@ -11060,6 +11074,7 @@ static int ath12k_mac_hw_register(struct ath12k_hw *ah) ieee80211_hw_set(hw, QUEUE_CONTROL); ieee80211_hw_set(hw, SUPPORTS_TX_FRAG); ieee80211_hw_set(hw, REPORTS_LOW_ACK); + ieee80211_hw_set(hw, WANT_MONITOR_VIF); if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) { ieee80211_hw_set(hw, AMPDU_AGGREGATION); @@ -11257,6 +11272,11 @@ static void ath12k_mac_setup(struct ath12k *ar) wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work); skb_queue_head_init(&ar->wmi_mgmt_tx_queue); + + ar->monitor_vdev_id = -1; + ar->monitor_conf_enabled = false; + ar->monitor_vdev_created = false; + ar->monitor_started = false; } static int __ath12k_mac_mlo_setup(struct ath12k *ar)