Message ID | 20250222033002.3886215-10-quic_periyasa@quicinc.com |
---|---|
State | Superseded |
Headers | show |
Series | wifi: ath12k: Add monitor interface support on QCN9274 | expand |
On 2/22/2025 9:00 AM, 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 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@quicinc.com> > Signed-off-by: Karthikeyan Periyasamy <quic_periyasa@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
On 2/22/2025 7:44 PM, Vasanthakumar Thiagarajan wrote: > > > On 2/22/2025 9:00 AM, 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 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@quicinc.com> >> Signed-off-by: Karthikeyan Periyasamy <quic_periyasa@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? > sure, will address this comment in the next version of the patch.
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; + /* If no link is active and scan vdev is requested * use a default link conf for scan address purpose. */ @@ -8238,6 +8252,9 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif) goto err_peer_del; } break; + case WMI_VDEV_TYPE_MONITOR: + ar->monitor_vdev_created = true; + break; default: break; } @@ -8283,6 +8300,11 @@ 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; + ar->monitor_vdev_created = false; + } + ath12k_wmi_vdev_delete(ar, arvif->vdev_id); ar->num_created_vdevs--; arvif->is_created = false; @@ -11208,6 +11230,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, NO_VIRTUAL_MONITOR); if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) { ieee80211_hw_set(hw, AMPDU_AGGREGATION); @@ -11407,6 +11430,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)