diff --git a/fw/htt.h b/fw/htt.h index b970ceb92c44..0d47067f68db 100644 --- a/fw/htt.h +++ b/fw/htt.h @@ -21907,6 +21907,102 @@ PREPACK struct htt_rx_peer_metadata_v1b { ((_var) |= ((_val) << HTT_RX_PEER_META_DATA_V1B_CHIP_ID_S)); \ } while (0) + +/* + * htt_rx_peer_metadata_v2 - HTT RX peer metadata version 2 + * + * |31 21|20 13|12|11 9|8 6| 5 |4 0| + * |------------+--------+--+-----+-----+-----+-----| + * | reserved |peer |Q | Log |VDEV | ML |Peer | + * | |session |D |Link | ID |Peer | ID | + * | |ID |R | ID | |Valid| | + * |------------+--------+--+-----+-----+-----+-----| + * Where: + * QDR = queue data refill + */ +PREPACK struct htt_rx_peer_metadata_v2 { + A_UINT32 + peer_id: 5, + ml_peer_valid: 1, + vdev_id: 3, + logical_link_id: 3, + qdata_refill: 1, + peer_session_id: 8, + reserved: 11; +} POSTPACK; + +#define HTT_RX_PEER_META_DATA_V2_PEER_ID_S 0 +#define HTT_RX_PEER_META_DATA_V2_PEER_ID_M 0x0000001f + +#define HTT_RX_PEER_META_DATA_V2_PEER_ID_GET(_var) \ + (((_var) & HTT_RX_PEER_META_DATA_V2_PEER_ID_M) >> \ + HTT_RX_PEER_META_DATA_V2_PEER_ID_S) +#define HTT_RX_PEER_META_DATA_V2_PEER_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_PEER_META_DATA_V2_PEER_ID, _val); \ + ((_var) |= ((_val) << HTT_RX_PEER_META_DATA_V2_PEER_ID_S)); \ + } while (0) + +#define HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID_S 5 +#define HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID_M 0x00000020 +#define HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID_GET(_var) \ + (((_var) & HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID_M) >> \ + HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID_S) +#define HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID, _val); \ + ((_var) |= ((_val) << HTT_RX_PEER_META_DATA_V2_ML_PEER_VALID_S)); \ + } while (0) + +#define HTT_RX_PEER_META_DATA_V2_VDEV_ID_S 6 +#define HTT_RX_PEER_META_DATA_V2_VDEV_ID_M 0x000001c0 + +#define HTT_RX_PEER_META_DATA_V2_VDEV_ID_GET(_var) \ + (((_var) & HTT_RX_PEER_META_DATA_V2_VDEV_ID_M) >> \ + HTT_RX_PEER_META_DATA_V2_VDEV_ID_S) +#define HTT_RX_PEER_META_DATA_V2_VDEV_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_PEER_META_DATA_V2_VDEV_ID, _val); \ + ((_var) |= ((_val) << HTT_RX_PEER_META_DATA_V2_VDEV_ID_S)); \ + } while (0) + +#define HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID_S 9 +#define HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID_M 0x00000e00 + +#define HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID_GET(_var) \ + (((_var) & HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID_M) >> \ + HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID_S) +#define HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID, _val); \ + ((_var) |= ((_val) << HTT_RX_PEER_META_DATA_V2_LOGICAL_LINK_ID_S)); \ + } while (0) + +#define HTT_RX_PEER_META_DATA_V2_QDATA_REFILL_S 12 +#define HTT_RX_PEER_META_DATA_V2_QDATA_REFILL_M 0x00001000 + +#define HTT_RX_PEER_META_DATA_V2_QDATA_REFILL_GET(_var) \ + (((_var) & HTT_RX_PEER_META_DATA_V2_QDATA_REFILL_M) >> \ + HTT_RX_PEER_META_DATA_V2_QDATA_REFILL_S) +#define HTT_RX_PEER_META_DATA_V2_QDATA_REFILL_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_PEER_META_DATA_V2_QDATA_REFILL, _val); \ + ((_var) |= ((_val) << HTT_RX_PEER_META_DATA_V2_QDATA_REFILL_S)); \ + } while (0) + +#define HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID_S 13 +#define HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID_M 0x001fe000 + +#define HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID_GET(_var) \ + (((_var) & HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID_M) >> \ + HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID_S) +#define HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID, _val); \ + ((_var) |= ((_val) << HTT_RX_PEER_META_DATA_V2_PEER_SESSION_ID_S)); \ + } while (0) + + /* generic variables for masks and shifts for various fields */ extern A_UINT32 HTT_RX_PEER_META_DATA_PEER_ID_S; extern A_UINT32 HTT_RX_PEER_META_DATA_PEER_ID_M; @@ -21939,6 +22035,9 @@ extern void (*HTT_RX_PEER_META_DATA_HW_LINK_ID_SET) (A_UINT32 *var, A_UINT32 val extern A_UINT32 (*HTT_RX_PEER_META_DATA_QDATA_REFILL_GET) (A_UINT32 var); extern void (*HTT_RX_PEER_META_DATA_QDATA_REFILL_SET) (A_UINT32 *var, A_UINT32 val); +extern A_UINT32 (*HTT_RX_PEER_META_DATA_PEER_SESSION_ID_GET) (A_UINT32 var); +extern void (*HTT_RX_PEER_META_DATA_PEER_SESSION_ID_SET) (A_UINT32 *var, A_UINT32 val); + /* * In some systems, the host SW wants to specify priorities between diff --git a/fw/htt_ppdu_stats.h b/fw/htt_ppdu_stats.h index be9e8f863c29..29f92c75c981 100644 --- a/fw/htt_ppdu_stats.h +++ b/fw/htt_ppdu_stats.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2026 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 @@ -1986,6 +1986,14 @@ typedef enum HTT_PPDU_STATS_RU_SIZE { HTT_PPDU_STATS_RU_996x4, } HTT_PPDU_STATS_RU_SIZE; +typedef enum HTT_PPDU_STATS_DRU_SIZE { + HTT_PPDU_STATS_DRU_26, + HTT_PPDU_STATS_DRU_52, + HTT_PPDU_STATS_DRU_106, + HTT_PPDU_STATS_DRU_242, + HTT_PPDU_STATS_DRU_484, +} HTT_PPDU_STATS_DRU_SIZE; + typedef struct { htt_tlv_hdr_t tlv_hdr; @@ -2023,6 +2031,7 @@ typedef struct { * Discriminant is field ru_format: * - ru_format = 0: ru_end, ru_start * - ru_format = 1: ru_index, ru_size + * - ru_format = 2: dru_index, dru_size, dru_sbw, dru_sbw_idx * - ru_format = other: reserved for future expansion * * ru_start and ru_end are RU 26 indices @@ -2055,10 +2064,15 @@ typedef struct { * * resp_ru_size is an HTT_PPDU_STATS_RU_SIZE, resp_ru_index * is a size specific index for the given ru_size. + * + * 'is_dru' field indicates if the current RU allocation + * is a distributed RU allocation or not. + * 'dru_sbw' is the spreading BW size of current dru_size. */ union { A_UINT32 resp_ru_start__ru_end; A_UINT32 resp_ru_size__ru_index; + A_UINT32 dru_size__dru_index__dru_sbw_idx__dru_sbw__is_dru; struct { A_UINT32 resp_ru_end: 16, resp_ru_start: 16; @@ -2067,6 +2081,14 @@ typedef struct { A_UINT32 resp_ru_index: 16, resp_ru_size: 16; }; + struct { + A_UINT32 is_dru: 1, + dru_sbw: 3, + dru_sbw_idx: 2, + dru_index: 16, + dru_size: 4, + reserved5: 6; + }; }; /* BIT [ 0 : 0 ] :- resp_type_valid diff --git a/fw/wmi_services.h b/fw/wmi_services.h index 59d421607c6c..68af4910efa1 100644 --- a/fw/wmi_services.h +++ b/fw/wmi_services.h @@ -757,6 +757,7 @@ typedef enum { WMI_SERVICE_SMD_SUPPORT_UL_FORWARD = 491, /* Service caps related to SMD Roaming - end */ + WMI_SERVICE_PEER_METADATA_V2_SUPPORT = 492, /* Support rx peer meta data v2 */ WMI_MAX_EXT2_SERVICE diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 6848ea2ee781..a1a69af33bbd 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -3758,6 +3758,10 @@ typedef struct { #define WMI_TARGET_CAP_TOTAL_ML_LINKS_NUM_SET(target_cap_flags, value) \ WMI_SET_BITS(target_cap_flags, 23, 3, value) +#define WMI_TARGET_CAP_FLAGS_RX_PEER_METADATA_VERSION_EXTENSION_GET(target_cap_flags) \ + WMI_GET_BITS(target_cap_flags, 26, 3) +#define WMI_TARGET_CAP_FLAGS_RX_PEER_METADATA_VERSION_EXTENSION_SET(target_cap_flags, value) \ + WMI_SET_BITS(target_cap_flags, 26, 3, value) /* * wmi_htt_msdu_idx_to_htt_msdu_qtype GET/SET APIs @@ -3976,7 +3980,8 @@ typedef struct { * Bits 19:17 - max number of ML STA BSS supported, range [0-7] * Bits 22:20 - max number of ML SAP BSS supported, range [0-7] * Bits 25:23 - total number of ML links supported, range [0-7] - * Bits 31:26 - Reserved + * Bits 28:27 - extended rx peer metadata version capabilities + * Bits 31:29 - Reserved */ A_UINT32 target_cap_flags; @@ -34035,16 +34040,28 @@ typedef struct { A_UINT32 vdev_id; } wmi_vdev_unified_disconnect_cmd_fixed_param; +typedef enum { + WMI_VDEV_UNIFIED_CONNECT_EVENT_SUCCESS, + WMI_VDEV_UNIFIED_CONNECT_EVENT_FAILURE, +} WMI_VDEV_UNIFIED_CONNECT_EVENT_STATUS; + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_vdev_unified_connect_event_fixed_param */ /** unique id identifying the VDEV, generated by the caller */ A_UINT32 vdev_id; + A_UINT32 status; /* WMI_VDEV_UNIFIED_CONNECT_EVENT_STATUS */ } wmi_vdev_unified_connect_event_fixed_param; +typedef enum { + WMI_VDEV_UNIFIED_DISCONNECT_EVENT_SUCCESS, + WMI_VDEV_UNIFIED_DISCONNECT_EVENT_FAILURE, +} WMI_VDEV_UNIFIED_DISCONNECT_EVENT_STATUS; + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_vdev_unified_disconnect_event_fixed_param */ /** unique id identifying the VDEV, generated by the caller */ A_UINT32 vdev_id; + A_UINT32 status; /* WMI_VDEV_UNIFIED_DISCONNECT_EVENT_STATUS */ } wmi_vdev_unified_disconnect_event_fixed_param; diff --git a/fw/wmi_version.h b/fw/wmi_version.h index ccc436207f40..ded5778bec4e 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_ 1708 +#define __WMI_REVISION_ 1710 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work