Browse Source

fw-api: CL 21541123 - update fw common interface files

Change-Id: I019d5fd6f75f8d1817be69ab9dc0a033440c8456
HTT: add T2H SOFT_UMAC_TX_COMPL_IND and RX_DATA_IND msg defs
CRs-Fixed: 2262693
spuligil 2 years ago
parent
commit
c8049c310b
1 changed files with 1140 additions and 1 deletions
  1. 1140 1
      fw/htt.h

+ 1140 - 1
fw/htt.h

@@ -243,9 +243,10 @@
  *       HTT_T2H_MSG_TYPE_RX_CCE_SUPER_RULE_SETUP_DONE msg defs.
  * 3.116 Add HTT_TX_MONITOR_CFG_WORD_MASK_COMPACTION_ENABLE flag.
  * 3.117 Add HTT_T2H_CODEL_MSDUQ_LATENCIES_ARRAY_CFG_IND def.
+ * 3.118 Add HTT_T2H_MSG_TYPE_RX_DATA_IND and _SOFT_UMAC_TX_COMPL_IND defs.
  */
 #define HTT_CURRENT_VERSION_MAJOR 3
-#define HTT_CURRENT_VERSION_MINOR 117
+#define HTT_CURRENT_VERSION_MINOR 118
 
 #define HTT_NUM_TX_FRAG_DESC  1024
 
@@ -10555,6 +10556,8 @@ enum htt_t2h_msg_type {
     HTT_T2H_MSG_TYPE_RX_DELBA_EXTN                 = 0x32,
     HTT_T2H_MSG_TYPE_RX_CCE_SUPER_RULE_SETUP_DONE  = 0x33,
     HTT_T2H_CODEL_MSDUQ_LATENCIES_ARRAY_CFG_IND    = 0x34,
+    HTT_T2H_MSG_TYPE_RX_DATA_IND                   = 0x35,
+    HTT_T2H_MSG_TYPE_SOFT_UMAC_TX_COMPL_IND        = 0x36,
 
 
     HTT_T2H_MSG_TYPE_TEST,
@@ -14861,6 +14864,744 @@ PREPACK struct htt_tx_compl_ind_append_tx_tsf64 {
     (((word) & HTT_FW_TX_DATA_HDR_SEQNO_M) >> HTT_FW_TX_DATA_HDR_SEQNO_S)
 
 
+/**
+ * @brief target -> host software UMAC TX completion indication message
+ *
+ * MSG_TYPE => HTT_T2H_MSG_TYPE_SOFT_UMAC_TX_COMPL_IND
+ *
+ * @details
+ * The following diagram shows the format of the soft UMAC TX completion
+ * indication sent from the target to the host
+ *
+ *       |31 30|29|28|27|26         20|19 17|16|15  12|11|10| 9|8|7   4|3 1|0|
+ *       |-------------------------------------+----------------+------------|
+ * hdr:  |               rsvd                  |   msdu_cnt     |  msg_type  |
+ * pyld: |===================================================================|
+ * MSDU 0|                         buf addr low (bits 31:0)                  |
+ *       |-----------------------------------------------+------+------------|
+ *       |                     SW buffer cookie          |  RS  | buf addr hi|
+ *       |--------+--+--+-------------+--------+---------+------+------------|
+ *       |  rsvd0 | M| V|   tx count  |   TID  |         SW peer ID          |
+ *       |--------+--+--+-------------+--------+----------------------+------|
+ *       | frametype |                 TQM status number              | RELR |
+ *       |-----+-----+-----------------------------------+--+-+-+-----+------|
+ *       |rsvd1|            buffer timestamp             | A|L|F|  ACK RSSI  |
+ *       |-----+--+-------------------------+--+------+-----+--+-+-----+---+-|
+ *       |  rsvd2 |       tones in RU       |OF|tx MCS|txSGI|LC|S|PKTYP|BW |I|
+ *       |--------+-------------------------+--+------+-----+--+-+-----+---+-|
+ *       |                         PPDU transmission TSF                     |
+ *       |-------------------------------------------------------------------|
+ *       |                                rsvd3                              |
+ *       |===================================================================|
+ * MSDU 1|                         buf addr low (bits 31:0)                  |
+ *       :                                ...                                :
+ *       |                                rsvd3                              |
+ *       |===================================================================|
+ *  etc.
+ *
+ * Where:
+ *     RS = release source
+ *     V = valid
+ *     M = multicast
+ *     RELR = release reason
+ *     F = first MSDU
+ *     L = last MSDU
+ *     A = MSDU is part of A-MSDU
+ *     I = rate info valid
+ *     PKTYP = packet type
+ *     S = STBC
+ *     LC = LDPC
+ *     OF = OFDMA transmission
+ */
+typedef enum {
+    /* 0 (REASON_FRAME_ACKED):
+     * Corresponds to tqm_release_reason = <enum 0 tqm_rr_frame_acked>;
+     * frame is removed because an ACK of BA for it was received.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_FRAME_ACKED,
+
+    /* 1 (REASON_REMOVE_CMD_FW):
+     * Corresponds to tqm_release_reason = <enum 1 tqm_rr_rem_cmd_rem>;
+     * frame is removed because a remove command of type "Remove_mpdus"
+     * initiated by SW.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_FW,
+
+    /* 2 (REASON_REMOVE_CMD_TX):
+     * Corresponds to tqm_release_reason = <enum 2 tqm_rr_rem_cmd_tx>;
+     * frame is removed because a remove command of type
+     * "Remove_transmitted_mpdus" initiated by SW.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_TX,
+
+    /* 3 (REASON_REMOVE_CMD_NOTX):
+     * Corresponds to tqm_release_reason = <enum 3 tqm_rr_rem_cmd_notx>;
+     * frame is removed because a remove command of type
+     * "Remove_untransmitted_mpdus" initiated by SW.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_NOTX,
+
+    /* 4 (REASON_REMOVE_CMD_AGED):
+     * Corresponds to tqm_release_reason = <enum 4 tqm_rr_rem_cmd_aged>;
+     * frame is removed because a remove command of type "Remove_aged_mpdus"
+     * or "Remove_aged_msdus" initiated by SW.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_AGED,
+
+    /* 5 (RELEASE_FW_REASON1):
+     * Corresponds to tqm_release_reason = <enum 5 tqm_fw_reason1>;
+     * frame is removed because a remove command where fw indicated that
+     * remove reason is fw_reason1.
+     */
+    HTT_TX_MSDU_RELEASE_FW_REASON1,
+
+    /* 6 (RELEASE_FW_REASON2):
+     * Corresponds to tqm_release_reason = <enum 6 tqm_fw_reason2>;
+     * frame is removed because a remove command where fw indicated that
+     * remove reason is fw_reason1.
+     */
+    HTT_TX_MSDU_RELEASE_FW_REASON2,
+
+    /* 7 (RELEASE_FW_REASON3):
+     * Corresponds to tqm_release_reason = <enum 7 tqm_fw_reason3>;
+     * frame is removed because a remove command where fw indicated that
+     * remove reason is fw_reason1.
+     */
+    HTT_TX_MSDU_RELEASE_FW_REASON3,
+
+    /* 8 (REASON_REMOVE_CMD_DISABLEQ):
+     * Corresponds to tqm_release_reason = <enum 8 tqm_rr_rem_cmd_disable_queue>
+     * frame is removed because a remove command of type
+     * "remove_mpdus_and_disable_queue" or "remove_msdus_and_disable_flow"
+     * initiated by SW.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_DISABLEQ,
+
+    /* 9 (REASON_DROP_MISC):
+     * Corresponds to sw_release_reason = Packet dropped by FW due to
+     * any discard reason that is not categorized as MSDU TTL expired.
+     * Examples: TXDE ENQ layer dropped the packet due to peer delete,
+     * tid delete, no resource credit available.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_DROP_MISC,
+
+    /* 10 (REASON_DROP_TTL):
+     * Corresponds to sw_release_reason = Packet dropped by FW due to
+     * discard reason that frame is not transmitted due to MSDU TTL expired.
+     */
+    HTT_TX_MSDU_RELEASE_REASON_DROP_TTL,
+
+    /* 11 - available for use */
+    /* 12 - available for use */
+    /* 13 - available for use */
+    /* 14 - available for use */
+    /* 15 - available for use */
+
+    HTT_TX_MSDU_RELEASE_REASON_MAX = 16
+} htt_t2h_tx_msdu_release_reason_e;
+
+typedef enum {
+    /* 0 (RELEASE_SOURCE_FW):
+     * MSDU released by FW even before the frame was queued to TQM-L HW.
+     */
+    HTT_TX_MSDU_RELEASE_SOURCE_FW,
+
+    /* 1 (RELEASE_SOURCE_TQM_LITE):
+     * MSDU released by TQM-L HW.
+     */
+    HTT_TX_MSDU_RELEASE_SOURCE_TQM_LITE,
+
+    HTT_TX_MSDU_RELEASE_SOURCE_MAX = 8
+} htt_t2h_tx_msdu_release_source_e;
+
+struct htt_t2h_tx_buffer_addr_info { /* 2 words */
+    A_UINT32 buffer_addr_31_0  : 32; /* [31:0] */
+    A_UINT32 buffer_addr_39_32 :  8, /*  [7:0] */
+             /* release_source:
+              * holds a htt_t2h_tx_msdu_release_source_e enum value
+              */
+             release_source    :  3, /* [10:8] */
+             sw_buffer_cookie  : 21; /* [31:11] */
+    /* NOTE:
+     * To preserve backwards compatibility,
+     * no new fields can be added in this struct.
+     */
+};
+
+/* member definitions of htt_t2h_tx_buffer_addr_info */
+
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0_M       0xFFFFFFFF
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0_S       0
+
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0, value);              \
+        (word) |= (value)  << HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0_S;                \
+    } while (0)
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0_GET(word) \
+    (((word) & HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0_M) >> HTT_TX_BUFFER_ADDR_INFO_ADDR_31_0_S)
+
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32_M       0x000000FF
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32_S       0
+
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32, value);              \
+        (word) |= (value)  << HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32_S;                \
+    } while (0)
+#define HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32_GET(word) \
+    (((word) & HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32_M) >> HTT_TX_BUFFER_ADDR_INFO_ADDR_39_32_S)
+
+#define HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_M       0x00000700
+#define HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_S       8
+
+#define HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE, value);              \
+        (word) |= (value)  << HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_S;                \
+    } while (0)
+#define HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_GET(word) \
+    (((word) & HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_M) >> HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_S)
+
+#define HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_M       0xFFFFF800
+#define HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_S       11
+
+#define HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE, value);              \
+        (word) |= (value)  << HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_S;                \
+    } while (0)
+#define HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_GET(word) \
+    (((word) & HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_M) >> HTT_TX_BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_S)
+
+struct htt_t2h_tx_rate_stats_info { /* 2 words */
+    /* word 0 */
+    A_UINT32
+        /* tx_rate_stats_info_valid:
+         * Indicates if the tx rate stats below are valid.
+         */
+        tx_rate_stats_info_valid :  1, /* [0] */
+        /* transmit_bw:
+         * Same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Indicates the BW of the upcoming transmission that shall likely
+         * start in about 3 -4 us on the medium:
+         *   <enum 0 transmit_bw_20_MHz>
+         *   <enum 1 transmit_bw_40_MHz>
+         *   <enum 2 transmit_bw_80_MHz>
+         *   <enum 3 transmit_bw_160_MHz>
+         *   <enum 4 transmit_bw_320_MHz>
+         */
+        transmit_bw              :  3, /* [3:1] */
+        /* transmit_pkt_type:
+         * same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Field filled in by PDG.
+         * Not valid when in SW transmit mode
+         * The packet type
+         * <enum_type PKT_TYPE_ENUM>
+         * Type:   enum Definition  Name:   PKT_TYPE_ENUM
+         * enum number enum name   Description
+         * ------------------------------------
+         * 0           dot11a      802.11a PPDU type
+         * 1           dot11b      802.11b PPDU type
+         * 2           dot11n_mm   802.11n Mixed Mode PPDU type
+         * 3           dot11ac     802.11ac PPDU type
+         * 4           dot11ax     802.11ax PPDU type
+         * 5           dot11ba     802.11ba (WUR) PPDU type
+         * 6           dot11be     802.11be PPDU type
+         * 7           dot11az     802.11az (ranging) PPDU type
+         */
+        transmit_pkt_type        :  4, /* [7:4] */
+        /* transmit_stbc:
+         * Same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Field filled in by PDG.
+         * Not valid when in SW transmit mode
+         * When set, STBC transmission rate was used.
+         */
+        transmit_stbc            :  1, /* [8] */
+        /* transmit_ldpc:
+         * Same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Field filled in by PDG.
+         * Not valid when in SW transmit mode
+         * When set, use LDPC transmission rates
+         */
+        transmit_ldpc            :  1, /* [9] */
+        /* transmit_sgi:
+         * Same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Field filled in by PDG.
+         * Not valid when in SW transmit mode
+         * <enum 0     0_8_us_sgi > Legacy normal GI. Can also be used for HE
+         * <enum 1     0_4_us_sgi > Legacy short GI. Can also be used for HE
+         * <enum 2     1_6_us_sgi > HE related GI
+         * <enum 3     3_2_us_sgi > HE related GI
+         * <legal 0 - 3>
+         */
+        transmit_sgi             :  2, /* [11:10] */
+        /* transmit_mcs:
+         * Same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Field filled in by PDG.
+         * Not valid when in SW transmit mode
+         *
+         *  For details, refer to  MCS_TYPE description
+         *  <legal all>
+         *  Pkt_type    Related definition of MCS_TYPE
+         *  dot11b  This field is the rate:
+         *      0: CCK 11 Mbps Long
+         *      1: CCK 5.5 Mbps Long
+         *      2: CCK 2 Mbps Long
+         *      3: CCK 1 Mbps Long
+         *      4: CCK 11 Mbps Short
+         *      5: CCK 5.5 Mbps Short
+         *      6: CCK 2 Mbps Short
+         *  NOTE: The numbering here is NOT the same as the as MAC gives
+         *        in the "rate" field in the SIG given to the PHY.
+         *        The MAC will do an internal translation.
+         *
+         *  Dot11a  This field is the rate:
+         *      0: OFDM 48 Mbps
+         *      1: OFDM 24 Mbps
+         *      2: OFDM 12 Mbps
+         *      3: OFDM 6 Mbps
+         *      4: OFDM 54 Mbps
+         *      5: OFDM 36 Mbps
+         *      6: OFDM 18 Mbps
+         *      7: OFDM 9 Mbps
+         *  NOTE: The numbering here is NOT the same as the as MAC gives
+         *        in the "rate" field in the SIG given to the PHY.
+         *        The MAC will do an internal translation.
+         *
+         *  Dot11n_mm (mixed mode)  This field represends the MCS.
+         *      0: HT MCS 0 (BPSK 1/2)
+         *      1: HT MCS 1 (QPSK 1/2)
+         *      2: HT MCS 2 (QPSK 3/4)
+         *      3: HT MCS 3 (16-QAM 1/2)
+         *      4: HT MCS 4 (16-QAM 3/4)
+         *      5: HT MCS 5 (64-QAM 2/3)
+         *      6: HT MCS 6 (64-QAM 3/4)
+         *      7: HT MCS 7 (64-QAM 5/6)
+         *  NOTE: To get higher MCS's use the nss field to indicate the
+         *        number of spatial streams.
+         *
+         *  Dot11ac This field represends the MCS.
+         *      0: VHT MCS 0 (BPSK 1/2)
+         *      1: VHT MCS 1 (QPSK 1/2)
+         *      2: VHT MCS 2 (QPSK 3/4)
+         *      3: VHT MCS 3 (16-QAM 1/2)
+         *      4: VHT MCS 4 (16-QAM 3/4)
+         *      5: VHT MCS 5 (64-QAM 2/3)
+         *      6: VHT MCS 6 (64-QAM 3/4)
+         *      7: VHT MCS 7 (64-QAM 5/6)
+         *      8: VHT MCS 8 (256-QAM 3/4)
+         *      9: VHT MCS 9 (256-QAM 5/6)
+         *      10: VHT MCS 10 (1024-QAM 3/4)
+         *      11: VHT MCS 11 (1024-QAM 5/6)
+         *  NOTE: There are several illegal VHT rates due to fractional
+         *        number of bits per symbol.
+         *        Below are the illegal rates for 4 streams and lower:
+         *            20 MHz, 1 stream, MCS 9
+         *            20 MHz, 2 stream, MCS 9
+         *            20 MHz, 4 stream, MCS 9
+         *            80 MHz, 3 stream, MCS 6
+         *            160 MHz, 3 stream, MCS 9 (Unsupported)
+         *            160 MHz, 4 stream, MCS 7 (Unsupported)
+         *
+         *  dot11ax This field represends the MCS.
+         *      0: HE MCS 0 (BPSK 1/2)
+         *      1: HE MCS 1 (QPSK 1/2)
+         *      2: HE MCS 2 (QPSK 3/4)
+         *      3: HE MCS 3 (16-QAM 1/2)
+         *      4: HE MCS 4 (16-QAM 3/4)
+         *      5: HE MCS 5 (64-QAM 2/3)
+         *      6: HE MCS 6 (64-QAM 3/4)
+         *      7: HE MCS 7 (64-QAM 5/6)
+         *      8: HE MCS 8 (256-QAM 3/4)
+         *      9: HE MCS 9 (256-QAM 5/6)
+         *      10: HE MCS 10 (1024-QAM 3/4)
+         *      11: HE MCS 11 (1024-QAM 5/6)
+         *      12: HE MCS 12 (4096-QAM 3/4)
+         *      13: HE MCS 13 (4096-QAM 5/6)
+         *
+         *  dot11ba This field is the rate:
+         *      0: LDR
+         *      1: HDR
+         *      2: Q2Q proprietary rate
+         */
+        transmit_mcs             :  4, /* [15:12] */
+        /* ofdma_transmission:
+         * Same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Field filled in by PDG.
+         * Set when the transmission was an OFDMA transmission (DL or UL).
+         * <legal all>
+         */
+        ofdma_transmission       :  1, /* [16] */
+        /* tones_in_ru:
+         * Same as TX_RATE_STATS_INFO. Transmit_BW populated by MAC HW.
+         * Field filled in by PDG.
+         * Not valid when in SW transmit mode
+         * The number of tones in the RU used.
+         * <legal all>
+         */
+        tones_in_ru              : 12, /* [28:17] */
+        rsvd2                    :  3; /* [31:29] */
+
+    /* word 1 */
+    /* ppdu_transmission_tsf:
+     * Based on a HWSCH configuration register setting,
+     * this field either contains:
+     *     Lower 32 bits of the TSF, snapshot of this value when transmission
+     *     of the PPDU containing the frame finished.
+     * OR
+     *     Lower 32 bits of the TSF, snapshot of this value when transmission
+     *     of the PPDU containing the frame started.
+     * <legal all>
+     */
+    A_UINT32 ppdu_transmission_tsf;
+
+    /* NOTE:
+     * To preserve backwards compatibility,
+     * no new fields can be added in this struct.
+     */
+};
+
+/* member definitions of htt_t2h_tx_rate_stats_info */
+
+#define HTT_TX_RATE_STATS_INFO_VALID_M                  0x00000001
+#define HTT_TX_RATE_STATS_INFO_VALID_S                  0
+
+#define HTT_TX_RATE_STATS_INFO_VALID_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_VALID, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_VALID_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_VALID_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_VALID_M) >> HTT_TX_RATE_STATS_INFO_VALID_S)
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_M            0x0000000E
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_S            1
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_TRANSMIT_BW, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_M) >> HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_S)
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_M      0x000000F0
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_S      4
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_M) >> HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_S)
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_M          0x00000100
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_S          8
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_M) >> HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_S)
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_M          0x00000200
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_S          9
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_M) >> HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_S)
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_M           0x00000C00
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_S           10
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_M) >> HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_S)
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_M           0x0000F000
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_S           12
+
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_M) >> HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_S)
+
+#define HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_M     0x00010000
+#define HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_S     16
+
+#define HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_M) >> HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_S)
+
+#define HTT_TX_RATE_STATS_INFO_TONES_IN_RU_M            0x1FFE0000
+#define HTT_TX_RATE_STATS_INFO_TONES_IN_RU_S            17
+
+#define HTT_TX_RATE_STATS_INFO_TONES_IN_RU_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_TONES_IN_RU, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_TONES_IN_RU_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_TONES_IN_RU_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_TONES_IN_RU_M) >> HTT_TX_RATE_STATS_INFO_TONES_IN_RU_S)
+
+#define HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_M  0xFFFFFFFF
+#define HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_S  0
+
+#define HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF, value);              \
+        (word) |= (value)  << HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_S;                \
+    } while (0)
+#define HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_GET(word) \
+    (((word) & HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_M) >> HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_S)
+
+struct htt_t2h_tx_msdu_info { /* 8 words */
+    /* words 0 + 1 */
+    struct htt_t2h_tx_buffer_addr_info addr_info;
+
+    /* word 2 */
+    A_UINT32
+        sw_peer_id   : 16,
+        tid          :  4,
+        transmit_cnt :  7,
+        valid        :  1,
+        mcast        :  1,
+        rsvd0        :  3;
+
+    /* word 3 */
+    A_UINT32
+        release_reason     :  4, /* Refer to htt_t2h_tx_msdu_release_reason_e */
+        tqm_status_number  : 24,
+        frame_type         :  4; /* holds htt_tx_wbm_status_frame_type value */
+
+    /* word 4 */
+    A_UINT32
+        /* ack_frame_rssi:
+         * If this frame is removed as the result of the
+         * reception of an ACK or BA, this field indicates
+         * the RSSI of the received ACK or BA frame.
+         * When the frame is removed as result of a direct
+         * remove command from the SW,  this field is set
+         * to 0x0 (which is never a valid value when real
+         * RSSI is available).
+         * Units: dB w.r.t noise floor
+         */
+        ack_frame_rssi     :  8,
+        first_msdu         :  1,
+        last_msdu          :  1,
+        msdu_part_of_amsdu :  1,
+        buffer_timestamp   : 19, /* units = TU = 1024 microseconds */
+        rsvd1              :  2;
+
+    /* words 5 + 6 */
+    struct htt_t2h_tx_rate_stats_info tx_rate_stats;
+
+    /* word 7 */
+    /* rsvd3:
+     * backup reserved field to add new parameters if [rsvd0, rsvd1, rsvd2]
+     * is not sufficient
+     */
+    A_UINT32 rsvd3;
+
+    /* NOTE:
+     * To preserve backwards compatibility,
+     * no new fields can be added in this struct.
+     */
+};
+
+/* member definitions of htt_t2h_tx_msdu_info */
+
+#define HTT_TX_MSDU_INFO_SW_PEER_ID_M                   0x0000FFFF
+#define HTT_TX_MSDU_INFO_SW_PEER_ID_S                   0
+
+#define HTT_TX_MSDU_INFO_SW_PEER_ID_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_SW_PEER_ID, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_SW_PEER_ID_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_SW_PEER_ID_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_SW_PEER_ID_M) >> HTT_TX_MSDU_INFO_SW_PEER_ID_S)
+
+#define HTT_TX_MSDU_INFO_TID_M                          0x000F0000
+#define HTT_TX_MSDU_INFO_TID_S                          16
+
+#define HTT_TX_MSDU_INFO_TID_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_TID, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_TID_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_TID_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_TID_M) >> HTT_TX_MSDU_INFO_TID_S)
+
+#define HTT_TX_MSDU_INFO_TRANSMIT_CNT_M                 0x07F00000
+#define HTT_TX_MSDU_INFO_TRANSMIT_CNT_S                 20
+
+#define HTT_TX_MSDU_INFO_TRANSMIT_CNT_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_TRANSMIT_CNT, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_TRANSMIT_CNT_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_TRANSMIT_CNT_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_TRANSMIT_CNT_M) >> HTT_TX_MSDU_INFO_TRANSMIT_CNT_S)
+
+#define HTT_TX_MSDU_INFO_VALID_M                        0x08000000
+#define HTT_TX_MSDU_INFO_VALID_S                        27
+
+#define HTT_TX_MSDU_INFO_VALID_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_VALID, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_VALID_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_VALID_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_VALID_M) >> HTT_TX_MSDU_INFO_VALID_S)
+
+#define HTT_TX_MSDU_INFO_MCAST_M                        0x10000000
+#define HTT_TX_MSDU_INFO_MCAST_S                        28
+
+#define HTT_TX_MSDU_INFO_MCAST_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_MCAST, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_MCAST_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_MCAST_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_MCAST_M) >> HTT_TX_MSDU_INFO_MCAST_S)
+
+#define HTT_TX_MSDU_INFO_RELEASE_REASON_M               0x0000000F
+#define HTT_TX_MSDU_INFO_RELEASE_REASON_S               0
+
+#define HTT_TX_MSDU_INFO_RELEASE_REASON_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_RELEASE_REASON, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_RELEASE_REASON_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_RELEASE_REASON_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_RELEASE_REASON_M) >> HTT_TX_MSDU_INFO_RELEASE_REASON_S)
+
+#define HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_M            0x0FFFFFF0
+#define HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_S            4
+
+#define HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_M) >> HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_S)
+
+#define HTT_TX_MSDU_INFO_FRAME_TYPE_M                   0xF0000000
+#define HTT_TX_MSDU_INFO_FRAME_TYPE_S                   28
+
+#define HTT_TX_MSDU_INFO_FRAME_TYPE_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_FRAME_TYPE, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_FRAME_TYPE_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_FRAME_TYPE_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_FRAME_TYPE_M) >> HTT_TX_MSDU_INFO_FRAME_TYPE_S)
+
+#define HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_M               0x000000FF
+#define HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_S               0
+
+#define HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_ACK_FRAME_RSSI, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_M) >> HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_S)
+
+#define HTT_TX_MSDU_INFO_FIRST_MSDU_M                   0x00000100
+#define HTT_TX_MSDU_INFO_FIRST_MSDU_S                   8
+
+#define HTT_TX_MSDU_INFO_FIRST_MSDU_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_FIRST_MSDU, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_FIRST_MSDU_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_FIRST_MSDU_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_FIRST_MSDU_M) >> HTT_TX_MSDU_INFO_FIRST_MSDU_S)
+
+#define HTT_TX_MSDU_INFO_LAST_MSDU_M                    0x00000200
+#define HTT_TX_MSDU_INFO_LAST_MSDU_S                    9
+
+#define HTT_TX_MSDU_INFO_LAST_MSDU_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_LAST_MSDU, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_LAST_MSDU_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_LAST_MSDU_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_LAST_MSDU_M) >> HTT_TX_MSDU_INFO_LAST_MSDU_S)
+
+#define HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_M           0x00000400
+#define HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_S           10
+
+#define HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_M) >> HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_S)
+
+#define HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_M             0x3FFFF800
+#define HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_S             11
+
+#define HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_SET(word, value)      \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP, value);              \
+        (word) |= (value)  << HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_S;                \
+    } while (0)
+#define HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_GET(word) \
+    (((word) & HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_M) >> HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_S)
+
+struct htt_t2h_soft_umac_tx_compl_ind {
+    A_UINT32 msg_type :  8, /* HTT_T2H_MSG_TYPE_SOFT_UMAC_TX_COMPL_IND */
+             msdu_cnt :  8, /* min: 0, max: 255 */
+             rsvd0    : 16;
+    /* NOTE:
+     * To preserve backwards compatibility,
+     * no new fields can be added in this struct.
+     */
+    /*
+     * append here:
+     * struct htt_t2h_tx_msdu_info payload[1(or more)]
+     * for all the msdu's that are part of this completion.
+     */
+};
+
+/* member definitions of htt_t2h_soft_umac_tx_compl_ind */
+
+#define HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT_M       0x0000FF00
+#define HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT_S       8
+
+#define HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT, value);              \
+        (word) |= (value)  << HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT_S;                \
+    } while (0)
+#define HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT_GET(word) \
+    (((word) & HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT_M) >> HTT_SOFT_UMAC_TX_COMP_IND_MSDU_COUNT_S)
+
+
 /**
  * @brief target -> host rate-control update indication message
  *
@@ -19994,4 +20735,402 @@ typedef struct {
  */
 #define HTT_CODEL_MSDUQ_LATENCIES_ARRAY_ELEM_BYTES 2
 
+
+/**
+ * @brief target -> host rx completion indication message definition
+ *
+ * MSG_TYPE => HTT_T2H_MSG_TYPE_RX_DATA_IND
+ *
+ * @details
+ * The following diagram shows the format of the Rx completion indication sent
+ * from the target to the host
+ *
+ *         |31|29|28     24|23               12|11   9|8| 7|6|5|4|3|2|1|0|
+ *         |---------------+----------------------------+----------------|
+ *         |     vdev_id   |           peer_id          |    msg_type    |
+ * hdr:    |---------------+--------------------------+-+----------------|
+ *         |                     rsvd0                |F|    msdu_cnt    |
+ * pyld:   |==========================================+=+================|
+ *  MSDU 0 |                   buf addr lo (bits 31:0)                   |
+ *         |-----+--------------------------------------+----------------|
+ *         |rsvd1|           SW buffer cookie           |   buf addr hi  |
+ *         |--+--+-----------------------------+--------+--+-+-+-+-+-+-+-|
+ *         |R2| W|           MSDU length       |  TID   |MC|D|S|C|L|F|R|M|
+ *         |-------------------------------------------------+---------+-|
+ *         |                         rsvd3                   | err info|E|
+ *         |=================================================+=========+=|
+ *  MSDU 1 |                   buf addr lo (bits 31:0)                   |
+ *         :                              ...                            :
+ *         |                         rsvd3                   | err info|E|
+ *         |-------------------------------------------------------------|
+ * Where:
+ *     F = fragment
+ *     M = MPDU retry bit
+ *     R = raw MPDU frame
+ *     F = first MSDU in MPDU
+ *     L = last MSDU in MPDU
+ *     C = MSDU continuation
+ *     S = Souce Addr is valid
+ *     D = Dest Addr is valid
+ *     MC = Dest Addr is multicast / broadcast
+ *     W = is first MSDU after WoW wakeup
+ *     R2 = rsvd2
+ *     E = error valid
+ */
+
+/* htt_t2h_rx_data_msdu_err:
+ * To be filled in "htt_t2h_rx_data_msdu_info.error_info" field
+ * when FW forwards MSDU to host.
+ */
+typedef enum htt_t2h_rx_data_msdu_err {
+    /* ERR_DECRYPT:
+     * FW sets this when rxdma_error_code = <enum 3 rxdma_decrypt_err>.
+     * host maintains error stats, recycles buffer.
+     */
+    HTT_RXDATA_ERR_DECRYPT          = 0,
+
+    /* ERR_TKIP_MIC:
+     * FW sets this when rxdma_error_code = <enum 4 rxdma_tkip_mic_err>.
+     * Host maintains error stats, recycles buffer, sends notification to
+     * middleware.
+     */
+    HTT_RXDATA_ERR_TKIP_MIC         = 1,
+
+    /* ERR_UNENCRYPTED:
+     * FW sets this when rxdma_error_code = <enum 5 rxdma_unecrypted_err>.
+     * Host maintains error stats, recycles buffer.
+     */
+    HTT_RXDATA_ERR_UNENCRYPTED      = 2,
+
+    /* ERR_MSDU_LIMIT:
+     * FW sets this when rxdma_error_code = <enum 7 rxdma_msdu_limit_err>.
+     * Host maintains error stats, recycles buffer.
+     */
+    HTT_RXDATA_ERR_MSDU_LIMIT       = 3,
+
+    /* ERR_FLUSH_REQUEST:
+     * FW sets this when rxdma_error_code = <enum 13 rxdma_flush_request>.
+     * Host maintains error stats, recycles buffer.
+     */
+    HTT_RXDATA_ERR_FLUSH_REQUEST    = 4,
+
+    /* ERR_OOR:
+     * FW full reorder layer maps this error to <enum 7 regular_frame_OOR>.
+     * Host maintains error stats, recycles buffer mainly for low
+     * TCP KPI debugging.
+     */
+    HTT_RXDATA_ERR_OOR              = 5,
+
+    /* ERR_2K_JUMP:
+     * FW full reorder layer maps this error to <enum 5 regular_frame_2k_jump>.
+     * Host maintains error stats, recycles buffer mainly for low
+     * TCP KPI debugging.
+     */
+    HTT_RXDATA_ERR_2K_JUMP          = 6,
+
+    /* ERR_ZERO_LEN_MSDU:
+     * FW sets this error flag for a 0 length MSDU.
+     * Host maintains error stats, recycles buffer.
+     */
+    HTT_RXDATA_ERR_ZERO_LEN_MSDU    = 7,
+
+    /* add new error codes here */
+
+    HTT_RXDATA_ERR_MAX              = 32
+} htt_t2h_rx_data_msdu_err_e;
+
+struct htt_t2h_rx_data_ind_t
+{
+    A_UINT32 /* word 0 */
+        /* msg_type:
+         * Set to Rx data indication i.e. HTT_T2H_MSG_TYPE_RX_DATA_IND.
+         */
+        msg_type:    8,
+        peer_id:    16,  /* This will provide peer data */
+        vdev_id:     8;  /* This will provide vdev id info */
+    A_UINT32 /* word 1 */
+        /* msdu_cnt:
+         * Total number of MSDUs (htt_t2h_rx_data_msdu_info items) in message.
+         */
+        msdu_cnt:    8,
+        frag:        1,  /* this bit will be set for 802.11 frag MPDU */
+        rsvd0:      23;
+    /* NOTE:
+     * To preserve backwards compatibility,
+     * no new fields can be added in this struct.
+     */
+};
+
+struct htt_t2h_rx_data_msdu_info
+{
+    A_UINT32 /* word 0 */
+        buffer_addr_low         : 32;
+    A_UINT32 /* word 1 */
+        buffer_addr_high        :  8,
+        sw_buffer_cookie        : 21,
+        rsvd1                   :  3;
+    A_UINT32 /* word 2 */
+        mpdu_retry_bit          :  1, /* used for stats maintenance */
+        raw_mpdu_frame          :  1, /* used for pkt drop and processing */
+        first_msdu_in_mpdu_flag :  1, /* used for MSDU scatter/gather support */
+        last_msdu_in_mpdu_flag  :  1, /* used for MSDU scatter/gather support */
+        msdu_continuation       :  1, /* used for MSDU scatter/gather support */
+        sa_is_valid             :  1, /* used for HW issue check in
+                                       * is_sa_da_idx_valid() */
+        da_is_valid             :  1, /* used for HW issue check and
+                                       * intra-BSS forwarding */
+        da_is_mcbc              :  1,
+        tid_info                :  8, /* used for stats maintenance */
+        msdu_length             : 14,
+        is_first_pkt_after_wkp  :  1, /* indicates this is the first rx MSDU
+                                       * provided by fw after WoW exit */
+        rsvd2                   :  1;
+    A_UINT32 /* word 3 */
+        error_valid             :  1, /* Set if the MSDU has any error */
+        error_info              :  5, /* If error_valid is TRUE, then refer to
+                                       * "htt_t2h_rx_data_msdu_err_e" for
+                                       * checking error reason. */
+        rsvd3                   : 26;
+    /* NOTE:
+     * To preserve backwards compatibility,
+     * no new fields can be added in this struct.
+     */
+};
+
+/* HTT_RX_DATA_IND_HDR_SIZE: 2 4-byte words
+ * This is the size of htt_t2h_rx_data_ind_t alone which is fixed overhead
+ * for every Rx DATA IND sent by FW to host.
+ */
+#define HTT_RX_DATA_IND_HDR_SIZE      (2*4)
+/* HTT_RX_DATA_MSDU_INFO_SIZE: 4 4-bytes words
+ * This is the size of each MSDU detail that will be piggybacked with the
+ * RX IND header.
+ */
+#define HTT_RX_DATA_MSDU_INFO_SIZE    (4*4)
+
+/* member definitions of htt_t2h_rx_data_ind_t */
+
+#define HTT_RX_DATA_IND_PEER_ID_M       0x00ffff00
+#define HTT_RX_DATA_IND_PEER_ID_S       8
+
+#define HTT_RX_DATA_IND_PEER_ID_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_IND_PEER_ID, value);              \
+        (word) |= (value)  << HTT_RX_DATA_IND_PEER_ID_S;                \
+    } while (0)
+#define HTT_RX_DATA_IND_PEER_ID_GET(word) \
+    (((word) & HTT_RX_DATA_IND_PEER_ID_M) >> HTT_RX_DATA_IND_PEER_ID_S)
+
+#define HTT_RX_DATA_IND_VDEV_ID_M       0xff000000
+#define HTT_RX_DATA_IND_VDEV_ID_S       24
+
+#define HTT_RX_DATA_IND_VDEV_ID_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_IND_VDEV_ID, value);              \
+        (word) |= (value)  << HTT_RX_DATA_IND_VDEV_ID_S;                \
+    } while (0)
+#define HTT_RX_DATA_IND_VDEV_ID_GET(word) \
+    (((word) & HTT_RX_DATA_IND_VDEV_ID_M) >> HTT_RX_DATA_IND_VDEV_ID_S)
+
+#define HTT_RX_DATA_IND_MSDU_CNT_M      0x000000ff
+#define HTT_RX_DATA_IND_MSDU_CNT_S      0
+
+#define HTT_RX_DATA_IND_MSDU_CNT_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_IND_MSDU_CNT, value);              \
+        (word) |= (value)  << HTT_RX_DATA_IND_MSDU_CNT_S;                \
+    } while (0)
+#define HTT_RX_DATA_IND_MSDU_CNT_GET(word) \
+    (((word) & HTT_RX_DATA_IND_MSDU_CNT_M) >> HTT_RX_DATA_IND_MSDU_CNT_S)
+
+#define HTT_RX_DATA_IND_FRAG_M          0x00000100
+#define HTT_RX_DATA_IND_FRAG_S          8
+
+#define HTT_RX_DATA_IND_FRAG_SET(word, value)                        \
+        do {                                                                \
+            HTT_CHECK_SET_VAL(HTT_RX_DATA_IND_FRAG, value);              \
+            (word) |= (value)  << HTT_RX_DATA_IND_FRAG_S;                \
+        } while (0)
+#define HTT_RX_DATA_IND_FRAG_GET(word) \
+        (((word) & HTT_RX_DATA_IND_FRAG_M) >> HTT_RX_DATA_IND_FRAG_S)
+
+/* member definitions of htt_t2h_rx_data_msdu_info */
+
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW_M         0xFFFFFFFF
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW_S         0
+
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH_M        0x000000FF
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH_S        0
+
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW_M) >> HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_LOW_S)
+
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH_M) >> HTT_RX_DATA_MSDU_INFO_BUFFER_ADDR_HIGH_S)
+
+#define HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE_M        0x1FFFFF00
+#define HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE_S        8
+
+#define HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE_M) >> HTT_RX_DATA_MSDU_INFO_SW_BUFFER_COOKIE_S)
+
+#define HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT_M          0x00000001
+#define HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT_S          0
+
+#define HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT_M) >> HTT_RX_DATA_MSDU_INFO_MPDU_RETRY_BIT_S)
+
+#define HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME_M          0x00000002
+#define HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME_S          1
+
+#define HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME_M) >> HTT_RX_DATA_MSDU_INFO_RAW_MPDU_FRAME_S)
+
+#define HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU_M      0x00000004
+#define HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU_S      2
+
+#define HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU_M) >> HTT_RX_DATA_MSDU_INFO_FIRST_MSDU_IN_MPDU_S)
+
+#define HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU_M       0x00000008
+#define HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU_S       3
+
+#define HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU_M) >> HTT_RX_DATA_MSDU_INFO_LAST_MSDU_IN_MPDU_S)
+
+#define HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION_M       0x00000010
+#define HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION_S       4
+
+#define HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION_M) >> HTT_RX_DATA_MSDU_INFO_MSDU_CONTINUATION_S)
+
+#define HTT_RX_DATA_MSDU_INFO_SA_IS_VALID_M             0x00000020
+#define HTT_RX_DATA_MSDU_INFO_SA_IS_VALID_S             5
+
+#define HTT_RX_DATA_MSDU_INFO_SA_IS_VALID_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_SA_IS_VALID, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_SA_IS_VALID_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_SA_IS_VALID_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_SA_IS_VALID_M) >> HTT_RX_DATA_MSDU_INFO_SA_IS_VALID_S)
+
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_VALID_M             0x00000040
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_VALID_S             6
+
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_VALID_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_DA_IS_VALID, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_DA_IS_VALID_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_VALID_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_DA_IS_VALID_M) >> HTT_RX_DATA_MSDU_INFO_DA_IS_VALID_S)
+
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC_M              0x00000080
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC_S              7
+
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC_M) >> HTT_RX_DATA_MSDU_INFO_DA_IS_MCBC_S)
+
+#define HTT_RX_DATA_MSDU_INFO_TID_INFO_M                0x0000FF00
+#define HTT_RX_DATA_MSDU_INFO_TID_INFO_S                8
+
+#define HTT_RX_DATA_MSDU_INFO_TID_INFO_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_TID_INFO, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_TID_INFO_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_TID_INFO_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_TID_INFO_M) >> HTT_RX_DATA_MSDU_INFO_TID_INFO_S)
+
+#define HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH_M             0x3FFF0000
+#define HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH_S             16
+
+#define HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH_M) >> HTT_RX_DATA_MSDU_INFO_MSDU_LENGTH_S)
+
+#define HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP_M  0x40000000
+#define HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP_S  30
+
+#define HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP_M) >> HTT_RX_DATA_MSDU_INFO_IS_FIRST_PKT_AFTER_WKP_S)
+
+#define HTT_RX_DATA_MSDU_INFO_ERROR_VALID_M             0x00000001
+#define HTT_RX_DATA_MSDU_INFO_ERROR_VALID_S             0
+
+#define HTT_RX_DATA_MSDU_INFO_ERROR_VALID_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_ERROR_VALID, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_ERROR_VALID_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_ERROR_VALID_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_ERROR_VALID_M) >> HTT_RX_DATA_MSDU_INFO_ERROR_VALID_S)
+
+#define HTT_RX_DATA_MSDU_INFO_ERROR_INFO_M              0x0000001E
+#define HTT_RX_DATA_MSDU_INFO_ERROR_INFO_S              1
+
+#define HTT_RX_DATA_MSDU_INFO_ERROR_INFO_SET(word, value)                        \
+    do {                                                                \
+        HTT_CHECK_SET_VAL(HTT_RX_DATA_MSDU_INFO_ERROR_INFO, value);              \
+        (word) |= (value)  << HTT_RX_DATA_MSDU_INFO_ERROR_INFO_S;                \
+    } while (0)
+#define HTT_RX_DATA_MSDU_INFO_ERROR_INFO_GET(word) \
+    (((word) & HTT_RX_DATA_MSDU_INFO_ERROR_INFO_M) >> HTT_RX_DATA_MSDU_INFO_ERROR_INFO_S)
+
+
 #endif