Parcourir la source

qcacmn: Add wmi support to get link airtime usage stats

Add wmi support to get link airtime usage stats

Change-Id: Ie23c980de1178a7293eca19b3576da86d6318d21
CRs-Fixed: 3199400
Himanshu Batra il y a 3 ans
Parent
commit
61d0aa9de0

+ 12 - 0
wmi/inc/wmi_unified_api.h

@@ -4777,4 +4777,16 @@ wmi_extract_pktlog_decode_info_event(wmi_unified_t wmi_handle,
 QDF_STATUS wmi_unified_pn_mgmt_rxfilter_send_cmd(
 		struct wmi_unified *wmi_handle,
 		struct vdev_pn_mgmt_rxfilter_params *params);
+
+/**
+ * wmi_extract_pdev_telemetry_stats_tlv - extract pdev telemetry stats
+ * @wmi_handle: wmi handle
+ * @evt_buf: pointer to event buffer
+ * @pdev stats: Pointer to hold pdev telemetry stats
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS wmi_extract_pdev_telemetry_stats(
+		wmi_unified_t wmi_handle, void *evt_buf,
+		struct wmi_host_pdev_telemetry_stats *pdev_stats);
 #endif /* _WMI_UNIFIED_API_H_ */

+ 15 - 0
wmi/inc/wmi_unified_param.h

@@ -893,6 +893,7 @@ typedef enum {
 	WMI_HOST_REQUEST_PEER_ADV_STATS = 0x4000,
 	WMI_HOST_REQUEST_PMF_BCN_PROTECT_STAT = 0x8000,
 	WMI_HOST_REQUEST_VDEV_PRB_FILS_STAT = 0x10000,
+	WMI_HOST_REQUEST_PDEV_TELEMETRY_STAT = 0x40000,
 } wmi_host_stats_id;
 
 typedef struct {
@@ -4716,6 +4717,20 @@ struct wmi_host_tsf_event {
 	uint32_t use_tqm_timer;
 };
 
+/**
+ * struct wmi_host_peer_adv_stats - peer adv stats event structure
+ * @avg_chan_lat_per_ac: average channel latency
+ * @estimated_air_time_per_ac: Percentage of air time available for each AC
+ * BIT[0-7]   : AC_BE
+ * BIT[8-15]  : AC_BK
+ * BIT[16-23] : AC_VI
+ * BIT[24-31] : AC_VO
+ */
+struct wmi_host_pdev_telemetry_stats {
+	uint32_t avg_chan_lat_per_ac[WIFI_AC_MAX];
+	uint32_t estimated_air_time_per_ac;
+};
+
 #define WMI_EVENT_ID_INVALID 0
 /**
  * Host based ENUM IDs for events to abstract target enums for event_id

+ 5 - 0
wmi/inc/wmi_unified_priv.h

@@ -3003,6 +3003,11 @@ QDF_STATUS
 				    uint8_t *pdev_id, uint8_t *software_image,
 				    uint8_t *chip_info,
 				    uint32_t *pktlog_json_version);
+
+QDF_STATUS
+(*extract_pdev_telemetry_stats)(
+		wmi_unified_t wmi_handle, void *evt_buf,
+		struct wmi_host_pdev_telemetry_stats *pdev_stats);
 };
 
 /* Forward declartion for psoc*/

+ 19 - 0
wmi/src/wmi_unified_api.c

@@ -3851,3 +3851,22 @@ wmi_extract_pktlog_decode_info_event(wmi_unified_t wmi_handle,
 					pktlog_json_version);
 	return QDF_STATUS_E_FAILURE;
 }
+
+/**
+ * wmi_extract_pdev_telemetry_stats_tlv - extract pdev telemetry stats
+ * @wmi_handle: wmi handle
+ * @evt_buf: pointer to event buffer
+ * @pdev stats: Pointer to hold pdev telemetry stats
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS wmi_extract_pdev_telemetry_stats(
+		wmi_unified_t wmi_handle, void *evt_buf,
+		struct wmi_host_pdev_telemetry_stats *pdev_stats)
+{
+	if (wmi_handle->ops->extract_pdev_telemetry_stats)
+		return wmi_handle->ops->extract_pdev_telemetry_stats(
+			wmi_handle, evt_buf, pdev_stats);
+
+	return QDF_STATUS_E_FAILURE;
+}

+ 6 - 2
wmi/src/wmi_unified_cp_stats_tlv.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 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 above
@@ -593,7 +593,7 @@ extract_all_stats_counts_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 		return QDF_STATUS_E_FAULT;
 	}
 
-	for (i = 1; i <= WMI_REQUEST_VDEV_EXTD_STAT; i = i << 1) {
+	for (i = 1; i <= WMI_REQUEST_PDEV_TELEMETRY_STAT; i = i << 1) {
 		switch (ev->stats_id & i) {
 		case WMI_REQUEST_PEER_STAT:
 			stats_param->stats_id |= WMI_HOST_REQUEST_PEER_STAT;
@@ -641,6 +641,10 @@ extract_all_stats_counts_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 			stats_param->stats_id |=
 				WMI_HOST_REQUEST_VDEV_PRB_FILS_STAT;
 			break;
+		case WMI_REQUEST_PDEV_TELEMETRY_STAT:
+			stats_param->stats_id |=
+				WMI_HOST_REQUEST_PDEV_TELEMETRY_STAT;
+			break;
 		}
 	}
 

+ 30 - 0
wmi/src/wmi_unified_tlv.c

@@ -17770,6 +17770,35 @@ extract_pktlog_decode_info_event_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 	qdf_mem_copy(chip_info, event->chip_info, 40);
 	*pktlog_json_version = event->pktlog_defs_json_version;
 	*pdev_id = event->pdev_id;
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * extract_pdev_telemetry_stats_tlv - extract pdev telemetry stats
+ * @wmi_handle: wmi handle
+ * @evt_buf: pointer to event buffer
+ * @pdev stats: Pointer to hold pdev telemetry stats
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS
+extract_pdev_telemetry_stats_tlv(
+		wmi_unified_t wmi_handle, void *evt_buf,
+		struct wmi_host_pdev_telemetry_stats *pdev_stats)
+{
+	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
+	wmi_pdev_telemetry_stats *ev;
+
+	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *)evt_buf;
+
+	if (param_buf->pdev_telemetry_stats) {
+		ev = (wmi_pdev_telemetry_stats *)(param_buf->pdev_telemetry_stats);
+		qdf_mem_copy(pdev_stats->avg_chan_lat_per_ac,
+			     ev->avg_chan_lat_per_ac,
+			     sizeof(ev->avg_chan_lat_per_ac));
+		pdev_stats->estimated_air_time_per_ac =
+			     ev->estimated_air_time_per_ac;
+	}
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -18219,6 +18248,7 @@ struct wmi_ops tlv_ops =  {
 	.send_vdev_pn_mgmt_rxfilter_cmd = send_vdev_pn_mgmt_rxfilter_cmd_tlv,
 	.extract_pktlog_decode_info_event =
 		extract_pktlog_decode_info_event_tlv,
+	.extract_pdev_telemetry_stats = extract_pdev_telemetry_stats_tlv,
 };
 
 #ifdef WLAN_FEATURE_11BE_MLO