Loading fw/htt.h +3 −0 Original line number Diff line number Diff line Loading @@ -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, Loading fw/htt_stats.h +482 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading Loading @@ -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 { \ Loading Loading @@ -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 { Loading Loading @@ -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__ */ Loading
fw/htt.h +3 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
fw/htt_stats.h +482 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading Loading @@ -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 { \ Loading Loading @@ -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 { Loading Loading @@ -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__ */