Просмотр исходного кода

qcacld-3.0: Add chipset stats for NAN operations

Add chipset stats for NAN operations

Change-Id: Iced9198240eed0bcddead32977b160cd8aeeedf8
CRs-Fixed: 3783059
Prasanna JS 1 год назад
Родитель
Сommit
019b2fff7f

+ 39 - 1
components/nan/core/inc/wlan_nan_api.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -27,6 +27,8 @@
 #include "wlan_objmgr_peer_obj.h"
 #include "wlan_policy_mgr_public_struct.h"
 #include "qdf_status.h"
+#include <nan_public_structs.h>
+#include <wlan_cp_stats_chipset_stats.h>
 
 #ifdef WLAN_FEATURE_NAN
 
@@ -317,4 +319,40 @@ wlan_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc)
 	return false;
 }
 #endif
+
+#if defined(WLAN_FEATURE_NAN) && defined(WLAN_CHIPSET_STATS)
+/**
+ * nan_cstats_log_nan_enable_resp_evt() - Chipset stats NAN enable
+ * response event
+ *
+ * @nan_event: pointer to nan_event_params object
+ *
+ * Return: void
+ */
+void nan_cstats_log_nan_enable_resp_evt(struct nan_event_params *nan_event);
+
+/**
+ * nan_cstats_log_nan_disable_resp_evt() - Chipset stats NAN disable
+ * response event
+ *
+ * @vdev_id: vdev ID
+ * @psoc: pointer to psoc object
+ *
+ * Return: void
+ */
+void
+nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,
+				    struct wlan_objmgr_psoc *psoc);
+#else
+static inline void
+nan_cstats_log_nan_enable_resp_evt(struct nan_event_params *nan_event)
+{
+}
+
+static inline void
+nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,
+				    struct wlan_objmgr_psoc *psoc)
+{
+}
+#endif /* WLAN_FEATURE_NAN && WLAN_CHIPSET_STATS */
 #endif /* _WLAN_NAN_API_H_ */

+ 55 - 1
components/nan/core/src/nan_api.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -487,3 +487,57 @@ bool wlan_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc)
 	return psoc_nan_obj->nan_caps.mlo_sta_nan_ndi_allowed;
 }
 #endif
+
+#if defined(WLAN_FEATURE_NAN) && defined(WLAN_CHIPSET_STATS)
+void nan_cstats_log_nan_enable_resp_evt(struct nan_event_params *nan_event)
+{
+	struct cstats_nan_disc_enable_resp stat = {0};
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(nan_event->psoc,
+						    nan_event->vdev_id,
+						    WLAN_NAN_ID);
+	if (!vdev) {
+		nan_err("Invalid vdev!");
+		return;
+	}
+
+	stat.cmn.hdr.evt_id =
+		WLAN_CHIPSET_STATS_NAN_DISCOVERY_ENABLE_RESP_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_disc_enable_resp) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+
+	stat.is_enable_success = nan_event->is_nan_enable_success;
+	stat.mac_id = nan_event->mac_id;
+	stat.disc_state = nan_get_discovery_state(nan_event->psoc);
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_disc_enable_resp),
+			       &stat);
+}
+
+void nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,
+					 struct wlan_objmgr_psoc *psoc)
+{
+	struct cstats_nan_disc_disable_resp stat = {0};
+
+	stat.cmn.hdr.evt_id =
+	   WLAN_CHIPSET_STATS_NAN_DISCOVERY_DISABLE_RESP_EVENT_ID;
+	stat.cmn.hdr.length =
+		sizeof(struct cstats_nan_disc_disable_resp) -
+		sizeof(struct cstats_hdr);
+	stat.cmn.opmode = QDF_NAN_DISC_MODE;
+	stat.cmn.vdev_id = vdev_id;
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.disc_state = nan_get_discovery_state(psoc);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_disc_disable_resp),
+			       &stat);
+}
+#endif /* WLAN_CHIPSET_STATS */

+ 4 - 1
components/nan/core/src/nan_main.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -899,6 +899,8 @@ static QDF_STATUS nan_handle_enable_rsp(struct nan_event_params *nan_event)
 		/* NAN Enable has failed, restore changes */
 		goto fail;
 	}
+
+	nan_cstats_log_nan_enable_resp_evt(nan_event);
 fail:
 	psoc_nan_obj->nan_social_ch_2g_freq = 0;
 	psoc_nan_obj->nan_social_ch_5g_freq = 0;
@@ -957,6 +959,7 @@ QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc)
 
 		nan_handle_emlsr_concurrency(psoc, false);
 		policy_mgr_nan_sap_post_disable_conc_check(psoc);
+		nan_cstats_log_nan_disable_resp_evt(vdev_id, psoc);
 	} else {
 		/* Should not happen, NAN state can always be disabled */
 		nan_err("Cannot set NAN state to disabled!");

+ 8 - 1
core/hdd/src/wlan_hdd_nan_datapath.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -46,6 +46,7 @@
 #include "wlan_fwol_ucfg_api.h"
 #include "wlan_dp_ucfg_api.h"
 #include "wlan_hdd_sysfs.h"
+#include "wlan_hdd_stats.h"
 
 /**
  * hdd_nan_datapath_target_config() - Configure NAN datapath features
@@ -848,6 +849,8 @@ int hdd_ndi_start(const char *iface_name, uint16_t transaction_id)
 		ret = -EINVAL;
 		goto err_handler;
 	}
+
+	hdd_cstats_log_ndi_create_req_evt(vdev, transaction_id);
 	/*
 	 * Create transaction id is required to be saved since the firmware
 	 * does not honor the transaction id for create request
@@ -938,7 +941,9 @@ int hdd_ndi_delete(uint8_t vdev_id, const char *iface_name,
 
 	os_if_nan_set_ndp_delete_transaction_id(vdev, transaction_id);
 	os_if_nan_set_ndi_state(vdev, NAN_DATA_NDI_DELETING_STATE);
+	hdd_cstats_log_ndi_delete_req_evt(vdev, transaction_id);
 	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_NAN_ID);
+
 	/* Delete the interface */
 	adapter->is_virtual_iface = true;
 	ret = hdd_delete_ndi_intf(hdd_ctx->wiphy, &adapter->wdev);
@@ -1039,6 +1044,8 @@ hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id,
 			ndi_rsp->reason /* create_reason */);
 	}
 
+	hdd_cstats_log_ndi_create_resp_evt(link_info, ndi_rsp);
+
 	hdd_save_peer(sta_ctx, &bc_mac_addr);
 	qdf_copy_macaddr(&roam_info->bssid, &bc_mac_addr);
 	hdd_roam_register_sta(link_info,

+ 75 - 1
core/hdd/src/wlan_hdd_stats.c

@@ -58,6 +58,7 @@
 #include <net/cnss_nl.h>
 #endif
 #endif
+#include "wlan_nan_api.h"
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)) && !defined(WITH_BACKPORTS)
 #define HDD_INFO_SIGNAL                 STATION_INFO_SIGNAL
@@ -11627,4 +11628,77 @@ void hdd_register_cstats_ops(void)
 {
 	ucfg_cp_stats_cstats_register_tx_rx_ops(&cstats_ops);
 }
-#endif
+
+void
+hdd_cstats_log_ndi_delete_req_evt(struct wlan_objmgr_vdev *vdev,
+				  uint16_t transaction_id)
+{
+	struct cstats_nan_ndi_delete_req stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDI_DELETE_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndi_delete_req) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.transaction_id = transaction_id;
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndi_delete_req), &stat);
+}
+
+void
+hdd_cstats_log_ndi_create_resp_evt(struct wlan_hdd_link_info *li,
+				   struct nan_datapath_inf_create_rsp *ndi_rsp)
+{
+	struct cstats_nan_ndi_create_resp stat = {0};
+	struct wlan_objmgr_vdev *vdev;
+	struct nan_vdev_priv_obj *priv_obj;
+
+	vdev = hdd_objmgr_get_vdev_by_user(li, WLAN_OSIF_NAN_ID);
+	if (!vdev) {
+		hdd_err("vdev is NULL");
+		return;
+	}
+
+	priv_obj = nan_get_vdev_priv_obj(vdev);
+	if (!priv_obj) {
+		hdd_err("priv_obj is null")
+		return;
+	}
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDI_CREATE_RESP_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndi_create_resp) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.status = ndi_rsp->status;
+	stat.reason = ndi_rsp->reason;
+	qdf_spin_lock_bh(&priv_obj->lock);
+	stat.transaction_id = priv_obj->ndp_create_transaction_id;
+	qdf_spin_unlock_bh(&priv_obj->lock);
+	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_NAN_ID);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndi_create_resp),
+			       &stat);
+}
+
+void hdd_cstats_log_ndi_create_req_evt(struct wlan_objmgr_vdev *vdev,
+				       uint16_t transaction_id)
+{
+	struct cstats_nan_ndi_create_req stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDI_CREATE_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndi_create_req) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.transaction_id = transaction_id;
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndi_create_req), &stat);
+}
+#endif /* WLAN_CHIPSET_STATS */

+ 54 - 1
core/hdd/src/wlan_hdd_stats.h

@@ -829,6 +829,41 @@ int hdd_cstats_send_data_to_userspace(char *buff, unsigned int len,
  * Return: void
  */
 void hdd_register_cstats_ops(void);
+
+/**
+ * hdd_cstats_log_ndi_delete_req_evt() - Chipset stats for ndi delete
+ *
+ * @vdev: pointer to vdev object
+ * @transaction_id: transaction ID
+ *
+ * Return : void
+ */
+void hdd_cstats_log_ndi_delete_req_evt(struct wlan_objmgr_vdev *vdev,
+				       uint16_t transaction_id);
+
+/**
+ * hdd_cstats_log_ndi_create_resp_evt() - Chipset stats for ndi create
+ * response
+ * @li: pointer link_info object
+ * @ndi_rsp: pointer to nan_datapath_inf_create_rsp object
+ *
+ * Return : void
+ */
+void
+hdd_cstats_log_ndi_create_resp_evt(struct wlan_hdd_link_info *li,
+				   struct nan_datapath_inf_create_rsp *ndi_rsp);
+
+/**
+ * hdd_cstats_log_ndi_create_req_evt() - Chipset stats for ndi create
+ * request
+ *
+ * @vdev: pointer vdve object
+ * @transaction_id : Transaction ID
+ *
+ * Return : void
+ */
+void hdd_cstats_log_ndi_create_req_evt(struct wlan_objmgr_vdev *vdev,
+				       uint16_t transaction_id);
 #else
 static inline void hdd_register_cstats_ops(void)
 {
@@ -840,5 +875,23 @@ hdd_cstats_send_data_to_userspace(char *buff, unsigned int len,
 {
 	return 0;
 }
-#endif
+
+static inline void
+hdd_cstats_log_ndi_delete_req_evt(struct wlan_objmgr_vdev *vdev,
+				  uint16_t transaction_id)
+{
+}
+
+static inline void
+hdd_cstats_log_ndi_create_resp_evt(struct wlan_hdd_link_info *li,
+				   struct nan_datapath_inf_create_rsp *ndi_rsp)
+{
+}
+
+static inline void
+hdd_cstats_log_ndi_create_req_evt(struct wlan_objmgr_vdev *vdev,
+				  uint16_t transaction_id)
+{
+}
+#endif /* WLAN_CHIPSET_STATS */
 #endif /* end #if !defined(WLAN_HDD_STATS_H) */

+ 222 - 1
os_if/nan/inc/os_if_nan.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022,2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -29,6 +29,7 @@
 #include "nan_public_structs.h"
 #include "nan_ucfg_api.h"
 #include "qca_vendor.h"
+#include <wlan_cp_stats_chipset_stats.h>
 
 /* QCA_NL80211_VENDOR_SUBCMD_NAN_EXT policy */
 extern const struct nla_policy nan_attr_policy[
@@ -184,4 +185,224 @@ static inline void os_if_nan_post_ndi_delete_rsp(struct wlan_objmgr_psoc *psoc,
 
 #endif /* WLAN_FEATURE_NAN */
 
+#if defined(WLAN_FEATURE_NAN) && defined(WLAN_CHIPSET_STATS)
+/**
+ * os_if_cstats_log_ndp_initiator_req_evt() - Chipset stats for ndp
+ * initiator request
+ *
+ * @req : pointer to nan_datapath_initiator_req
+ *
+ * Return : void
+ */
+void
+os_if_cstats_log_ndp_initiator_req_evt(struct nan_datapath_initiator_req *req);
+
+/**
+ * os_if_cstats_log_ndp_responder_req_evt() - Chipset stats for ndp
+ * responder request
+ *
+ * @vdev : pointer to vdev object
+ * @req : pointer to nan_datapath_responder_req
+ *
+ * Return : void
+ */
+void
+os_if_cstats_log_ndp_responder_req_evt(struct wlan_objmgr_vdev *vdev,
+				       struct nan_datapath_responder_req *req);
+
+/**
+ * os_if_cstats_log_ndp_end_req_evt() - Chipset stats for ndp end
+ * request event
+ *
+ * @vdev : pointer to vdev object
+ * @rq : pointer to nan_datapath_end_req
+ *
+ * Return : void
+ */
+void os_if_cstats_log_ndp_end_req_evt(struct wlan_objmgr_vdev *vdev,
+				      struct nan_datapath_end_req *rq);
+
+/**
+ * os_if_cstats_log_ndp_initiator_resp_evt() - Chipset stats for ndp
+ * initiator request event
+ *
+ * @vdev : pointer to vdev object
+ * @rsp : pointer to nan_datapath_end_req
+ *
+ * Return : void
+ */
+void
+os_if_cstats_log_ndp_initiator_resp_evt(struct wlan_objmgr_vdev *vdev,
+					struct nan_datapath_initiator_rsp *rsp);
+
+/**
+ * os_if_cstats_log_ndp_responder_resp_evt() - Chipset stats for ndp
+ * responder response event
+ *
+ * @vdev : pointer to vdev object
+ * @rsp : pointer to nan_datapath_responder_rsp
+ *
+ * Return : void
+ */
+void
+os_if_cstats_log_ndp_responder_resp_evt(struct wlan_objmgr_vdev *vdev,
+					struct nan_datapath_responder_rsp *rsp);
+
+/**
+ * os_if_cstats_log_ndp_indication_evt() - Chipset stats for ndp
+ * indication event
+ *
+ * @vdev : pointer to vdev object
+ * @evt : pointer to nan_datapath_indication_event object
+ *
+ * Return : void
+ */
+void
+os_if_cstats_log_ndp_indication_evt(struct wlan_objmgr_vdev *vdev,
+				    struct nan_datapath_indication_event *evt);
+
+/**
+ * os_if_cstats_log_ndp_confirm_evt() - Chipset stats for ndp
+ * confirm event
+ *
+ * @vdev : pointer to vdev object
+ * @nc : pointer to nan_datapath_confirm_event
+ *
+ * Return : void
+ */
+void os_if_cstats_log_ndp_confirm_evt(struct wlan_objmgr_vdev *vdev,
+				      struct nan_datapath_confirm_event *nc);
+
+/**
+ * os_if_cstats_log_ndp_end_rsp_evt() - Chipset stats for ndp
+ * end response event
+ *
+ * @vdev : pointer to vdev object
+ * @rsp : pointer to nan_datapath_end_rsp_event object
+ *
+ * Return : void
+ */
+void os_if_cstats_log_ndp_end_rsp_evt(struct wlan_objmgr_vdev *vdev,
+				      struct nan_datapath_end_rsp_event *rsp);
+
+/**
+ * os_if_cstats_log_ndp_new_peer_evt() - Chipset stats for ndp
+ * new peer event
+ *
+ * @vdev : pointer to vdev object
+ * @peer_ind : pointer to nan_datapath_peer_ind object
+ *
+ * Return : void
+ */
+void os_if_cstats_log_ndp_new_peer_evt(struct wlan_objmgr_vdev *vdev,
+				       struct nan_datapath_peer_ind *peer_ind);
+
+/**
+ * os_if_cstats_log_ndi_delete_resp_evt() - Chipset stats for ndi
+ * delete response event
+ *
+ * @vdev : pointer to vdev object
+ * @rsp : pointer to nan_datapath_inf_delete_rsp object
+ *
+ * Return : void
+ */
+void
+os_if_cstats_log_ndi_delete_resp_evt(struct wlan_objmgr_vdev *vdev,
+				     struct nan_datapath_inf_delete_rsp *rsp);
+
+/**
+ * os_if_cstats_log_nan_disc_enable_req_evt() - Chipset stats for nan
+ * discovery enable request
+ *
+ * @vdev_id : pointer to vdev object
+ * @nan_req : pointer to nan_enable_req object
+ *
+ * Return : void
+ */
+void os_if_cstats_log_nan_disc_enable_req_evt(uint8_t vdev_id,
+					      struct nan_enable_req *nan_req);
+
+/**
+ * os_if_cstats_log_disable_nan_disc_evt() - Chipset stats for nan
+ * discovery disable event
+ *
+ * @pdev : pointer to pdev object
+ * @vdev_id : vdev ID
+ *
+ * Return : void
+ */
+void os_if_cstats_log_disable_nan_disc_evt(struct wlan_objmgr_pdev *pdev,
+					   uint8_t vdev_id);
+#else
+static inline void
+os_if_cstats_log_ndp_initiator_req_evt(struct nan_datapath_initiator_req *req)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_responder_req_evt(struct wlan_objmgr_vdev *vdev,
+				       struct nan_datapath_responder_req *req)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_end_req_evt(struct wlan_objmgr_vdev *vdev,
+				 struct nan_datapath_end_req *rq)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_initiator_resp_evt(struct wlan_objmgr_vdev *vdev,
+					struct nan_datapath_initiator_rsp *rsp)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_responder_resp_evt(struct wlan_objmgr_vdev *vdev,
+					struct nan_datapath_responder_rsp *rsp)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_indication_evt(struct wlan_objmgr_vdev *vdev,
+				    struct nan_datapath_indication_event *event)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_confirm_evt(struct wlan_objmgr_vdev *vdev,
+				 struct nan_datapath_confirm_event *nc)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_end_rsp_evt(struct wlan_objmgr_vdev *vdev,
+				 struct nan_datapath_end_rsp_event *rsp)
+{
+}
+
+static inline void
+os_if_cstats_log_ndp_new_peer_evt(struct wlan_objmgr_vdev *vdev,
+				  struct nan_datapath_peer_ind *peer_ind)
+{
+}
+
+static inline void
+os_if_cstats_log_ndi_delete_resp_evt(struct wlan_objmgr_vdev *vdev,
+				     struct nan_datapath_inf_delete_rsp *rsp)
+{
+}
+
+static inline void
+os_if_cstats_log_nan_disc_enable_req_evt(uint8_t vdev_id,
+					 struct nan_enable_req *nan_req)
+{
+}
+
+static inline void
+os_if_cstats_log_disable_nan_disc_evt(struct wlan_objmgr_pdev *pdev,
+				      uint8_t vdev_id)
+{
+}
+#endif /* WLAN_CHIPSET_STATS */
 #endif

+ 309 - 1
os_if/nan/src/os_if_nan.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -833,6 +833,9 @@ static int __os_if_nan_process_ndp_initiator_req(struct wlan_objmgr_psoc *psoc,
 	}
 
 	req.vdev = nan_vdev;
+
+	os_if_cstats_log_ndp_initiator_req_evt(&req);
+
 	status = ucfg_nan_req_processor(nan_vdev, &req, NDP_INITIATOR_REQ);
 	ret = qdf_status_to_os_return(status);
 initiator_req_failed:
@@ -1023,6 +1026,8 @@ static int __os_if_nan_process_ndp_responder_req(struct wlan_objmgr_psoc *psoc,
 		goto responder_req_failed;
 	}
 
+	os_if_cstats_log_ndp_responder_req_evt(nan_vdev, &req);
+
 	osif_debug("vdev_id: %d, transaction_id: %d, ndp_rsp %d, ndp_instance_id: %d, ndp_app_info_len: %d, csid: %d",
 		   wlan_vdev_get_id(nan_vdev), req.transaction_id, req.ndp_rsp,
 		   req.ndp_instance_id, req.ndp_info.ndp_app_info_len,
@@ -1110,6 +1115,9 @@ static int __os_if_nan_process_ndp_end_req(struct wlan_objmgr_psoc *psoc,
 	}
 
 	req.vdev = nan_vdev;
+
+	os_if_cstats_log_ndp_end_req_evt(nan_vdev, &req);
+
 	status = ucfg_nan_req_processor(nan_vdev, &req, NDP_END_REQ);
 	ret = qdf_status_to_os_return(status);
 	if (ret)
@@ -1309,6 +1317,8 @@ static void os_if_ndp_initiator_rsp_handler(struct wlan_objmgr_vdev *vdev,
 			rsp->reason))
 		goto ndp_initiator_rsp_nla_failed;
 
+	os_if_cstats_log_ndp_initiator_resp_evt(vdev, rsp);
+
 	osif_debug("NDP Initiator rsp sent, tid:%d, instance id:%d, status:%d, reason: %d",
 		   rsp->transaction_id, rsp->ndp_instance_id, rsp->status,
 		   rsp->reason);
@@ -1391,6 +1401,8 @@ static void os_if_ndp_responder_rsp_handler(struct wlan_objmgr_vdev *vdev,
 	   rsp->reason))
 		goto ndp_responder_rsp_nla_failed;
 
+	os_if_cstats_log_ndp_responder_resp_evt(vdev, rsp);
+
 	wlan_cfg80211_vendor_event(vendor_event, GFP_ATOMIC);
 	return;
 ndp_responder_rsp_nla_failed:
@@ -1599,6 +1611,8 @@ static void os_if_ndp_indication_handler(struct wlan_objmgr_vdev *vdev,
 			goto ndp_indication_nla_failed;
 	}
 
+	os_if_cstats_log_ndp_indication_evt(vdev, event);
+
 	wlan_cfg80211_vendor_event(vendor_event, GFP_ATOMIC);
 	return;
 ndp_indication_nla_failed:
@@ -1807,6 +1821,9 @@ os_if_ndp_confirm_ind_handler(struct wlan_objmgr_vdev *vdev,
 			goto ndp_confirm_nla_failed;
 
 	wlan_cfg80211_vendor_event(vendor_event, GFP_ATOMIC);
+
+	os_if_cstats_log_ndp_confirm_evt(vdev, ndp_confirm);
+
 	osif_debug("NDP confim sent, ndp instance id: %d, peer addr: "QDF_MAC_ADDR_FMT" rsp_code: %d, reason_code: %d",
 		   ndp_confirm->ndp_instance_id,
 		   QDF_MAC_ADDR_REF(ndp_confirm->peer_ndi_mac_addr.bytes),
@@ -1889,6 +1906,8 @@ static void os_if_ndp_end_rsp_handler(struct wlan_objmgr_vdev *vdev,
 			rsp->transaction_id))
 		goto ndp_end_rsp_nla_failed;
 
+	os_if_cstats_log_ndp_end_rsp_evt(vdev, rsp);
+
 	osif_debug("NDP End rsp sent, transaction id: %u, status: %u, reason: %u",
 		   rsp->transaction_id, rsp->status, rsp->reason);
 	wlan_cfg80211_vendor_event(vendor_event, GFP_ATOMIC);
@@ -2006,6 +2025,8 @@ static void os_if_new_peer_ind_handler(struct wlan_objmgr_vdev *vdev,
 		return;
 	}
 
+	os_if_cstats_log_ndp_new_peer_evt(vdev, peer_ind);
+
 	osif_debug("vdev_id: %d, peer_mac: "QDF_MAC_ADDR_FMT,
 		   vdev_id, QDF_MAC_ADDR_REF(peer_ind->peer_mac_addr.bytes));
 	ret = cb_obj.new_peer_ind(vdev_id, peer_ind->sta_id,
@@ -2254,6 +2275,8 @@ static void os_if_ndp_iface_delete_rsp_handler(struct wlan_objmgr_psoc *psoc,
 		osif_debug("NDI BSS stop failed with reason %d",
 			   ndi_rsp->reason);
 
+	os_if_cstats_log_ndi_delete_resp_evt(vdev, ndi_rsp);
+
 	ucfg_nan_set_ndi_delete_rsp_reason(vdev, ndi_rsp->reason);
 	ucfg_nan_set_ndi_delete_rsp_status(vdev, ndi_rsp->status);
 	cb_obj.drv_ndi_delete_rsp_handler(vdev_id);
@@ -2896,9 +2919,294 @@ int os_if_process_nan_req(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
 	case QCA_WLAN_NAN_EXT_SUBCMD_TYPE_ENABLE_REQ:
 		return os_if_process_nan_enable_req(pdev, tb, vdev_id);
 	case QCA_WLAN_NAN_EXT_SUBCMD_TYPE_DISABLE_REQ:
+		os_if_cstats_log_disable_nan_disc_evt(pdev, vdev_id);
 		return os_if_process_nan_disable_req(psoc, tb);
 	default:
 		osif_err("Unrecognized NAN subcmd type(%d)", nan_subcmd);
 		return -EINVAL;
 	}
 }
+
+#ifdef WLAN_CHIPSET_STATS
+void
+os_if_cstats_log_ndp_initiator_req_evt(struct nan_datapath_initiator_req *req)
+{
+	struct cstats_nan_ndp_initiator_req stat = {0};
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = req->vdev;
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_INITIATOR_REQ_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_initiator_req) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+
+	stat.transaction_id = req->transaction_id;
+	stat.channel = req->channel;
+	stat.channel_cfg = req->channel_cfg;
+	stat.service_instance_id = req->service_instance_id;
+	CSTATS_MAC_COPY(stat.self_ndi_mac_addr, req->self_ndi_mac_addr.bytes);
+	CSTATS_MAC_COPY(stat.peer_discovery_mac_addr,
+			req->peer_discovery_mac_addr.bytes);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_initiator_req),
+			       &stat);
+}
+
+void
+os_if_cstats_log_ndp_responder_req_evt(struct wlan_objmgr_vdev *vdev,
+				       struct nan_datapath_responder_req *req)
+{
+	struct cstats_nan_ndp_responder_req stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_RESPONDER_REQ_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_responder_req) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.transaction_id = req->transaction_id;
+	stat.ndp_instance_id = req->ndp_instance_id;
+	stat.ndp_rsp = req->ndp_rsp;
+	stat.ncs_sk_type = req->ncs_sk_type;
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_responder_req),
+			       &stat);
+}
+
+void os_if_cstats_log_ndp_end_req_evt(struct wlan_objmgr_vdev *vdev,
+				      struct nan_datapath_end_req *rq)
+{
+	struct cstats_nan_ndp_end_req stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_END_REQ_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_end_req) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.transaction_id = rq->transaction_id;
+	stat.num_ndp_instances = rq->num_ndp_instances;
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_end_req), &stat);
+}
+
+void
+os_if_cstats_log_ndp_initiator_resp_evt(struct wlan_objmgr_vdev *vdev,
+					struct nan_datapath_initiator_rsp *rsp)
+{
+	struct cstats_nan_ndp_initiator_resp stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_INITIATOR_RSP_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_initiator_resp) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.status = rsp->status;
+	stat.reason = rsp->reason;
+	stat.transaction_id = rsp->transaction_id;
+	stat.service_instance_id = rsp->ndp_instance_id;
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_initiator_resp),
+			       &stat);
+}
+
+void
+os_if_cstats_log_ndp_responder_resp_evt(struct wlan_objmgr_vdev *vdev,
+					struct nan_datapath_responder_rsp *rsp)
+{
+	struct cstats_nan_ndp_responder_resp stat = {0};
+
+	stat.cmn.hdr.evt_id =
+		WLAN_CHIPSET_STATS_NAN_NDP_RESPONDER_RESP_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_tdls_disc_req) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.status = rsp->status;
+	stat.reason = rsp->reason;
+	stat.transaction_id = rsp->transaction_id;
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_responder_resp),
+			       &stat);
+}
+
+void
+os_if_cstats_log_ndp_indication_evt(struct wlan_objmgr_vdev *vdev,
+				    struct nan_datapath_indication_event *evt)
+{
+	struct cstats_nan_ndp_ind stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_INDICATION_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_ind) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.ndp_instance_id = evt->ndp_instance_id;
+	stat.service_instance_id = evt->service_instance_id;
+	CSTATS_MAC_COPY(stat.peer_mac, evt->peer_mac_addr.bytes);
+	CSTATS_MAC_COPY(stat.peer_discovery_mac_addr,
+			evt->peer_discovery_mac_addr.bytes);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_ind), &stat);
+}
+
+void
+os_if_cstats_log_ndp_confirm_evt(struct wlan_objmgr_vdev *vdev,
+				 struct nan_datapath_confirm_event *nc)
+{
+	struct cstats_nan_ndp_confirm_ind stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_CONFIRM_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_confirm_ind) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.instance_id = nc->ndp_instance_id;
+	stat.rsp_code = nc->rsp_code;
+	stat.reason_code = nc->reason_code;
+	CSTATS_MAC_COPY(stat.peer_addr, nc->peer_ndi_mac_addr.bytes);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_confirm_ind),
+			       &stat);
+}
+
+void
+os_if_cstats_log_ndp_end_rsp_evt(struct wlan_objmgr_vdev *vdev,
+				 struct nan_datapath_end_rsp_event *rsp)
+{
+	struct cstats_nan_ndp_end_resp stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_END_RESP_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_end_resp) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.status = rsp->status;
+	stat.reason = rsp->reason;
+	stat.transaction_id = rsp->transaction_id;
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_end_resp), &stat);
+}
+
+void
+os_if_cstats_log_ndp_new_peer_evt(struct wlan_objmgr_vdev *vdev,
+				  struct nan_datapath_peer_ind *peer_ind)
+{
+	struct cstats_nan_ndp_new_peer_ind stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDP_NEW_PEER_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndp_new_peer_ind) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.sta_id = peer_ind->sta_id;
+	CSTATS_MAC_COPY(stat.peer_mac, peer_ind->peer_mac_addr.bytes);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndp_new_peer_ind),
+			       &stat);
+}
+
+void
+os_if_cstats_log_ndi_delete_resp_evt(struct wlan_objmgr_vdev *vdev,
+				     struct nan_datapath_inf_delete_rsp *rsp)
+{
+	struct cstats_nan_ndi_delete_resp stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_NAN_NDI_DELETE_RESP_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_ndi_delete_resp) -
+			      sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+
+	stat.status = rsp->status;
+	stat.reason = rsp->reason;
+	stat.transaction_id = ucfg_nan_get_ndp_delete_transaction_id(vdev);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_ndi_delete_resp),
+			       &stat);
+}
+
+void os_if_cstats_log_nan_disc_enable_req_evt(uint8_t vdev_id,
+					      struct nan_enable_req *nan_req)
+{
+	struct cstats_nan_disc_enable stat = {0};
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(nan_req->pdev,
+						    vdev_id, WLAN_NAN_ID);
+	if (!vdev) {
+		osif_err("vdev is null");
+		return;
+	}
+
+	stat.cmn.hdr.evt_id =
+		WLAN_CHIPSET_STATS_NAN_DISCOVERY_ENABLE_REQ_EVENT_ID;
+	stat.cmn.hdr.length =
+			sizeof(struct cstats_nan_disc_enable) -
+			sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+	stat.social_chan_2g_freq = nan_req->social_chan_2g_freq;
+	stat.social_chan_5g_freq = nan_req->social_chan_5g_freq;
+	stat.rtt_cap = nan_req->params.rtt_cap;
+	stat.disable_6g_nan = nan_req->params.disable_6g_nan;
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_disc_enable), &stat);
+}
+
+void
+os_if_cstats_log_disable_nan_disc_evt(struct wlan_objmgr_pdev *pdev,
+				      uint8_t vdev_id)
+{
+	struct cstats_nan_disc_disable_req stat = {0};
+	struct wlan_objmgr_vdev *vdev = NULL;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, WLAN_NAN_ID);
+	if (!vdev) {
+		osif_err("vdev is null");
+		return;
+	}
+
+	stat.cmn.hdr.evt_id =
+		WLAN_CHIPSET_STATS_NAN_DISCOVERY_DISABLE_REQ_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_nan_disc_disable_req) -
+			  sizeof(struct cstats_hdr);
+	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
+	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+
+	stat.disable_2g_discovery = 1;
+	stat.disable_5g_discovery = 1;
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_nan_disc_disable_req),
+			       &stat);
+}
+#endif /* WLAN_CHIPSET_STATS */
+