diff --git a/fw/htt.h b/fw/htt.h index 919575802bc4..16e6134a8e61 100644 --- a/fw/htt.h +++ b/fw/htt.h @@ -904,6 +904,7 @@ typedef enum { HTT_STATS_ANI_CRC_PASS_TAG = 243, /* htt_stats_ani_crc_pass_tlv */ HTT_STATS_ANI_PER_BLK_ERR_TAG = 244, /* htt_stats_ani_per_blk_err_tlv */ HTT_STATS_ANI_OTA_ERR_TAG = 245, /* htt_stats_ani_ota_err_tlv */ + HTT_STATS_RESET_HISTORY_TAG = 246, /* htt_stats_reset_history_tlv */ HTT_STATS_MAX_TAG, } htt_stats_tlv_tag_t; diff --git a/fw/htt_stats.h b/fw/htt_stats.h index 69973598075d..a5147b8e829b 100644 --- a/fw/htt_stats.h +++ b/fw/htt_stats.h @@ -890,6 +890,14 @@ enum htt_dbg_ext_stats_type { * */ HTT_DBG_EXT_STATS_ANI_HISTOGRAM = 81, + /** HTT_DBG_EXT_STATS_RESET_HISTORY + * PARAMS: + * - No Params + * RESP MSG: + * - htt_stats_reset_history_tlv + */ + HTT_DBG_EXT_STATS_RESET_HISTORY = 82, + /* keep this last */ HTT_DBG_NUM_EXT_STATS = 256, @@ -15691,4 +15699,90 @@ typedef struct { } htt_stats_pdev_sam_tlv; +#define HTT_STATS_RESET_HISTORY_MAX_ENTRIES 10 + +/** + * @brief TLV structure for wifistats 82 (reset history) + * + * This structure holds the last 10 reset history entries. + * The entries are copied from the firmware's internal circular buffer. + */ +typedef struct { + htt_tlv_hdr_t tlv_hdr; + /** + * @brief An array of structures, each holding the details of a single + * reset event. The entries are ordered chronologically from + * oldest to newest. + */ + struct { + A_UINT32 timestamp_ms; + /* reset_flags is only for debugging, not for host interpretation */ + A_UINT32 reset_flags; + /* reset_cause is only for debugging, not for host interpretation */ + A_UINT32 reset_cause; + /* reset_reason is only for debugging, not for host interpretation */ + A_UINT32 reset_reason; + A_UINT32 phy_mode; + union { + A_UINT32 channel_freq; + struct { + A_UINT32 + mhz: 16, + band_center_freq1:16; + }; + }; + union { + A_UINT32 channel_info; + struct { + A_UINT32 + flags: 16, /* only for debug, not for host interpret */ + phy_id: 8, + swprofile: 8; /* only for debug, not for host interpret */ + }; + }; + union { + A_UINT32 home_channel_info; + struct { + A_UINT32 + is_home_chan: 1, + reserved: 31; + }; + }; + A_UINT32 reserved_dwords[2]; /* reserved for future use */ + } reset_history[HTT_STATS_RESET_HISTORY_MAX_ENTRIES]; + A_UINT32 idx; /** Current write index of the circular buffer */ + A_UINT32 count; /** Total number of resets captured (up to 10) */ +} htt_stats_reset_history_tlv; + +#define HTT_STATS_RESET_HISTORY_MHZ_GET(word) \ + ((word) & 0x0000ffff) +#define HTT_STATS_RESET_HISTORY_MHZ_SET(word, value) \ + ((word) |= ((value) & 0x0000ffff)) + +#define HTT_STATS_RESET_HISTORY_BAND_CENTER_FREQ1_GET(word) \ + (((word) & 0xffff0000) >> 16) +#define HTT_STATS_RESET_HISTORY_BAND_CENTER_FREQ1_SET(word, value) \ + ((word) |= (((value) << 16) & 0xffff0000)) + +#define HTT_STATS_RESET_HISTORY_FLAGS_GET(word) \ + ((word) & 0x0000ffff) +#define HTT_STATS_RESET_HISTORY_FLAGS_SET(word, value) \ + ((word) |= ((value) & 0x0000ffff)) + +#define HTT_STATS_RESET_HISTORY_PHY_ID_GET(word) \ + (((word) & 0x00ff0000) >> 16) +#define HTT_STATS_RESET_HISTORY_PHY_ID_SET(word, value) \ + ((word) |= (((value) << 16) & 0x00ff0000)) + +#define HTT_STATS_RESET_HISTORY_SWPROFILE_GET(word) \ + (((word) & 0xff000000) >> 24) +#define HTT_STATS_RESET_HISTORY_SWPROFILE_SET(word, value) \ + ((word) |= (((value) << 24) & 0xff000000)) + +#define HTT_STATS_RESET_HISTORY_IS_HOME_CHAN_GET(word) \ + (((word) & 0x00000001) >> 0) +#define HTT_STATS_RESET_HISTORY_IS_HOME_CHAN_SET(word, value) \ + ((word) |= (((value) << 0) & 0x00000001)) + + #endif /* __HTT_STATS_H__ */