diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 3120e14b04..0774581b49 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/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_ */ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 6ca324ae63..824845ac54 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/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 diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 8d729e2f09..5945a364a6 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/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*/ diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index c74aa2ac40..170cb0fca2 100644 --- a/wmi/src/wmi_unified_api.c +++ b/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; +} diff --git a/wmi/src/wmi_unified_cp_stats_tlv.c b/wmi/src/wmi_unified_cp_stats_tlv.c index c7d748cae2..bea8ff1538 100644 --- a/wmi/src/wmi_unified_cp_stats_tlv.c +++ b/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; } } diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 5e7f301826..0c6f227e0f 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/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