qcacmn: Add CDP api to set rx_pkt_enable,tx_pkt_enable for a peer

Since tx_monitor mode and rx_monitor mode consume signficant MIPS
when enabled on a per-peer basis, new requirement is to enable such
functionality on a per-peer basis. New CDP APIs are added to set these
per-peer parameters.

CRs-Fixed: 2494471
Change-Id: Ib44845ec98481cc4df36c30f47335522e5274568
diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h
index dde806e..c9e6754 100644
--- a/dp/inc/cdp_txrx_cmn_struct.h
+++ b/dp/inc/cdp_txrx_cmn_struct.h
@@ -910,6 +910,18 @@
 	CDP_RX_ENH_CAPTURE_MPDU_MSDU,
 };
 
+/**
+ * cdp_tx_enh_capture_mode - Tx enhanced capture modes
+ * @CDP_TX_ENH_CAPTURE_DISABLED: Disable Tx enhance capture for all peers
+ * @CDP_TX_ENH_CAPTURE_ENABLE_ALL_PEERS: Enable tx capture for all peers
+ * @CDP_TX_ENH_CAPTURE_ENDIS_PER_PEER: Enable/disable per peer as necessary
+ */
+enum cdp_tx_enh_capture_mode {
+	CDP_TX_ENH_CAPTURE_DISABLED = 0,
+	CDP_TX_ENH_CAPTURE_ENABLE_ALL_PEERS,
+	CDP_TX_ENH_CAPTURE_ENDIS_PER_PEER,
+};
+
 /*
  * enum cdp_pdev_bpr_param - different types of parameters
  *			     to set value in pdev
diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h
index 347c70a..141f4b4 100644
--- a/dp/inc/cdp_txrx_ctrl.h
+++ b/dp/inc/cdp_txrx_ctrl.h
@@ -723,6 +723,40 @@
 	return soc->ops->ctrl_ops->txrx_get_pldev(pdev);
 }
 
+#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH)
+/**
+ * cdp_update_peer_pkt_capture_params() - Sets Rx & Tx Capture params for a peer
+ * @soc: SOC TXRX handle
+ * @pdev: CDP pdev pointer
+ * @is_rx_pkt_cap_enable: enable/disable rx pkt capture for this peer
+ * @is_tx_pkt_cap_enable: enable/disable tx pkt capture for this peer
+ * @peer_mac: MAC address of peer for which pkt_cap is to be enabled/disabled
+ *
+ * Return: Success when matching peer is found & flags are set, error otherwise
+ */
+static inline QDF_STATUS
+cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc,
+				   struct cdp_pdev *pdev,
+				   bool is_rx_pkt_cap_enable,
+				   bool is_tx_pkt_cap_enable,
+				   uint8_t *peer_mac)
+{
+	if (!soc || !soc->ops) {
+		dp_err("Invalid SOC instance");
+		QDF_BUG(0);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!soc->ops->ctrl_ops ||
+	    !soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params)
+		return QDF_STATUS_E_FAILURE;
+
+	return soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params
+			(pdev, is_rx_pkt_cap_enable, is_tx_pkt_cap_enable,
+			 peer_mac);
+}
+#endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */
+
 #ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
 /**
  * cdp_update_pdev_rx_protocol_tag() - wrapper function to set the protocol
diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h
index f625c62..e96403e 100644
--- a/dp/inc/cdp_txrx_ops.h
+++ b/dp/inc/cdp_txrx_ops.h
@@ -683,6 +683,12 @@
 				      struct cdp_vdev *vdev, uint8_t *peer_mac,
 				      uint16_t vlan_id);
 #endif
+#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH)
+	QDF_STATUS (*txrx_update_peer_pkt_capture_params)(
+			struct cdp_pdev *txrx_pdev_handle,
+			bool is_rx_pkt_cap_enable, bool is_tx_pkt_cap_enable,
+			uint8_t *peer_mac);
+#endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */
 };
 
 struct cdp_me_ops {
diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c
index 3d02ed9..376f866 100644
--- a/dp/wifi3.0/dp_main.c
+++ b/dp/wifi3.0/dp_main.c
@@ -125,7 +125,7 @@
  * Return: QDF_STATUS
  */
 static QDF_STATUS
-dp_config_enh_tx_capture(struct cdp_pdev *pdev_handle, int val)
+dp_config_enh_tx_capture(struct cdp_pdev *pdev_handle, uint8_t val)
 {
 	return QDF_STATUS_E_INVAL;
 }
@@ -1087,12 +1087,16 @@
 			       " nawds_enabled = %d"
 			       " bss_peer = %d"
 			       " wds_enabled = %d"
+			       " tx_cap_enabled = %d"
+			       " rx_cap_enabled = %d"
 			       " delete in progress = %d"
 			       " peer id = %d",
 			       peer->mac_addr.raw,
 			       peer->nawds_enabled,
 			       peer->bss_peer,
 			       peer->wds_enabled,
+			       peer->tx_cap_enabled,
+			       peer->rx_cap_enabled,
 			       peer->delete_in_progress,
 			       peer->peer_ids[0]);
 	}
@@ -7756,6 +7760,69 @@
 	peer->nawds_enabled = value;
 }
 
+/**
+ * dp_peer_set_tx_capture_enabled: Set tx_cap_enabled bit in peer
+ * @peer_handle: Peer handle
+ * @value: Enable/disable setting for tx_cap_enabled
+ *
+ * Return: None
+ */
+static void
+dp_peer_set_tx_capture_enabled(struct cdp_peer *peer_handle, bool value)
+{
+	struct dp_peer *peer = (struct dp_peer *)peer_handle;
+
+	peer->tx_cap_enabled = value;
+}
+
+/**
+ * dp_peer_set_rx_capture_enabled: Set rx_cap_enabled bit in peer
+ * @peer_handle: Peer handle
+ * @value: Enable/disable setting for rx_cap_enabled
+ *
+ * Return: None
+ */
+static void
+dp_peer_set_rx_capture_enabled(struct cdp_peer *peer_handle, bool value)
+{
+	struct dp_peer *peer = (struct dp_peer *)peer_handle;
+
+	peer->rx_cap_enabled = value;
+}
+
+/**
+ * dp_peer_update_pkt_capture_params: Set Rx & Tx Capture flags for a peer
+ * @is_rx_pkt_cap_enable: enable/disable Rx packet capture in monitor mode
+ * @is_tx_pkt_cap_enable: enable/disable Tx packet capture in monitor mode
+ * @peer_mac: MAC address for which the above need to be enabled/disabled
+ *
+ * Return: Success if Rx & Tx capture is enabled for peer, false otherwise
+ */
+QDF_STATUS
+dp_peer_update_pkt_capture_params(struct cdp_pdev *pdev,
+				  bool is_rx_pkt_cap_enable,
+				  bool is_tx_pkt_cap_enable,
+				  uint8_t *peer_mac)
+
+{
+	struct dp_peer *peer;
+	uint8_t local_id;
+
+	peer = (struct dp_peer *)dp_find_peer_by_addr(pdev,
+			peer_mac, &local_id);
+
+	if (!peer) {
+		dp_err("Invalid Peer");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	dp_peer_set_rx_capture_enabled((struct cdp_peer *)peer,
+				       is_rx_pkt_cap_enable);
+	dp_peer_set_tx_capture_enabled((struct cdp_peer *)peer,
+				       is_tx_pkt_cap_enable);
+	return QDF_STATUS_SUCCESS;
+}
+
 /*
  * dp_set_vdev_dscp_tid_map_wifi3(): Update Map ID selected for particular vdev
  * @vdev_handle: DP_VDEV handle
@@ -9258,6 +9325,10 @@
 #ifdef QCA_MULTIPASS_SUPPORT
 	.txrx_peer_set_vlan_id = dp_peer_set_vlan_id,
 #endif /*QCA_MULTIPASS_SUPPORT*/
+#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH)
+	.txrx_update_peer_pkt_capture_params =
+		 dp_peer_update_pkt_capture_params,
+#endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */
 };
 
 static struct cdp_me_ops dp_ops_me = {
diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h
index 0ab8c9e..7a2f08f 100644
--- a/dp/wifi3.0/dp_peer.h
+++ b/dp/wifi3.0/dp_peer.h
@@ -274,4 +274,17 @@
 void dp_peer_multipass_list_remove(struct dp_peer *peer);
 #endif
 
+/**
+ * dp_peer_update_pkt_capture_params: Set Rx & Tx Capture flags for a peer
+ * @is_rx_pkt_cap_enable: enable/disable Rx packet capture in monitor mode
+ * @is_tx_pkt_cap_enable: enable/disable Tx packet capture in monitor mode
+ * @peer_mac: MAC address for which the above need to be enabled/disabled
+ *
+ * Return: Success if Rx & Tx capture is enabled for peer, false otherwise
+ */
+QDF_STATUS
+dp_peer_update_pkt_capture_params(struct cdp_pdev *pdev,
+				  bool is_rx_pkt_cap_enable,
+				  bool is_tx_pkt_cap_enable,
+				  uint8_t *peer_mac);
 #endif /* _DP_PEER_H_ */
diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h
index bdbe985..d40dea4 100644
--- a/dp/wifi3.0/dp_types.h
+++ b/dp/wifi3.0/dp_types.h
@@ -1658,7 +1658,7 @@
 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
 
 	/* tx packet capture enhancement */
-	bool tx_capture_enabled;
+	enum cdp_tx_enh_capture_mode tx_capture_enabled;
 	struct dp_pdev_tx_capture tx_capture;
 	/* stats counter for tx ppdu processed */
 	uint64_t tx_ppdu_proc;
@@ -1944,6 +1944,8 @@
 		wds_enabled:1, /* WDS peer */
 		authorize:1, /* Set when authorized */
 		nac:1, /* NAC Peer*/
+		tx_cap_enabled:1, /* Peer's tx-capture is enabled */
+		rx_cap_enabled:1, /* Peer's rx-capture is enabled */
 		valid:1; /* valid bit */
 
 	/* MCL specific peer local id */