diff --git a/fw/wmi_services.h b/fw/wmi_services.h index a49066f40abe..69af1b7ebdff 100644 --- a/fw/wmi_services.h +++ b/fw/wmi_services.h @@ -774,6 +774,8 @@ typedef enum { * ongoing TBTT count downs to Host. */ WMI_SERVICE_SHARED_MEM_MODEL_TBTT_COUNT_DOWN = 497, + /* Indicate FW support for IPI (Idle Power Indicate) stats collection */ + WMI_SERVICE_IDLE_POWER_INDICATE_SUPPORT = 498, WMI_MAX_EXT2_SERVICE diff --git a/fw/wmi_tlv_defs.h b/fw/wmi_tlv_defs.h index 03c449cd2af0..a5a94c79fea3 100644 --- a/fw/wmi_tlv_defs.h +++ b/fw/wmi_tlv_defs.h @@ -1611,6 +1611,7 @@ typedef enum { WMITLV_TAG_STRUC_wmi_vdev_start_uhr_config, WMITLV_TAG_STRUC_wmi_pdev_set_cumac_chip_id_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_pdev_set_cumac_chip_id_confirmation_event_fixed_param, + WMITLV_TAG_STRUC_wmi_iface_ipi_stats, } WMITLV_TAG_ID; /* * IMPORTANT: Please add _ALL_ WMI Commands Here. @@ -7137,7 +7138,9 @@ WMITLV_CREATE_PARAM_STRUC(WMI_DIAG_EVENT_LOG_SUPPORTED_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_iface_link_stats, iface_link_stats, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_wmm_ac_stats, ac, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_iface_offload_stats, iface_offload_stats, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_iface_powersave_stats, iface_powersave_stats, WMITLV_SIZE_VAR) + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_iface_powersave_stats, iface_powersave_stats, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_iface_ipi_stats, iface_ipi_stats, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, snr_histogram, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_IFACE_LINK_STATS_EVENTID); diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 412d1a7f4c25..6f79ecbf54f4 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -5230,8 +5230,13 @@ typedef struct { * Bits 28:26 - extension bits for specifing the format version of the * rx peer metadata the target needs to use (to cover versions V2 and * beyond). + * Bit 29 - enable ipi_stats feature: + * 0 -> disable the feature + * 1 -> enable the feature + * Refer to below WMI_RSRC_CFG_FLAGS2_IPI_STATS_ENABLED_GET/SET + * macros. * - * Bits 31:29 - Reserved + * Bits 31:30 - Reserved */ A_UINT32 flags2; /** @brief host_service_flags - can be used by Host to indicate @@ -5875,6 +5880,11 @@ typedef struct { #define WMI_RSRC_CFG_FLAGS2_RX_PEER_METADATA_EXTENSION_SET(flags2, value) \ WMI_SET_BITS(flags2, 26, 3, value) +#define WMI_RSRC_CFG_FLAGS2_IPI_STATS_ENABLED_GET(flags2) \ + WMI_GET_BITS(flags2, 29, 1) +#define WMI_RSRC_CFG_FLAGS2_IPI_STATS_ENABLED_SET(flags2, value) \ + WMI_SET_BITS(flags2, 29, 1, value) + #define WMI_RSRC_CFG_HOST_SERVICE_FLAG_NAN_IFACE_SUPPORT_GET(host_service_flags) \ WMI_GET_BITS(host_service_flags, 0, 1) #define WMI_RSRC_CFG_HOST_SERVICE_FLAG_NAN_IFACE_SUPPORT_SET(host_service_flags, val) \ @@ -12491,6 +12501,77 @@ typedef struct { A_UINT32 tot_err_tim_bcn; } wmi_iface_powersave_stats; + +#define WMI_IPI_STATS_SNR_LOWER_BOUND_GET(snr_config) \ + WMI_GET_BITS(snr_config, 0, 8) +#define WMI_IPI_STATS_SNR_LOWER_BOUND_SET(snr_config, value) \ + WMI_SET_BITS(snr_config, 0, 8, value) +#define WMI_IPI_STATS_SNR_UPPER_BOUND_GET(snr_config) \ + WMI_GET_BITS(snr_config, 8, 8) +#define WMI_IPI_STATS_SNR_UPPER_BOUND_SET(snr_config, value) \ + WMI_SET_BITS(snr_config, 8, 8, value) +#define WMI_IPI_STATS_SNR_STEP_GET(snr_config) \ + WMI_GET_BITS(snr_config, 16, 8) +#define WMI_IPI_STATS_SNR_STEP_SET(snr_config, value) \ + WMI_SET_BITS(snr_config, 16, 8, value) +#define WMI_IPI_STATS_SNR_NUM_BINS_GET(snr_config) \ + WMI_GET_BITS(snr_config, 24, 8) +#define WMI_IPI_STATS_SNR_NUM_BINS_SET(snr_config, value) \ + WMI_SET_BITS(snr_config, 24, 8, value) + +/* + * Signal to Noise Ration(SNR) is measured during idle periods and reported + * as a distribution across multiple bins + */ +typedef struct { + A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_iface_ipi_stats */ + + /* + * Total time in microseconds spent on the channel during which + * these signal-to-noise measurements were collected + */ + A_UINT32 meas_dur_us; + + /* snr_config: + * Contains lower bound, upper bound, step value and total bins for the + * SNR measurements done. + * Firmware collects the SNR data into + * (((upper_bound - lower_bound)/step) + out_of_bound_bins) + * bins and sends to host. + * lower_bound - Lower value of the SNR measurement range + * upper_bound - Upper value of the SNR measurement range + * step - Each bin data range + * num_bins - Number of bins calculated as per above formula, + * represents the number of elements in TLV snr_histogram + * out_of_bound_bins(=2) - Number of bins to carry values below lower + * bound and above upper bound in corresponding bin, + * including lower and upper bound values + * E.g - 1. lower_bound = 0, upper_bound = 100 and step = 10 + * Firmware collects the SNR samples into ((100-0)/10)+2 = 12 bins + * E.g - 2. lower_bound = 10, upper_bound = 90 and step = 20 + * Firmware collects the SNR samples into ((90-10)/20)+2 = 6 bins + */ + A_UINT32 snr_config; + + /* + * This TLV is followed by a snr_histogram TLV containing a variable-length + * array of A_UINT32 to carry data from each bin. + * Bin[0] contains the number of samples with SNR < lower_bound dB + * Bin[1] contains the number of samples with SNR in range + * [lower_bound, lower_bound + step) dB + * Bin[2] contains the number of samples with SNR in range + * [lower_bound + step, lower_bound + 2*step) dB + * ... + * Bin[num_bins - 2] contains the number of samples with SNR in range + * [upper_bound - step, upper_bound) dB + * Bin[num_bins - 1] contains the number of samples with + * SNR >= upper_bound dB + * + * A_UINT32 snr_histogram[num_bins] + */ +} wmi_iface_ipi_stats; + + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_ipa_link_stats */ diff --git a/fw/wmi_version.h b/fw/wmi_version.h index f41fefdad7e6..b5767ce360dd 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -37,7 +37,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 1732 +#define __WMI_REVISION_ 1733 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work