diff --git a/fw/htt.h b/fw/htt.h index 56b8da3260c7..28e052e93557 100644 --- a/fw/htt.h +++ b/fw/htt.h @@ -748,6 +748,9 @@ typedef enum { HTT_STATS_RX_PDEV_BE_UL_OFDMA_USER_STATS_TAG = 156, /* htt_rx_pdev_be_ul_ofdma_user_stats_tlv */ HTT_STATS_PHY_TPC_STATS_TAG = 157, /* htt_phy_tpc_stats_tlv */ HTT_STATS_PDEV_PUNCTURE_STATS_TAG = 158, /* htt_pdev_puncture_stats_tlv */ + HTT_STATS_ML_PEER_DETAILS_TAG = 159, /* htt_ml_peer_details_tlv */ + HTT_STATS_ML_PEER_EXT_DETAILS_TAG = 160, /* htt_ml_peer_ext_details_tlv */ + HTT_STATS_ML_LINK_INFO_DETAILS_TAG = 161, /* htt_ml_link_info_tlv */ HTT_STATS_MAX_TAG, diff --git a/fw/htt_stats.h b/fw/htt_stats.h index 1f64d957fc15..3909f0da4e76 100644 --- a/fw/htt_stats.h +++ b/fw/htt_stats.h @@ -451,6 +451,18 @@ enum htt_dbg_ext_stats_type { */ HTT_DBG_PDEV_PUNCTURE_STATS = 46, + /* HTT_DBG_EXT_STATS_ML_PEERS_INFO + * PARAMS: + * - param 0: + * Bit 0 -> HTT_ML_PEER_DETAILS_TLV always enabled by default + * Bit 1 -> HTT_ML_PEER_EXT_DETAILS_TLV will be uploaded when + * this bit is set + * Bit 2 -> HTT_ML_LINK_INFO_TLV will be uploaded when this bit is set + * RESP MSG: + * - htt_ml_peer_stats_t + */ + HTT_DBG_EXT_STATS_ML_PEERS_INFO = 47, + /* keep this last */ HTT_DBG_NUM_EXT_STATS = 256, @@ -1342,6 +1354,20 @@ typedef struct _htt_tx_tid_stats_v1_tlv { * BIT [31 : 16] :- reserved */ A_UINT32 sendn_frms_allowed; + /* + * tid_ext_flags, tid_ext2_flags, and tid_flush_reason are opaque fields + * that cannot be interpreted by the host. + * They are only for off-line debug. + */ + A_UINT32 tid_ext_flags; + A_UINT32 tid_ext2_flags; + A_UINT32 tid_flush_reason; + A_UINT32 mlo_flush_tqm_status_pending_low; + A_UINT32 mlo_flush_tqm_status_pending_high; + A_UINT32 mlo_flush_partner_info_low; + A_UINT32 mlo_flush_partner_info_high; + A_UINT32 mlo_flush_initator_info_low; + A_UINT32 mlo_flush_initator_info_high; } htt_tx_tid_stats_v1_tlv; #define HTT_RX_TID_STATS_SW_PEER_ID_M 0x0000ffff @@ -1448,6 +1474,8 @@ typedef struct { #define HTT_PEER_DETAILS_ML_PEER_ID_VALID_S 0 #define HTT_PEER_DETAILS_ML_PEER_ID_M 0x00001ffe #define HTT_PEER_DETAILS_ML_PEER_ID_S 1 +#define HTT_PEER_DETAILS_LINK_IDX_M 0x001fe000 +#define HTT_PEER_DETAILS_LINK_IDX_S 13 #define HTT_PEER_DETAILS_SET(word, httsym, val) \ do { \ @@ -1475,7 +1503,8 @@ typedef struct { /* Dword 8 */ A_UINT32 ml_peer_id_valid : 1, /* [0:0] */ ml_peer_id : 12, /* [12:1] */ - rsvd : 19; /* [31:13] */ + link_idx : 8, /* [20:13] */ + rsvd : 11; /* [31:21] */ } htt_peer_details_tlv; typedef struct { @@ -7582,4 +7611,456 @@ typedef struct { A_UINT32 num_subbands_used_cnt[HTT_PUNCTURE_STATS_MAX_SUBBAND_COUNT]; } htt_pdev_puncture_stats_tlv; +#define HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_M 0x0000003F +#define HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_S 0 +#define HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_M 0x00000FC0 +#define HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_S 6 +#define HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_M 0x0FFFF000 +#define HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_S 12 + +#define HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_GET(_var) \ + (((_var) & HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_M) >> \ + HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_S) + +#define HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD, _val); \ + ((_var) &= ~(HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_EXT_DETAILS_PEER_ASSOC_IPC_RECVD_S)); \ + } while (0) + +#define HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_GET(_var) \ + (((_var) & HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_M) >> \ + HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_S) + +#define HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD, _val); \ + ((_var) &= ~(HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_EXT_DETAILS_SCHED_PEER_DELETE_RECVD_S)); \ + } while (0) + +#define HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_GET(_var) \ + (((_var) & HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_M) >> \ + HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_S) + +#define HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX, _val); \ + ((_var) &= ~(HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_EXT_DETAILS_MLD_AST_INDEX_S)); \ + } while (0) + +typedef struct { + htt_tlv_hdr_t tlv_hdr; + union { + struct { + A_UINT32 peer_assoc_ipc_recvd : 6, + sched_peer_delete_recvd : 6, + mld_ast_index : 16, + reserved : 4; + }; + A_UINT32 msg_dword_1; + }; +} htt_ml_peer_ext_details_tlv; + +#define HTT_ML_LINK_INFO_VALID_M 0x00000001 +#define HTT_ML_LINK_INFO_VALID_S 0 +#define HTT_ML_LINK_INFO_ACTIVE_M 0x00000002 +#define HTT_ML_LINK_INFO_ACTIVE_S 1 +#define HTT_ML_LINK_INFO_PRIMARY_M 0x00000004 +#define HTT_ML_LINK_INFO_PRIMARY_S 2 +#define HTT_ML_LINK_INFO_ASSOC_LINK_M 0x00000008 +#define HTT_ML_LINK_INFO_ASSOC_LINK_S 3 +#define HTT_ML_LINK_INFO_CHIP_ID_M 0x00000070 +#define HTT_ML_LINK_INFO_CHIP_ID_S 4 +#define HTT_ML_LINK_INFO_IEEE_LINK_ID_M 0x00007F80 +#define HTT_ML_LINK_INFO_IEEE_LINK_ID_S 7 +#define HTT_ML_LINK_INFO_HW_LINK_ID_M 0x00038000 +#define HTT_ML_LINK_INFO_HW_LINK_ID_S 15 +#define HTT_ML_LINK_INFO_LOGICAL_LINK_ID_M 0x000C0000 +#define HTT_ML_LINK_INFO_LOGICAL_LINK_ID_S 18 +#define HTT_ML_LINK_INFO_MASTER_LINK_M 0x00100000 +#define HTT_ML_LINK_INFO_MASTER_LINK_S 20 +#define HTT_ML_LINK_INFO_ANCHOR_LINK_M 0x00200000 +#define HTT_ML_LINK_INFO_ANCHOR_LINK_S 21 +#define HTT_ML_LINK_INFO_INITIALIZED_M 0x00400000 +#define HTT_ML_LINK_INFO_INITIALIZED_S 22 + +#define HTT_ML_LINK_INFO_SW_PEER_ID_M 0x0000ffff +#define HTT_ML_LINK_INFO_SW_PEER_ID_S 0 +#define HTT_ML_LINK_INFO_VDEV_ID_M 0x00ff0000 +#define HTT_ML_LINK_INFO_VDEV_ID_S 16 + +#define HTT_ML_LINK_INFO_VALID_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_VALID_M) >> \ + HTT_ML_LINK_INFO_VALID_S) + +#define HTT_ML_LINK_INFO_VALID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_VALID, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_VALID_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_VALID_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_ACTIVE_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_ACTIVE_M) >> \ + HTT_ML_LINK_INFO_ACTIVE_S) + +#define HTT_ML_LINK_INFO_ACTIVE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_ACTIVE, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_ACTIVE_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_ACTIVE_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_PRIMARY_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_PRIMARY_M) >> \ + HTT_ML_LINK_INFO_PRIMARY_S) + +#define HTT_ML_LINK_INFO_PRIMARY_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_PRIMARY, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_PRIMARY_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_PRIMARY_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_ASSOC_LINK_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_ASSOC_LINK_M) >> \ + HTT_ML_LINK_INFO_ASSOC_LINK_S) + +#define HTT_ML_LINK_INFO_ASSOC_LINK_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_ASSOC_LINK, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_ASSOC_LINK_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_ASSOC_LINK_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_CHIP_ID_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_CHIP_ID_M) >> \ + HTT_ML_LINK_INFO_CHIP_ID_S) + +#define HTT_ML_LINK_INFO_CHIP_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_CHIP_ID, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_CHIP_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_CHIP_ID_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_IEEE_LINK_ID_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_IEEE_LINK_ID_M) >> \ + HTT_ML_LINK_INFO_IEEE_LINK_ID_S) + +#define HTT_ML_LINK_INFO_IEEE_LINK_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_IEEE_LINK_ID, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_IEEE_LINK_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_IEEE_LINK_ID_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_HW_LINK_ID_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_HW_LINK_ID_M) >> \ + HTT_ML_LINK_INFO_HW_LINK_ID_S) + +#define HTT_ML_LINK_INFO_HW_LINK_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_HW_LINK_ID, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_HW_LINK_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_HW_LINK_ID_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_LOGICAL_LINK_ID_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_LOGICAL_LINK_ID_M) >> \ + HTT_ML_LINK_INFO_LOGICAL_LINK_ID_S) + +#define HTT_ML_LINK_INFO_LOGICAL_LINK_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_LOGICAL_LINK_ID, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_LOGICAL_LINK_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_LOGICAL_LINK_ID_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_MASTER_LINK_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_MASTER_LINK_M) >> \ + HTT_ML_LINK_INFO_MASTER_LINK_S) + +#define HTT_ML_LINK_INFO_MASTER_LINK_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_MASTER_LINK, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_MASTER_LINK_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_MASTER_LINK_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_ANCHOR_LINK_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_ANCHOR_LINK_M) >> \ + HTT_ML_LINK_INFO_ANCHOR_LINK_S) + +#define HTT_ML_LINK_INFO_ANCHOR_LINK_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_ANCHOR_LINK, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_ANCHOR_LINK_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_ANCHOR_LINK_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_INITIALIZED_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_INITIALIZED_M) >> \ + HTT_ML_LINK_INFO_INITIALIZED_S) + +#define HTT_ML_LINK_INFO_INITIALIZED_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_INITIALIZED, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_INITIALIZED_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_INITIALIZED_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_SW_PEER_ID_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_SW_PEER_ID_M) >> \ + HTT_ML_LINK_INFO_SW_PEER_ID_S) + +#define HTT_ML_LINK_INFO_SW_PEER_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_SW_PEER_ID, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_SW_PEER_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_SW_PEER_ID_S)); \ + } while (0) + +#define HTT_ML_LINK_INFO_VDEV_ID_GET(_var) \ + (((_var) & HTT_ML_LINK_INFO_VDEV_ID_M) >> \ + HTT_ML_LINK_INFO_VDEV_ID_S) + +#define HTT_ML_LINK_INFO_VDEV_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_LINK_INFO_VDEV_ID, _val); \ + ((_var) &= ~(HTT_ML_LINK_INFO_VDEV_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_LINK_INFO_VDEV_ID_S)); \ + } while (0) + +typedef struct { + htt_tlv_hdr_t tlv_hdr; + union { + struct { + A_UINT32 valid : 1, + active : 1, + primary : 1, + assoc_link : 1, + chip_id : 3, + ieee_link_id : 8, + hw_link_id : 3, + logical_link_id : 2, + master_link : 1, + anchor_link : 1, + initialized : 1, + reserved : 9; + }; + A_UINT32 msg_dword_1; + }; + + union { + struct { + A_UINT32 sw_peer_id : 16, + vdev_id : 8, + reserved1 : 8; + }; + A_UINT32 msg_dword_2; + }; + + A_UINT32 primary_tid_mask; +} htt_ml_link_info_tlv; + +#define HTT_ML_PEER_DETAILS_NUM_LINKS_M 0x00000003 +#define HTT_ML_PEER_DETAILS_NUM_LINKS_S 0 +#define HTT_ML_PEER_DETAILS_ML_PEER_ID_M 0x00003FFC +#define HTT_ML_PEER_DETAILS_ML_PEER_ID_S 2 +#define HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_M 0x0001C000 +#define HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_S 14 +#define HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_M 0x00060000 +#define HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_S 17 +#define HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_M 0x00380000 +#define HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_S 19 +#define HTT_ML_PEER_DETAILS_NON_STR_M 0x00400000 +#define HTT_ML_PEER_DETAILS_NON_STR_S 22 +#define HTT_ML_PEER_DETAILS_EMLSR_M 0x00800000 +#define HTT_ML_PEER_DETAILS_EMLSR_S 23 +#define HTT_ML_PEER_DETAILS_IS_STA_KO_M 0x01000000 +#define HTT_ML_PEER_DETAILS_IS_STA_KO_S 24 +#define HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_M 0x06000000 +#define HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_S 25 +#define HTT_ML_PEER_DETAILS_ALLOCATED_M 0x08000000 +#define HTT_ML_PEER_DETAILS_ALLOCATED_S 27 + +#define HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_M 0x000000ff +#define HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_S 0 + +#define HTT_ML_PEER_DETAILS_NUM_LINKS_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_NUM_LINKS_M) >> \ + HTT_ML_PEER_DETAILS_NUM_LINKS_S) + +#define HTT_ML_PEER_DETAILS_NUM_LINKS_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_NUM_LINKS, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_NUM_LINKS_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_NUM_LINKS_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_ML_PEER_ID_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_ML_PEER_ID_M) >> \ + HTT_ML_PEER_DETAILS_ML_PEER_ID_S) + +#define HTT_ML_PEER_DETAILS_ML_PEER_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_ML_PEER_ID, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_ML_PEER_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_ML_PEER_ID_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_M) >> \ + HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_S) + +#define HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_PRIMARY_LINK_IDX_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_M) >> \ + HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_S) + +#define HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_PRIMARY_CHIP_ID_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_M) >> \ + HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_S) + +#define HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_LINK_INIT_COUNT, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_LINK_INIT_COUNT_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_NON_STR_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_NON_STR_M) >> \ + HTT_ML_PEER_DETAILS_NON_STR_S) + +#define HTT_ML_PEER_DETAILS_NON_STR_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_NON_STR, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_NON_STR_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_NON_STR_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_EMLSR_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_EMLSR_M) >> \ + HTT_ML_PEER_DETAILS_EMLSR_S) + +#define HTT_ML_PEER_DETAILS_EMLSR_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_EMLSR, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_EMLSR_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_EMLSR_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_IS_STA_KO_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_IS_STA_KO_M) >> \ + HTT_ML_PEER_DETAILS_IS_STA_KO_S) + +#define HTT_ML_PEER_DETAILS_IS_STA_KO_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_IS_STA_KO, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_IS_STA_KO_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_IS_STA_KO_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_M) >> \ + HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_S) + +#define HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_NUM_LOCAL_LINKS_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_ALLOCATED_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_ALLOCATED_M) >> \ + HTT_ML_PEER_DETAILS_ALLOCATED_S) + +#define HTT_ML_PEER_DETAILS_ALLOCATED_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_ALLOCATED, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_ALLOCATED_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_ALLOCATED_S)); \ + } while (0) + +#define HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_GET(_var) \ + (((_var) & HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_M) >> \ + HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_S) + +#define HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP, _val); \ + ((_var) &= ~(HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_M)); \ + ((_var) |= ((_val) << HTT_ML_PEER_DETAILS_PARTICIPATING_CHIPS_BITMAP_S)); \ + } while (0) + +typedef struct { + htt_tlv_hdr_t tlv_hdr; + htt_mac_addr remote_mld_mac_addr; + union { + struct { + A_UINT32 num_links : 2, + ml_peer_id : 12, + primary_link_idx : 3, + primary_chip_id : 2, + link_init_count : 3, + non_str : 1, + emlsr : 1, + is_sta_ko : 1, + num_local_links : 2, + allocated : 1, + reserved : 4; + }; + A_UINT32 msg_dword_1; + }; + + union { + struct { + A_UINT32 participating_chips_bitmap : 8, + reserved1 : 24; + }; + A_UINT32 msg_dword_2; + }; + /* + * ml_peer_flags is an opaque field that cannot be interpreted by + * the host; it is only for off-line debug. + */ + A_UINT32 ml_peer_flags; +} htt_ml_peer_details_tlv; + +/* STATS_TYPE : HTT_DBG_EXT_STATS_ML_PEERS_INFO + * TLV_TAGS: + * - HTT_STATS_ML_PEER_DETAILS_TAG + * - HTT_STATS_ML_LINK_INFO_DETAILS_TAG + * - HTT_STATS_ML_PEER_EXT_DETAILS_TAG (multiple) + */ +/* NOTE: + * This structure is for documentation, and cannot be safely used directly. + * Instead, use the constituent TLV structures to fill/parse. + */ +typedef struct _htt_ml_peer_stats { + htt_ml_peer_details_tlv ml_peer_details; + htt_ml_peer_ext_details_tlv ml_peer_ext_details; + htt_ml_link_info_tlv ml_link_info[]; +} htt_ml_peer_stats_t; + + #endif /* __HTT_STATS_H__ */