mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-07-05 22:07:06 +08:00
190 lines
6.0 KiB
Diff
190 lines
6.0 KiB
Diff
From 5c1f74d24d92ce62264508df4c8acabb3127cd83 Mon Sep 17 00:00:00 2001
|
|
From: Anilkumar Kolli <akolli@codeaurora.org>
|
|
Date: Wed, 8 Dec 2021 10:44:00 +0200
|
|
Subject: [PATCH] ath11k: Add htt cmd to enable full monitor mode
|
|
|
|
A new hw_param full_monitor_mode is added to enable full
|
|
monitor support for QCN9074.
|
|
HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to FW
|
|
to enable the full monitor mode.
|
|
|
|
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1
|
|
|
|
Signed-off-by: Anilkumar Kolli <akolli@codeaurora.org>
|
|
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
|
Link: https://lore.kernel.org/r/1638881695-22155-2-git-send-email-akolli@codeaurora.org
|
|
---
|
|
drivers/net/wireless/ath/ath11k/core.c | 5 +++
|
|
drivers/net/wireless/ath/ath11k/dp.h | 28 +++++++++++++++
|
|
drivers/net/wireless/ath/ath11k/dp_tx.c | 48 +++++++++++++++++++++++++
|
|
drivers/net/wireless/ath/ath11k/dp_tx.h | 2 ++
|
|
drivers/net/wireless/ath/ath11k/hw.h | 1 +
|
|
5 files changed, 84 insertions(+)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/core.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
|
@@ -74,6 +74,7 @@ static const struct ath11k_hw_params ath
|
|
BIT(NL80211_IFTYPE_AP) |
|
|
BIT(NL80211_IFTYPE_MESH_POINT),
|
|
.supports_monitor = true,
|
|
+ .full_monitor_mode = false,
|
|
.supports_shadow_regs = false,
|
|
.idle_ps = false,
|
|
.supports_sta_ps = false,
|
|
@@ -128,6 +129,7 @@ static const struct ath11k_hw_params ath
|
|
BIT(NL80211_IFTYPE_AP) |
|
|
BIT(NL80211_IFTYPE_MESH_POINT),
|
|
.supports_monitor = true,
|
|
+ .full_monitor_mode = false,
|
|
.supports_shadow_regs = false,
|
|
.idle_ps = false,
|
|
.supports_sta_ps = false,
|
|
@@ -181,6 +183,7 @@ static const struct ath11k_hw_params ath
|
|
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
|
BIT(NL80211_IFTYPE_AP),
|
|
.supports_monitor = false,
|
|
+ .full_monitor_mode = false,
|
|
.supports_shadow_regs = true,
|
|
.idle_ps = true,
|
|
.supports_sta_ps = true,
|
|
@@ -234,6 +237,7 @@ static const struct ath11k_hw_params ath
|
|
BIT(NL80211_IFTYPE_AP) |
|
|
BIT(NL80211_IFTYPE_MESH_POINT),
|
|
.supports_monitor = true,
|
|
+ .full_monitor_mode = true,
|
|
.supports_shadow_regs = false,
|
|
.idle_ps = false,
|
|
.supports_sta_ps = false,
|
|
@@ -287,6 +291,7 @@ static const struct ath11k_hw_params ath
|
|
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
|
BIT(NL80211_IFTYPE_AP),
|
|
.supports_monitor = false,
|
|
+ .full_monitor_mode = false,
|
|
.supports_shadow_regs = true,
|
|
.idle_ps = true,
|
|
.supports_sta_ps = true,
|
|
--- a/drivers/net/wireless/ath/ath11k/dp.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/dp.h
|
|
@@ -292,6 +292,7 @@ enum htt_h2t_msg_type {
|
|
HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG = 0xc,
|
|
HTT_H2T_MSG_TYPE_EXT_STATS_CFG = 0x10,
|
|
HTT_H2T_MSG_TYPE_PPDU_STATS_CFG = 0x11,
|
|
+ HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE = 0x17,
|
|
};
|
|
|
|
#define HTT_VER_REQ_INFO_MSG_ID GENMASK(7, 0)
|
|
@@ -957,6 +958,33 @@ struct htt_rx_ring_tlv_filter {
|
|
u32 pkt_filter_flags3; /* DATA */
|
|
};
|
|
|
|
+#define HTT_RX_FULL_MON_MODE_CFG_CMD_INFO0_MSG_TYPE GENMASK(7, 0)
|
|
+#define HTT_RX_FULL_MON_MODE_CFG_CMD_INFO0_PDEV_ID GENMASK(15, 8)
|
|
+
|
|
+#define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_ENABLE BIT(0)
|
|
+#define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_ZERO_MPDUS_END BIT(1)
|
|
+#define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_NON_ZERO_MPDUS_END BIT(2)
|
|
+#define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_RELEASE_RING GENMASK(10, 3)
|
|
+
|
|
+/**
|
|
+ * Enumeration for full monitor mode destination ring select
|
|
+ * 0 - REO destination ring select
|
|
+ * 1 - FW destination ring select
|
|
+ * 2 - SW destination ring select
|
|
+ * 3 - Release destination ring select
|
|
+ */
|
|
+enum htt_rx_full_mon_release_ring {
|
|
+ HTT_RX_MON_RING_REO,
|
|
+ HTT_RX_MON_RING_FW,
|
|
+ HTT_RX_MON_RING_SW,
|
|
+ HTT_RX_MON_RING_RELEASE,
|
|
+};
|
|
+
|
|
+struct htt_rx_full_monitor_mode_cfg_cmd {
|
|
+ u32 info0;
|
|
+ u32 cfg;
|
|
+} __packed;
|
|
+
|
|
/* HTT message target->host */
|
|
|
|
enum htt_t2h_msg_type {
|
|
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
|
|
@@ -1033,6 +1033,15 @@ int ath11k_dp_tx_htt_monitor_mode_ring_c
|
|
struct htt_rx_ring_tlv_filter tlv_filter = {0};
|
|
int ret = 0, ring_id = 0, i;
|
|
|
|
+ if (ab->hw_params.full_monitor_mode) {
|
|
+ ret = ath11k_dp_tx_htt_rx_full_mon_setup(ab,
|
|
+ dp->mac_id, !reset);
|
|
+ if (ret < 0) {
|
|
+ ath11k_err(ab, "failed to setup full monitor %d\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+ }
|
|
+
|
|
ring_id = dp->rxdma_mon_buf_ring.refill_buf_ring.ring_id;
|
|
|
|
if (!reset) {
|
|
@@ -1098,3 +1107,42 @@ int ath11k_dp_tx_htt_monitor_mode_ring_c
|
|
|
|
return ret;
|
|
}
|
|
+
|
|
+int ath11k_dp_tx_htt_rx_full_mon_setup(struct ath11k_base *ab, int mac_id,
|
|
+ bool config)
|
|
+{
|
|
+ struct htt_rx_full_monitor_mode_cfg_cmd *cmd;
|
|
+ struct sk_buff *skb;
|
|
+ int ret, len = sizeof(*cmd);
|
|
+
|
|
+ skb = ath11k_htc_alloc_skb(ab, len);
|
|
+ if (!skb)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ skb_put(skb, len);
|
|
+ cmd = (struct htt_rx_full_monitor_mode_cfg_cmd *)skb->data;
|
|
+ memset(cmd, 0, sizeof(*cmd));
|
|
+ cmd->info0 = FIELD_PREP(HTT_RX_FULL_MON_MODE_CFG_CMD_INFO0_MSG_TYPE,
|
|
+ HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE);
|
|
+
|
|
+ cmd->info0 |= FIELD_PREP(HTT_RX_FULL_MON_MODE_CFG_CMD_INFO0_PDEV_ID, mac_id);
|
|
+
|
|
+ cmd->cfg = HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_ENABLE |
|
|
+ FIELD_PREP(HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_RELEASE_RING,
|
|
+ HTT_RX_MON_RING_SW);
|
|
+ if (config) {
|
|
+ cmd->cfg |= HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_ZERO_MPDUS_END |
|
|
+ HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_NON_ZERO_MPDUS_END;
|
|
+ }
|
|
+
|
|
+ ret = ath11k_htc_send(&ab->htc, ab->dp.eid, skb);
|
|
+ if (ret)
|
|
+ goto err_free;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+err_free:
|
|
+ dev_kfree_skb_any(skb);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
--- a/drivers/net/wireless/ath/ath11k/dp_tx.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.h
|
|
@@ -37,4 +37,6 @@ int ath11k_dp_tx_htt_rx_filter_setup(str
|
|
int rx_buf_size,
|
|
struct htt_rx_ring_tlv_filter *tlv_filter);
|
|
|
|
+int ath11k_dp_tx_htt_rx_full_mon_setup(struct ath11k_base *ab, int mac_id,
|
|
+ bool config);
|
|
#endif
|
|
--- a/drivers/net/wireless/ath/ath11k/hw.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/hw.h
|
|
@@ -168,6 +168,7 @@ struct ath11k_hw_params {
|
|
|
|
u16 interface_modes;
|
|
bool supports_monitor;
|
|
+ bool full_monitor_mode;
|
|
bool supports_shadow_regs;
|
|
bool idle_ps;
|
|
bool supports_sta_ps;
|