Prechádzať zdrojové kódy

qcacld-3.0: Add chipset stats for Roaming operations

Add chipset stats for Roaming operations

Change-Id: I0f9fbb362a3c4a8bcbbec991775272a127cdeae6
CRs-Fixed: 3783032
Rachit Kankane 1 rok pred
rodič
commit
391e08c8fd

+ 146 - 2
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -37,6 +37,7 @@
 #include "wlan_connectivity_logging.h"
 #include "target_if.h"
 #include "wlan_mlo_mgr_roam.h"
+#include <wlan_cp_stats_chipset_stats.h>
 
 /* Support for "Fast roaming" (i.e., ESE, LFR, or 802.11r.) */
 #define BG_SCAN_OCCUPIED_CHANNEL_LIST_LEN 15
@@ -4359,6 +4360,140 @@ wlan_cm_update_roam_stats_info(struct wlan_objmgr_psoc *psoc,
 }
 #endif
 
+#ifdef WLAN_CHIPSET_STATS
+static void
+cm_cp_stats_cstats_roam_scan_cancel(struct cstats_sta_roam_scan_cancel *stat,
+				    struct wmi_roam_trigger_abort_reason *abort)
+{
+	stat->reason_code = abort->abort_reason_code;
+	stat->data_rssi = abort->data_rssi;
+	stat->data_rssi_threshold = abort->data_rssi_threshold;
+	stat->rx_linkspeed_status = abort->rx_linkspeed_status;
+}
+
+static void
+cm_cp_stats_cstats_roam_scan_start(struct wlan_objmgr_vdev *vdev,
+				   struct wmi_roam_trigger_info *event,
+				   bool is_full_scan)
+{
+	struct cstats_sta_roam_scan_start stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_STA_ROAM_SCAN_START_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_sta_roam_scan_start) -
+			      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.trigger_reason = event->trigger_reason;
+	stat.trigger_sub_reason = event->trigger_sub_reason;
+	stat.rssi = event->current_rssi;
+	stat.timestamp = event->timestamp;
+	stat.is_full_scan = is_full_scan;
+	cm_cp_stats_cstats_roam_scan_cancel(&stat.abort_roam,
+					    &event->abort_reason);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_sta_roam_scan_start),
+			       &stat);
+}
+
+static void
+cm_cp_stats_cstats_roam_scan_ap(struct cstats_sta_roam_scan_ap *stat,
+				struct wmi_roam_candidate_info *ap,
+				uint8_t num_ap)
+{
+	uint8_t i;
+
+	if (num_ap > MAX_ROAM_CANDIDATE_AP)
+		num_ap = MAX_ROAM_CANDIDATE_AP;
+
+	for (i = 0; i < num_ap; i++) {
+		CSTATS_MAC_COPY(stat->bssid, ap->bssid.bytes);
+		stat[i].total_score = ap->total_score;
+		stat[i].rssi = ap->rssi;
+		stat[i].etp = ap->etp;
+		stat[i].freq = ap->freq;
+		stat[i].cu_load = ap->cu_load;
+		stat[i].is_mlo = ap->is_mlo;
+		stat[i].type = ap->type;
+	}
+}
+
+static void cm_cp_stats_cstats_roam_scan_done(struct wlan_objmgr_vdev *vdev,
+					      struct wmi_roam_scan_data *event,
+					      bool is_full_scan)
+{
+	struct cstats_sta_roam_scan_done stat = {0};
+	uint8_t i;
+
+	if (event->num_ap >= MAX_ROAM_CANDIDATE_AP &&
+	    event->num_chan > MAX_ROAM_SCAN_CHAN)
+		return;
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_STA_ROAM_SCAN_DONE_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_sta_roam_scan_done) -
+			      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.cand_ap_count = event->num_ap;
+	stat.num_scanned_freq = event->num_chan;
+	stat.timestamp = event->scan_complete_timestamp;
+
+	for (i = 0; i < event->num_chan; i++)
+		stat.scanned_freq[i] = event->chan_freq[i];
+
+	stat.is_full_scan = is_full_scan;
+	cm_cp_stats_cstats_roam_scan_ap(stat.ap, event->ap, stat.cand_ap_count);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_sta_roam_scan_done), &stat);
+}
+
+static void cm_cp_stats_cstats_roam_result(struct wlan_objmgr_vdev *vdev,
+					   struct wmi_roam_result *event)
+{
+	struct cstats_sta_roam_result stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_STA_ROAM_RESULT_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_sta_roam_result) -
+			      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.timestamp = event->timestamp;
+	stat.status = event->status;
+	stat.fail_reason = event->fail_reason;
+	stat.roam_cancel_reason = event->roam_abort_reason;
+	CSTATS_MAC_COPY(stat.bssid, event->fail_bssid.bytes);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_sta_roam_result), &stat);
+}
+
+#else
+static inline void
+cm_cp_stats_cstats_roam_scan_start(struct wlan_objmgr_vdev *vdev,
+				   struct wmi_roam_trigger_info *event,
+				   bool is_full_scan)
+{
+}
+
+static inline void
+cm_cp_stats_cstats_roam_scan_done(struct wlan_objmgr_vdev *vdev,
+				  struct wmi_roam_scan_data *event,
+				  bool is_full_scan)
+{
+}
+
+static inline void
+cm_cp_stats_cstats_roam_result(struct wlan_objmgr_vdev *vdev,
+			       struct wmi_roam_result *event)
+{
+}
+#endif /* WLAN_CHIPSET_STATS */
+
 QDF_STATUS
 cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 			    struct roam_stats_event *stats_info)
@@ -4384,6 +4519,9 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 				stats_info->scan[i].present &&
 				stats_info->scan[i].type;
 
+			cm_cp_stats_cstats_roam_scan_start
+				(vdev, &stats_info->trigger[i], is_full_scan);
+
 			if (stats_info->trigger[i].trigger_reason ==
 			    ROAM_TRIGGER_REASON_BTM) {
 				cm_roam_handle_btm_stats(psoc, stats_info, i,
@@ -4398,20 +4536,26 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 					&stats_info->scan[i],
 					stats_info->vdev_id, is_full_scan);
 
-			if (stats_info->scan[i].present)
+			if (stats_info->scan[i].present) {
 				cm_roam_stats_print_scan_info(
 					psoc, &stats_info->scan[i],
 					stats_info->vdev_id,
 					stats_info->trigger[i].trigger_reason,
 					stats_info->trigger[i].timestamp);
+				cm_cp_stats_cstats_roam_scan_done
+				     (vdev, &stats_info->scan[i], is_full_scan);
+			}
 		}
 
-		if (stats_info->result[i].present)
+		if (stats_info->result[i].present) {
 			cm_roam_stats_print_roam_result(psoc,
 							&stats_info->trigger[i],
 							&stats_info->result[i],
 							&stats_info->scan[i],
 							stats_info->vdev_id);
+			cm_cp_stats_cstats_roam_result
+					       (vdev, &stats_info->result[i]);
+		}
 
 		if (stats_info->frame_stats[i].num_frame)
 			cm_roam_print_frame_info(psoc,