1  /*
2   * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  /**
20   * @file htt_ppdu_stats.h
21   *
22   * @details the public header file of HTT STATS
23   */
24  #ifndef __HTT_PPDU_STATS_H__
25  #define __HTT_PPDU_STATS_H__
26  
27  #include <htt.h>
28  #include <htt_stats.h>
29  #include <htt_common.h> /* HTT_STATS_MAX_CHAINS */
30  
31  
32  /* HTT_PPDU_STATS_VAR_LEN_ARRAY1:
33   * This macro is for converting the definition of existing variable-length
34   * arrays within HTT PPDU stats structs of the form "type name[1];" to use
35   * the form "type name[];" while ensuring that the length of the TLV struct
36   * is unmodified by the conversion.
37   * In general, any new variable-length structs should simply use
38   * "type name[];" directly, rather than using HTT_PPDU_STATS_VAR_LEN_ARRAY1.
39   * However, if there's a legitimate reason to make the new variable-length
40   * struct appear to not have a variable length, HTT_PPDU_STATS_VAR_LEN_ARRAY1
41   * can be used for this purpose.
42   */
43  #if defined(ATH_TARGET) || defined(__WINDOWS__)
44      #define HTT_PPDU_STATS_VAR_LEN_ARRAY1(type, name) type name[1]
45  #else
46      /*
47       * Certain build settings of the Linux kernel don't allow zero-element
48       * arrays, and C++ doesn't allow zero-length empty structs.
49       * Confirm that there's no build that combines kernel with C++.
50       */
51      #ifdef __cplusplus
52          #error unsupported combination of kernel and C plus plus
53      #endif
54      #define HTT_PPDU_STATS_DUMMY_ZERO_LEN_FIELD struct {} dummy_zero_len_field
55  
56      #define HTT_PPDU_STATS_VAR_LEN_ARRAY1(type, name) \
57          union { \
58              type name ## __first_elem; \
59              struct { \
60                  HTT_PPDU_STATS_DUMMY_ZERO_LEN_FIELD; \
61                  type name[]; \
62              };  \
63          }
64  #endif
65  
66  
67  #define HTT_STATS_NUM_SUPPORTED_BW_SMART_ANTENNA 4 /* 20, 40, 80, 160 MHz */
68  
69  #define HTT_BA_64_BIT_MAP_SIZE_DWORDS 2
70  #define HTT_BA_256_BIT_MAP_SIZE_DWORDS 8
71  #define HTT_BA_1024_BIT_MAP_SIZE_DWORDS 32
72  
73  enum htt_ppdu_stats_tlv_tag {
74      HTT_PPDU_STATS_COMMON_TLV,                    /* htt_ppdu_stats_common_tlv */
75      HTT_PPDU_STATS_USR_COMMON_TLV,                /* htt_ppdu_stats_user_common_tlv */
76      HTT_PPDU_STATS_USR_RATE_TLV,                  /* htt_ppdu_stats_user_rate_tlv */
77      HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV,    /* htt_ppdu_stats_enq_mpdu_bitmap_64_tlv */
78      HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV,   /* htt_ppdu_stats_enq_mpdu_bitmap_256_tlv */
79      HTT_PPDU_STATS_SCH_CMD_STATUS_TLV,            /* htt_ppdu_stats_sch_cmd_tlv_v */
80      HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV,        /* htt_ppdu_stats_user_compltn_common_tlv */
81      HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV,  /* htt_ppdu_stats_user_compltn_ba_bitmap_64_tlv */
82      HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV, /* htt_ppdu_stats_user_cmpltn_ba_bitmap_256_tlv */
83      HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV, /* htt_ppdu_stats_user_cmpltn_ack_ba_status_tlv */
84      HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV,         /* htt_ppdu_stats_flush_tlv */
85      HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV,          /* htt_ppdu_stats_usr_common_array_tlv_v */
86      HTT_PPDU_STATS_INFO_TLV,                      /* htt_ppdu_stats_info */
87      HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV,       /* htt_ppdu_stats_tx_mgmtctrl_payload_tlv */
88      HTT_PPDU_STATS_USERS_INFO_TLV,                /* htt_ppdu_stats_users_info_tlv */
89      HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_1024_TLV,  /* htt_ppdu_stats_enq_mpdu_bitmap_1024_tlv */
90      HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_1024_TLV,/* htt_ppdu_stats_user_compltn_ba_bitmap_1024_tlv */
91      HTT_PPDU_STATS_RX_MGMTCTRL_PAYLOAD_TLV,       /* htt_ppdu_stats_rx_mgmtctrl_payload_tlv */
92      HTT_PPDU_STATS_FOR_SMU_TLV,                   /* htt_ppdu_stats_for_smu_tlv */
93      HTT_PPDU_STATS_MLO_TX_RESP_TLV,               /* htt_ppdu_stats_mlo_tx_resp_tlv */
94      HTT_PPDU_STATS_MLO_TX_NOTIFICATION_TLV,       /* htt_ppdu_stats_mlo_tx_notification_tlv */
95  
96      /* New TLV's are added above to this line */
97      HTT_PPDU_STATS_MAX_TAG,
98  };
99  typedef enum htt_ppdu_stats_tlv_tag htt_ppdu_stats_tlv_tag_t;
100  
101  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE_M     0x000000ff
102  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE_S              0
103  
104  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE_GET(_var) \
105      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE_M) >> \
106      HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE_S)
107  
108  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE_SET(_var, _val) \
109       do { \
110           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE, _val); \
111           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RATE_S)); \
112       } while (0)
113  
114  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU_M     0x00000100
115  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU_S              8
116  
117  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU_GET(_var) \
118      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU_M) >> \
119      HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU_S)
120  
121  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU_SET(_var, _val) \
122       do { \
123           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU, _val); \
124           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_IS_AMPDU_S)); \
125       } while (0)
126  
127  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED_M     0x00000600
128  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED_S              9
129  
130  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED_GET(_var) \
131      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED_M) >> \
132      HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED_S)
133  
134  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED_SET(_var, _val) \
135       do { \
136           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED, _val); \
137           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_BA_ACK_FAILED_S)); \
138       } while (0)
139  
140  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW_M     0x00003800
141  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW_S             11
142  
143  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW_GET(_var) \
144      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW_M) >> \
145      HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW_S)
146  
147  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW_SET(_var, _val) \
148       do { \
149           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW, _val); \
150           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_BW_S)); \
151       } while (0)
152  
153  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI_M     0x00004000
154  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI_S             14
155  
156  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI_GET(_var) \
157      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI_M) >> \
158      HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI_S)
159  
160  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI_SET(_var, _val) \
161       do { \
162           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI, _val); \
163           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_SGI_S)); \
164       } while (0)
165  
166  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR_M     0x00008000
167  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR_S             15
168  
169  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR_GET(_var) \
170      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR_M) >> \
171      HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR_S)
172  
173  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR_SET(_var, _val) \
174      do { \
175          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR, _val); \
176          ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_SR_S)); \
177      } while (0)
178  
179  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_M     0xffff0000
180  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_S             16
181  
182  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_GET(_var) \
183      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_M) >> \
184      HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_S)
185  
186  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_SET(_var, _val) \
187       do { \
188           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID, _val); \
189           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_S)); \
190       } while (0)
191  
192  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_M     0x0000ffff
193  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_S              0
194  
195  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_GET(_var) \
196      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_M) >> \
197      HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_S)
198  
199  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_SET(_var, _val) \
200       do { \
201           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS, _val); \
202           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_S)); \
203       } while (0)
204  
205  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_M     0xffff0000
206  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_S             16
207  
208  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_GET(_var) \
209      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_M) >> \
210      HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_S)
211  
212  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_SET(_var, _val) \
213       do { \
214           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS, _val); \
215           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_S)); \
216       } while (0)
217  
218  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_M     0x0000ffff
219  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_S              0
220  
221  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_GET(_var) \
222      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_M) >> \
223      HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_S)
224  
225  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_SET(_var, _val) \
226       do { \
227           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS, _val); \
228           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_S)); \
229       } while (0)
230  
231  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_M     0xffff0000
232  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_S             16
233  
234  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_GET(_var) \
235      (((_var) & HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_M) >> \
236      HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_S)
237  
238  #define HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_SET(_var, _val) \
239       do { \
240           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR, _val); \
241           ((_var) |= ((_val) << HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_S)); \
242       } while (0)
243  
244  PREPACK struct htt_tx_ppdu_stats_info {
245      htt_tlv_hdr_t tlv_hdr;
246      A_UINT32 tx_success_bytes;
247      A_UINT32 tx_retry_bytes;
248      A_UINT32 tx_failed_bytes;
249      A_UINT32 tx_ratecode:       8,
250               is_ampdu:          1,
251               ba_ack_failed:     2,
252               /* bw
253                *  0: 20 MHz
254                *  1: 40 MHz
255                *  2: 80 MHz
256                *  3: 160 MHz or 80+80 MHz
257                *  4: 320 MHz
258                */
259               bw:                3,
260               sgi:               1,
261               skipped_rate_ctrl: 1,
262               peer_id:          16;
263      A_UINT32 tx_success_msdus: 16,
264               tx_retry_msdus:   16;
265      A_UINT32 tx_failed_msdus:  16,
266               /* united in us */
267               tx_duration:      16;
268      /*
269       * 1 in bit 0 of valid_bitmap represents that bitmap itself is valid.
270       * If the bitmap is valid (i.e. bit 0 is set), then check the other bits
271       * of bitmap to know which fields within htt_tx_ppdu_stats_info are valid.
272       * If bit 1 is set, tx_success_bytes is valid
273       * If bit 2 is set, tx_retry_bytes is valid
274       * ...
275       * If bit 14 is set, tx_duration is valid
276       * If bit 15 is set, all of ack_rssi_chain are valid,
277       *     for each validation of chain, need to check value in field
278       * If bit 16 is set, tx_timestamp is valid
279       * If bit 16 is set, sa_ant_matrix is valid
280       * If bit 17 is set, tid is valid
281       */
282      A_UINT32 valid_bitmap;
283      A_UINT32 ext_valid_bitmap; /* reserved for future extension valid bitmap */
284      /* ack rssi for each chain */
285      A_UINT32 ack_rssi_chain0:   8, /* Units: dB w.r.t noise floor, RSSI of Ack of all active chains. Value of 0x80 indicates invalid.*/
286               ack_rssi_chain1:   8, /* same as above */
287               ack_rssi_chain2:   8, /* same as above */
288               ack_rssi_chain3:   8; /* same as above */
289      A_UINT32 ack_rssi_chain4:   8, /* same as above */
290               ack_rssi_chain5:   8, /* same as above */
291               ack_rssi_chain6:   8, /* same as above */
292               ack_rssi_chain7:   8; /* same as above */
293      A_UINT32 tx_timestamp; /* HW assigned timestamp with microsecond unit */
294      A_UINT32 sa_ant_matrix:     8, /* This sa_ant_matrix provides a bitmask of the antennas used while frame transmit */
295               tid:               8,
296               reserved_1:       16;
297  } POSTPACK;
298  
299  typedef struct {
300      htt_tlv_hdr_t tlv_hdr;
301      A_UINT32 number_of_ppdu_stats;
302      /*
303       * tx_ppdu_stats_info is filled by multiple struct htt_tx_ppdu_stats_info
304       * elements.
305       * tx_ppdu_stats_info is variable length, with length =
306       *     number_of_ppdu_stats * sizeof (struct htt_tx_ppdu_stats_info)
307       */
308      struct htt_tx_ppdu_stats_info tx_ppdu_stats_info[1/*number_of_ppdu_stats*/];
309  } htt_ppdu_stats_usr_common_array_tlv_v;
310  
311  typedef struct {
312      htt_tlv_hdr_t tlv_hdr;
313      union {
314          /* DEPRECATED (target_type)
315           * The target_type field is not actually present in the HTT messages
316           * produced by the FW.  However, it cannot be removed (yet), due to
317           * FW code that refers to this field.
318           * As a workaround, this target_type field is being moved into a
319           * union with the "hw" field that actually is present in the message.
320           * This makes the message definitions become consistent with the
321           * actual message contents, while not breaking the compilation of
322           * code that refers to the target_type field.
323           * Overlaying the memory for "target_type" and "hw" does not cause
324           * problems, because the FW code that refers to target_type first
325           * writes a value into the target_type field, then writes data into
326           * the hw field.
327           * Once all FW references to the target_type field have been removed,
328           * the target_type field def and the encapsulating anonymous union
329           * will be removed from this htt_ppdu_stats_sch_cmd_tlv_v struct def.
330           */
331          A_UINT32 target_type;
332  
333          /*
334           * The hw portion of this struct contains a scheduler_command_status
335           * struct, whose definition is different for different target HW types.
336           */
337          HTT_PPDU_STATS_VAR_LEN_ARRAY1(A_UINT32, hw);
338      };
339  } htt_ppdu_stats_sch_cmd_tlv_v;
340  
341  #define HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_M     0x0000ffff
342  #define HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_S              0
343  
344  #define HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_GET(_var) \
345      (((_var) & HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_M) >> \
346      HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_S)
347  
348  #define HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_SET(_var, _val) \
349       do { \
350           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID, _val); \
351           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_S)); \
352       } while (0)
353  
354  #define HTT_PPDU_STATS_COMMON_TLV_RING_ID_M     0x00ff0000
355  #define HTT_PPDU_STATS_COMMON_TLV_RING_ID_S             16
356  
357  #define HTT_PPDU_STATS_COMMON_TLV_RING_ID_GET(_var) \
358      (((_var) & HTT_PPDU_STATS_COMMON_TLV_RING_ID_M) >> \
359      HTT_PPDU_STATS_COMMON_TLV_RING_ID_S)
360  
361  #define HTT_PPDU_STATS_COMMON_TLV_RING_ID_SET(_var, _val) \
362       do { \
363           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_RING_ID, _val); \
364           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_RING_ID_S)); \
365       } while (0)
366  
367  #define HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_M     0xff000000
368  #define HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_S             24
369  
370  #define HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_GET(_var) \
371      (((_var) & HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_M) >> \
372      HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_S)
373  
374  #define HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_SET(_var, _val) \
375       do { \
376           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_NUM_USERS, _val); \
377           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_S)); \
378       } while (0)
379  
380  /* HW queue type */
381  enum HTT_TX_QUEUE_TYPE {
382      HTT_TX_QUEUE_INACTIVE,
383      HTT_TX_QUEUE_DATA,
384      HTT_TX_QUEUE_BEACON,
385      HTT_TX_QUEUE_PSPOLL,
386      HTT_TX_QUEUE_CAB,
387      HTT_TX_QUEUE_HALPHY,
388      HTT_TX_QUEUE_QBOOST_RESP,
389      HTT_TX_QUEUE_NAN_BEACON,
390      HTT_TX_QUEUE_NAN_MGMT,
391      HTT_TX_QUEUE_UL_DATA,
392      HTT_TX_QUEUE_UL_BSR_RESP,
393      HTT_TX_QUEUE_MGMT,
394      HTT_TX_QUEUE_MAX,
395  };
396  typedef enum HTT_TX_QUEUE_TYPE HTT_TX_QUEUE_TYPE;
397  
398  /* frame_type */
399  enum HTT_STATS_FTYPE {
400      HTT_STATS_FTYPE_SGEN_NDPA = 0,
401      HTT_STATS_FTYPE_SGEN_NDP,
402      HTT_STATS_FTYPE_SGEN_BRP,
403      HTT_STATS_FTYPE_SGEN_BAR,
404      HTT_STATS_FTYPE_SGEN_RTS,
405      HTT_STATS_FTYPE_SGEN_CTS,
406      HTT_STATS_FTYPE_SGEN_CFEND,
407      HTT_STATS_FTYPE_SGEN_AX_NDPA,
408      HTT_STATS_FTYPE_SGEN_AX_NDP,
409      HTT_STATS_FTYPE_SGEN_MU_TRIG,
410      HTT_STATS_FTYPE_SGEN_MU_BAR,
411      HTT_STATS_FTYPE_SGEN_MU_BRP,
412      HTT_STATS_FTYPE_SGEN_MU_RTS,
413      HTT_STATS_FTYPE_SGEN_MU_BSR,
414      HTT_STATS_FTYPE_SGEN_UL_BSR,
415      HTT_STATS_FTYPE_SGEN_UL_BSR_TRIGGER = HTT_STATS_FTYPE_SGEN_UL_BSR, /*alias*/
416      HTT_STATS_FTYPE_TIDQ_DATA_SU,
417      HTT_STATS_FTYPE_TIDQ_DATA_MU,
418      HTT_STATS_FTYPE_SGEN_UL_BSR_RESP,
419      HTT_STATS_FTYPE_SGEN_QOS_NULL,
420      HTT_STATS_FTYPE_SGEN_BE_NDPA,
421      HTT_STATS_FTYPE_SGEN_BE_NDP,
422      HTT_STATS_FTYPE_SGEN_BE_MU_TRIG,
423      HTT_STATS_FTYPE_SGEN_BE_MU_BAR,
424      HTT_STATS_FTYPE_SGEN_BE_MU_BRP,
425      HTT_STATS_FTYPE_SGEN_BE_MU_RTS,
426      HTT_STATS_FTYPE_SGEN_BE_MU_BSRP,
427      HTT_STATS_FTYPE_MAX,
428  };
429  typedef enum HTT_STATS_FTYPE HTT_STATS_FTYPE;
430  
431  /* FRM_TYPE defined in HTT_STATS_FTYPE */
432  #define HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_M     0x000000ff
433  #define HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_S              0
434  
435  #define HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_GET(_var) \
436      (((_var) & HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_M) >> \
437      HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_S)
438  
439  #define HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_SET(_var, _val) \
440       do { \
441           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE, _val); \
442           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_S)); \
443       } while (0)
444  
445  /* QTYPE defined in HTT_TX_QUEUE_TYPE */
446  #define HTT_PPDU_STATS_COMMON_TLV_QTYPE_M     0x0000ff00
447  #define HTT_PPDU_STATS_COMMON_TLV_QTYPE_S              8
448  
449  #define HTT_PPDU_STATS_COMMON_TLV_QTYPE_GET(_var) \
450      (((_var) & HTT_PPDU_STATS_COMMON_TLV_QTYPE_M) >> \
451      HTT_PPDU_STATS_COMMON_TLV_QTYPE_S)
452  
453  #define HTT_PPDU_STATS_COMMON_TLV_QTYPE_SET(_var, _val) \
454       do { \
455           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_QTYPE, _val); \
456           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_QTYPE_S)); \
457       } while (0)
458  
459  
460  enum HTT_PPDU_STATS_BW {
461      HTT_PPDU_STATS_BANDWIDTH_5MHZ   = 0,
462      HTT_PPDU_STATS_BANDWIDTH_10MHZ  = 1,
463      HTT_PPDU_STATS_BANDWIDTH_20MHZ  = 2,
464      HTT_PPDU_STATS_BANDWIDTH_40MHZ  = 3,
465      HTT_PPDU_STATS_BANDWIDTH_80MHZ  = 4,
466      HTT_PPDU_STATS_BANDWIDTH_160MHZ = 5, /* includes 80+80 */
467      HTT_PPDU_STATS_BANDWIDTH_DYN    = 6,
468      HTT_PPDU_STATS_BANDWIDTH_DYN_PATTERNS = 7,
469      HTT_PPDU_STATS_BANDWIDTH_320MHZ = 8,
470  };
471  typedef enum HTT_PPDU_STATS_BW HTT_PPDU_STATS_BW;
472  
473  #define HTT_PPDU_STATS_COMMON_TLV_BW_M     0x000f0000
474  #define HTT_PPDU_STATS_COMMON_TLV_BW_S             16
475  
476  #define HTT_PPDU_STATS_COMMON_TLV_BW_GET(_var) \
477      (((_var) & HTT_PPDU_STATS_COMMON_TLV_BW_M) >> \
478      HTT_PPDU_STATS_COMMON_TLV_BW_S)
479  
480  #define HTT_PPDU_STATS_COMMON_TLV_BW_SET(_var, _val) \
481       do { \
482           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_BW, _val); \
483           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_BW_S)); \
484       } while (0)
485  
486  enum HTT_PPDU_STATS_SEQ_TYPE {
487      HTT_SEQTYPE_UNSPECIFIED         = 0,
488      HTT_SEQTYPE_SU                  = 1,
489      HTT_SEQTYPE_AC_MU_MIMO          = 2,
490      HTT_SEQTYPE_AX_MU_MIMO          = 3,
491      HTT_SEQTYPE_MU_OFDMA            = 4,
492      HTT_SEQTYPE_UL_MU_OFDMA_TRIG    = 5, /* new name - use this */
493          HTT_SEQTYPE_UL_TRIG         = 5,  /* deprecated old name */
494      HTT_SEQTYPE_BURST_BCN           = 6,
495      HTT_SEQTYPE_UL_BSR_RESP         = 7,
496      HTT_SEQTYPE_UL_BSR_TRIG         = 8,
497      HTT_SEQTYPE_UL_RESP             = 9,
498      HTT_SEQTYPE_UL_MU_MIMO_TRIG     = 10,
499      HTT_SEQTYPE_BE_MU_MIMO          = 11,
500      HTT_SEQTYPE_BE_MU_OFDMA         = 12,
501      HTT_SEQTYPE_BE_UL_MU_OFDMA_TRIG = 13,
502      HTT_SEQTYPE_BE_UL_MU_MIMO_TRIG  = 14,
503      HTT_SEQTYPE_BE_UL_BSR_TRIG      = 15,
504  };
505  typedef enum HTT_PPDU_STATS_SEQ_TYPE HTT_PPDU_STATS_SEQ_TYPE;
506  
507  #define HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE_M     0x0ff00000
508  #define HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE_S             20
509  
510  #define HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE_GET(_var) \
511      (((_var) & HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE_M) >> \
512      HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE_S)
513  
514  #define HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE_SET(_var, _val) \
515       do { \
516           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE, _val); \
517           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_PPDU_SEQ_TYPE_S)); \
518       } while (0)
519  
520  /*
521   * MPROT_TYPE enum values: refer to enum
522   * pcu_ppdu_setup_init__medium_prot_type__e
523   * defined in tlv_enum.h
524   */
525  #define HTT_PPDU_STATS_COMMON_TLV_MPROT_TYPE_M     0xf0000000
526  #define HTT_PPDU_STATS_COMMON_TLV_MPROT_TYPE_S             28
527  
528  #define HTT_PPDU_STATS_COMMON_TLV_MPROT_TYPE_GET(_var) \
529      (((_var) & HTT_PPDU_STATS_COMMON_TLV_MPROT_TYPE_M) >> \
530      HTT_PPDU_STATS_COMMON_TLV_MPROT_TYPE_S)
531  
532  #define HTT_PPDU_STATS_COMMON_TLV_MPROT_TYPE_SET(_var, _val) \
533       do { \
534          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_MPROT_TYPE, _val); \
535          ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_BW_S)); \
536       } while (0)
537  
538  #define HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_M     0x0000ffff
539  #define HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_S              0
540  
541  #define HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_GET(_var) \
542      (((_var) & HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_M) >> \
543      HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_S)
544  
545  #define HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_SET(_var, _val) \
546       do { \
547           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_PHY_MODE, _val); \
548           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_S)); \
549       } while (0)
550  
551  #define HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_M     0xffff0000
552  #define HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_S             16
553  
554  #define HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_GET(_var) \
555      (((_var) & HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_M) >> \
556      HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_S)
557  
558  #define HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_SET(_var, _val) \
559       do { \
560           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ, _val); \
561           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_S)); \
562       } while (0)
563  
564  #define HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US_M     0x0000ffff
565  #define HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US_S              0
566  
567  #define HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US_GET(_var) \
568      (((_var) & HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US_M) >> \
569      HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US_S )
570  
571  #define HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US_SET(_var, _val) \
572       do { \
573           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US, _val); \
574           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_PHY_PPDU_TX_TIME_US_S)); \
575       } while (0)
576  
577  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_M     0x00ff0000
578  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_S             16
579  
580  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_GET(_var) \
581      (((_var) & HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_M) >> \
582      HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_S)
583  
584  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_SET(_var, _val) \
585     do { \
586        HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS, _val); \
587        ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_S)); \
588     } while(0);
589  
590  #define HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE_M    0x01000000
591  #define HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE_S            24
592  
593  #define HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE_GET(_var) \
594      (((_var) & HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE_M) >> \
595      HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE_S)
596  
597  #define HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE_SET(_var, _val) \
598       do { \
599           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE, _val); \
600           ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_BEAM_CHANGE_S)); \
601       } while (0)
602  
603  #define HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_M    0x02000000
604  #define HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_S            25
605  
606  #define HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_GET(_var) \
607      (((_var) & HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_M) >> \
608      HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_S)
609  
610  #define HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_SET(_var, _val) \
611      do { \
612          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION, _val); \
613          ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_S)); \
614      } while (0)
615  
616  enum HTT_PPDU_STATS_SPATIAL_REUSE {
617      HTT_SRP_DISALLOW                        =  0,
618      /* values 1-12 are reserved */
619      HTT_SR_RESTRICTED                       = 13,
620      HTT_SR_DELAY                            = 14,
621      HTT_SRP_AND_NON_SRG_OBSS_PD_PROHIBITED  = 15,
622  };
623  typedef enum HTT_PPDU_STATS_SPATIAL_REUSE HTT_PPDU_STATS_SPATIAL_REUSE;
624  
625  #define HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_M    0x3c000000
626  #define HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_S            26
627  
628  #define HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_GET(_var) \
629      (((_var) & HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_M) >> \
630      HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_S)
631  
632  #define HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_SET(_var, _val) \
633      do { \
634          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE, _val); \
635          ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_S)); \
636      } while (0)
637  
638  #define HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_M     0x0000003f
639  #define HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_S              0
640  
641  #define HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_GET(_var) \
642      (((_var) & HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_M) >> \
643      HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_S)
644  
645  #define HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_SET(_var, _val) \
646       do { \
647              HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID, _val); \
648              ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_S)); \
649      } while (0)
650  
651  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_M     0x00020000
652  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_S             17
653  
654  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_GET(_var) \
655      (((_var) & HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_M) >> \
656      HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_S)
657  
658  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_SET(_var, _val) \
659      do { \
660          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID, _val); \
661          ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_S)); \
662      } while (0)
663  
664  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_M     0x000c0000
665  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_S             18
666  
667  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_GET(_var) \
668      (((_var) & HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_M) >> \
669      HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_S)
670  
671  #define HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_SET(_var, _val) \
672      do { \
673          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_AC_VALID, _val); \
674          ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_S)); \
675      } while (0)
676  
677  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_M     0x00100000
678  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_S             20
679  
680  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_GET(_var) \
681      (((_var) & HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_M) >> \
682      HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_S)
683  
684  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_SET(_var, _val) \
685      do { \
686          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID, _val); \
687          ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_S)); \
688      } while (0)
689  
690  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_M     0x1fe00000
691  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_S             21
692  
693  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_GET(_var) \
694      (((_var) & HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_M) >> \
695      HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_S)
696  
697  #define HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_SET(_var, _val) \
698      do { \
699          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID, _val); \
700          ((_var) |= ((_val) << HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_S)); \
701      } while (0)
702  
703  #define HTT_PPDU_STATS_COMMON_TRIG_COOKIE_M    0x0000ffff
704  #define HTT_PPDU_STATS_COMMON_TRIG_COOKIE_S    0
705  
706  #define HTT_PPDU_STATS_COMMON_TRIG_COOKIE_GET(_val) \
707          (((_val) & HTT_PPDU_STATS_COMMON_TRIG_COOKIE_M) >> \
708           HTT_PPDU_STATS_COMMON_TRIG_COOKIE_S)
709  
710  enum HTT_SEQ_TYPE {
711      WAL_PPDU_SEQ_TYPE = 0,
712      HTT_PPDU_SEQ_TYPE = 1,
713  };
714  
715  typedef struct {
716      htt_tlv_hdr_t tlv_hdr;
717  
718      A_UINT32 ppdu_id;
719      /* BIT [ 15 :   0]   :- sched_cmdid
720       * BIT [ 23 :  16]   :- ring_id
721       * BIT [ 31 :  24]   :- num_users
722       */
723      union {
724          A_UINT32 ring_id__sched_cmdid;
725          struct {
726              A_UINT32 sched_cmdid:   16,
727                       ring_id:        8,
728                       num_users:      8;
729          };
730      };
731      /* BIT [ 7 :   0]   :- frame_type - HTT_STATS_FTYPE
732       * BIT [ 15:   8]   :- queue_type - HTT_TX_QUEUE_TYPE
733       * BIT [ 19:  16]   :- bw - HTT_PPDU_STATS_BW
734       * BIT [ 27:  20]   :- ppdu_seq_type - HTT_PPDU_STATS_SEQ_TYPE
735       * BIT [ 31:  28]   :- mprot_type
736       */
737      union {
738          A_UINT32 bw__queue_type__frame_type;
739          A_UINT32 ppdu_seq_type__bw__queue_type__frame_type;
740          A_UINT32 mprot_type__ppdu_seq_type__bw__queue_type__frame_type;
741          struct {
742              A_UINT32 frame_type:     8,
743                       queue_type:     8,
744                       bw:             4,
745                       ppdu_seq_type:  8,
746                       mprot_type:     4;
747          };
748      };
749      A_UINT32 chain_mask;
750      A_UINT32 fes_duration_us; /* frame exchange sequence */
751      A_UINT32 ppdu_sch_eval_start_tstmp_us;
752      A_UINT32 ppdu_sch_end_tstmp_us;
753      A_UINT32 ppdu_start_tstmp_us;
754      /* BIT [15 :  0] - phy mode (WLAN_PHY_MODE) with which ppdu was transmitted
755       * BIT [31 : 16] - bandwidth (in MHz) with which ppdu was transmitted
756       */
757      union {
758          A_UINT32 chan_mhz__phy_mode;
759          struct {
760              A_UINT32 phy_mode:     16,
761                       chan_mhz:     16;
762          };
763      };
764  
765      /*
766       * The cca_delta_time_us reports the time the tx PPDU in question
767       * was waiting in the HW tx queue for the clear channel assessment
768       * to indicate that the transmission could start.
769       * If this CCA delta time is zero or small, this indicates that the
770       * air interface was unused prior to the transmission, and thus it's
771       * improbable that there was a collision with some other transceiver's
772       * transmission.
773       * In contrast, a large CCA delta time means that this transceiver had
774       * to wait a long time for the air interface to be available; it's
775       * possible that other transceivers were also waiting for the air
776       * interface to become available, and if the other waiting transceiver's
777       * CW backoff aligned with this one, to have a transmit collision.
778       */
779      A_UINT32 cca_delta_time_us;
780  
781      /*
782       * The rxfrm_delta_time_us reports the time the tx PPDU in question
783       * was waiting in the HW tx queue while there was an ongoing rx,
784       * either because the rx was already ongoing at the time the tx PPDU
785       * was enqueued, or because the rx (i.e. the peer's tx) won the air
786       * interface contention over the local vdev's tx.
787       */
788      A_UINT32 rxfrm_delta_time_us;
789  
790      /*
791       * The txfrm_delta_time_us reports the time from when the tx PPDU
792       * in question was enqueued into the HW tx queue until the time the
793       * tx completion interrupt for the PPDU occurred.
794       * Thus, the txfrm_delta_time_us incorporates any time the tx PPDU
795       * had to wait for the air interface to become available, the PPDU
796       * duration, the block ack reception, and the tx completion interrupt
797       * latency.
798       */
799      A_UINT32 txfrm_delta_time_us;
800  
801      /*
802       * The phy_ppdu_tx_time_us reports the time it took to transmit
803       * a PPDU by itself
804       * BIT [15 :  0] - phy_ppdu_tx_time_us reports the time it took to
805       *                 transmit by itself (not including response time)
806       * BIT [23 : 16] - num_ul_expected_users reports the number of users
807       *                 that are expected to respond to this transmission
808       * BIT [24 : 24] - beam_change reports the beam forming pattern
809       *                 between non-HE and HE portion.
810       *                 If we apply TxBF starting from legacy preamble,
811       *                 then beam_change = 0.
812       *                 If we apply TxBF only starting from HE portion,
813       *                 then beam_change = 1.
814       * BIT [25 : 25] - doppler_indication
815       * BIT [29 : 26] - spatial_reuse for HE_SU,HE_MU and HE_EXT_SU format PPDU
816       *                 HTT_PPDU_STATS_SPATIAL_REUSE
817       * BIT [31 : 30] - reserved
818       */
819      union {
820          A_UINT32 reserved__ppdu_tx_time_us;
821          A_UINT32 reserved__num_ul_expected_users__ppdu_tx_time_us;
822          A_UINT32 reserved__spatial_reuse__doppler_indication__beam_change__num_ul_expected_users__ppdu_tx_time_us;
823          struct {
824              A_UINT32 phy_ppdu_tx_time_us:   16,
825                       num_ul_expected_users:  8,
826                       beam_change:            1,
827                       doppler_indication:     1,
828                       spatial_reuse:          4,
829                       reserved1:              2;
830          };
831      };
832  
833      /* ppdu_start_tstmp_u32_us:
834       * Upper 32 bits of the PPDU start timestamp.
835       * This field can be combined with the ppdu_start_tstmp_us field's
836       * lower 32 bits of the PPDU start timestamp to form a 64-bit timestamp.
837       */
838      A_UINT32 ppdu_start_tstmp_u32_us;
839  
840      /*
841       * BIT [5 : 0] - bss_color_id indicates he_bss_color which is an identifier
842       *               of the BSS and is used to assist a receiving STA in
843       *               identifying the BSS from which a PPDU originates.
844       *               Value in the range 0 to 63
845       * BIT [6 : 6] - PPDU transmitted using Non-SRG opportunity
846       * BIT [7 : 7] - PPDU transmitted using SRG opportunity
847       * BIT [15: 8] - RSSI of the aborted OBSS frame (in dB w.r.t. noise floor)
848       *               by which SRG/Non-SRG based spatial reuse opportunity
849       *               was created.
850       * BIT [16:16] - PPDU transmitted using PSR opportunity
851       * BIT [17:17] - backoff_ac_valid
852       * BIT [19:18] - backoff_ac: WMM ACI Value of the backoff engine used for
853       *               this transmission. Only valid if backoff_ac_valid is set
854       *               to 1. Typically this would match the default tid
855       *               number -> AC mapping. For frames in the middle of a SIFS
856       *               burst, the backoff_ac_valid will be 0.
857       * BIT [20:20] - num_ul_user_responses_valid
858       * BIT [21:28] - num_ul_user_responses: The number of user responses
859       *               detected by the MAC layer. This value can be compared with
860       *               the "num_ul_expected_users" field to see whether this frame
861       *               had a complete or partial response failure. Only valid if
862       *               num_ul_user_responses_valid is set to 1.
863       * BIT [31:29] - reserved
864       */
865      union {
866          A_UINT32 reserved__num_ul_user_responses__num_ul_user_responses_valid__backoff_ac__backoff_ac_valid__psr_tx__aborted_obss_rssi__srg_tx__non_srg_tx__bss_color_id;
867          A_UINT32 reserved__psr_tx__aborted_obss_rssi__srg_tx__non_srg_tx___bss_color_id;
868          A_UINT32 reserved__aborted_obss_rssi__srg_tx__non_srg_tx___bss_color_id;
869          A_UINT32 reserved__bss_color_id;
870          struct {
871              A_UINT32 bss_color_id:                6,
872                       non_srg_tx:                  1,
873                       srg_tx:                      1,
874                       aborted_obss_rssi:           8,
875                       psr_tx:                      1,
876                       backoff_ac_valid:            1,
877                       backoff_ac:                  2,
878                       num_ul_user_responses_valid: 1,
879                       num_ul_user_responses:       8,
880                       reserved2:                   3;
881          };
882      };
883  
884      /* Note: This is for tracking a UL OFDMA packet */
885      union {
886          A_UINT32 trig_cookie_info;
887          struct {
888              A_UINT32 trig_cookie: 16,
889                       trig_cookie_rsvd: 15,
890                       trig_cookie_valid: 1;
891          };
892      };
893  
894      /*
895       * BIT [0 : 0] - htt_seq_type field is added for backward compatibility
896       *               with pktlog decoder, host driver or any third party tool
897       *               interpreting ppdu sequence type. If field 'htt_seq_type'
898       *               is not present or is present but set to WAL_PPDU_SEQ_TYPE,
899       *               decoder should interpret the seq type as
900       *               WAL_TXSEND_PPDU_SEQUENCE.
901       *               If the new field htt_seq_type is present and is set to
902       *               HTT_PPDU_SEQ_TYPE then decoder should interpret the
903       *               seq type as HTT_PPDU_STATS_SEQ_TYPE.
904       *               htt_seq_type field will be set to HTT_PPDU_SEQ_TYPE in
905       *               firmware versions where this field is defined.
906       * BIT [31: 1] - reserved
907       */
908      union {
909          A_UINT32 reserved__htt_seq_type;
910          struct {
911              A_UINT32 htt_seq_type:  1,
912                       reserved3:     31;
913          };
914      };
915      /* is_manual_ulofdma_trigger:
916       * Flag to indicate if a given UL OFDMA trigger is manually triggered
917       * from the Host
918       */
919      A_UINT32 is_manual_ulofdma_trigger;
920      /* is_combined_ul_bsrp_trigger:
921       * Flag to indicate if a given UL BSRP trigger is sent combined as
922       * part of existing DL/UL data sequence
923       */
924      A_UINT32 is_combined_ul_bsrp_trigger;
925  } htt_ppdu_stats_common_tlv;
926  
927  #define HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM_M     0x000000ff
928  #define HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM_S              0
929  
930  #define HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM_GET(_var) \
931      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM_M) >> \
932      HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM_S)
933  
934  #define HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM_SET(_var, _val) \
935       do { \
936           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM, _val); \
937           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_TID_NUM_S)); \
938       } while (0)
939  
940  #define HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_M     0x0000ff00
941  #define HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_S              8
942  
943  #define HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_GET(_var) \
944      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_M) >> \
945      HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_S)
946  
947  #define HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_SET(_var, _val) \
948       do { \
949           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID, _val); \
950           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_S)); \
951       } while (0)
952  
953  #define HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID_M     0xffff0000
954  #define HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID_S             16
955  
956  #define HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID_GET(_var) \
957      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID_M) >> \
958      HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID_S)
959  
960  #define HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID_SET(_var, _val) \
961       do { \
962           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID, _val); \
963           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_SW_PEER_ID_S)); \
964       } while (0)
965  
966  #define HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_M     0x00000001
967  #define HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_S              0
968  
969  #define HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_GET(_var) \
970      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_M) >> \
971      HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_S)
972  
973  #define HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_SET(_var, _val) \
974       do { \
975           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_MCAST, _val); \
976           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_S)); \
977       } while (0)
978  
979  #define HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_M     0x000003fe
980  #define HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_S              1
981  
982  #define HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_GET(_var) \
983      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_M) >> \
984      HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_S)
985  
986  #define HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_SET(_var, _val) \
987       do { \
988           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED, _val); \
989           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_S)); \
990       } while (0)
991  
992  #define HTT_PPDU_STATS_USER_COMMON_TLV_BW_M     0x00003c00
993  #define HTT_PPDU_STATS_USER_COMMON_TLV_BW_S             10
994  
995  #define HTT_PPDU_STATS_USER_COMMON_TLV_BW_GET(_var) \
996      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_BW_M) >> \
997      HTT_PPDU_STATS_USER_COMMON_TLV_BW_S)
998  
999  #define HTT_PPDU_STATS_USER_COMMON_TLV_BW_SET(_var, _val) \
1000       do { \
1001           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_BW, _val); \
1002           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_BW_S)); \
1003       } while (0)
1004  
1005  #define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_M     0x00004000
1006  #define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_S             14
1007  
1008  #define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_GET(_var) \
1009      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_M) >> \
1010      HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_S)
1011  
1012  #define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_SET(_var, _val) \
1013       do { \
1014           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA, _val); \
1015           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_S)); \
1016       } while (0)
1017  
1018  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER_M     0x00008000
1019  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER_S             15
1020  
1021  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER_GET(_var) \
1022      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER_M) >> \
1023      HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER_S)
1024  
1025  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER_SET(_var, _val) \
1026       do { \
1027           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER, _val); \
1028           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_IS_SQNUM_VALID_IN_BUFFER_S)); \
1029       } while (0)
1030  
1031  #define HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES_M     0xffff0000
1032  #define HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES_S             16
1033  
1034  #define HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES_GET(_var) \
1035      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES_M) >> \
1036      HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES_S)
1037  
1038  #define HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES_SET(_var, _val) \
1039      do { \
1040          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES, _val); \
1041          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_NUM_FRAMES_S)); \
1042      } while (0)
1043  
1044  #define HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_M     0x0000ffff
1045  #define HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_S              0
1046  
1047  #define HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_GET(_var) \
1048      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_M) >> \
1049      HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_S)
1050  
1051  #define HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_SET(_var, _val) \
1052       do { \
1053           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL, _val); \
1054           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_S)); \
1055       } while (0)
1056  
1057  #define HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_M     0xffff0000
1058  #define HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_S             16
1059  
1060  #define HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_GET(_var) \
1061      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_M) >> \
1062      HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_S)
1063  
1064  #define HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_SET(_var, _val) \
1065       do { \
1066           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL, _val); \
1067           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_S)); \
1068       } while (0)
1069  
1070  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER_M 0x000000ff
1071  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER_S          0
1072  
1073  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER_GET(_var) \
1074      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER_M) >> \
1075      HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER_S)
1076  
1077  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER_SET(_var, _val) \
1078       do { \
1079           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER, _val); \
1080           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MULTIPLIER_S)); \
1081       } while (0)
1082  
1083  #define HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS_M 0x0000ff00
1084  #define HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS_S          8
1085  
1086  #define HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS_GET(_var) \
1087      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS_M) >> \
1088      HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS_S)
1089  
1090  #define HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS_SET(_var, _val) \
1091       do { \
1092           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS, _val); \
1093           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_CHAIN_ENABLE_BITS_S)); \
1094       } while (0)
1095  
1096  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG_M  0x00010000
1097  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG_S          16
1098  
1099  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG_GET(_var) \
1100      (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG_M) >> \
1101      HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG_S)
1102  
1103  #define HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG_SET(_var, _val) \
1104       do { \
1105           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG, _val); \
1106           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_IS_SMART_ULOFDMA_BASIC_TRIG_S)); \
1107       } while (0)
1108  
1109  
1110  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32 4
1111  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MASK 0x000000ff
1112  
1113  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_GET(tlv, chain_idx) \
1114      ((A_INT8) ((tlv)->tx_pwr[(chain_idx)/HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32] >> \
1115          ((chain_idx)%HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32)*8) & HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MASK)
1116  #define HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_SET(tlv, chain_idx, value) \
1117      (tlv)->tx_pwr[chain_idx/HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32] = \
1118          (tlv)->tx_pwr[chain_idx/HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32] & \
1119              ~(0xff << (((chain_idx)%HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32)*8)) | \
1120              (((value)<<((chain_idx)%HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32)*8))
1121  
1122  #define HTT_PPDU_STATS_USER_COMMON_TLV_ALT_TX_PWR_GET(tlv, chain_idx) \
1123      ((A_INT8) ((tlv)->alt_tx_pwr[(chain_idx)/HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32] >> \
1124          ((chain_idx)%HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32)*8) & HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_MASK)
1125  #define HTT_PPDU_STATS_USER_COMMON_TLV_ALT_TX_PWR_SET(tlv, chain_idx, value) \
1126      (tlv)->alt_tx_pwr[chain_idx/HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32] = \
1127          (tlv)->alt_tx_pwr[chain_idx/HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32] & \
1128              ~(0xff << (((chain_idx)%HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32)*8)) | \
1129              (((value)<<((chain_idx)%HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32)*8))
1130  
1131  typedef struct {
1132      htt_tlv_hdr_t tlv_hdr;
1133  
1134      /* BIT [ 7 :   0]   :- tid_num
1135       * BIT [ 15:   8]   :- vap_id
1136       * BIT [ 31:  16]   :- sw_peer_id
1137       */
1138      union {
1139          A_UINT32 sw_peer_id__vapid__tid_num;
1140          struct {
1141              A_UINT32 tid_num:           8,
1142                       vap_id:            8,
1143                       sw_peer_id:       16;
1144          };
1145      };
1146  
1147      /* BIT [ 0 :    0]   :- mcast
1148       * BIT [ 9 :    1]   :- mpdus_tried
1149       * BIT [ 13:   10]   :- bw - HTT_PPDU_STATS_BW
1150       * BIT [ 14:   14]   :- delayed_ba
1151       * BIT [ 15:   15]   :- rsvd
1152       * BIT [ 31:   16]   :- num_frames - num of MSDUs + num of MPDUs
1153       */
1154      union {
1155          A_UINT32 bw__mpdus_tried__mcast;
1156          struct {
1157              A_UINT32 mcast:                    1,
1158                       mpdus_tried:              9,
1159                       bw:                       4,
1160                       delayed_ba:               1,
1161                       is_sqno_valid_in_buffer:  1,
1162                       num_frames:              16;
1163          };
1164      };
1165  
1166      /* BIT [ 15:   0]   :- frame_ctrl
1167       * BIT [ 31:  16]   :- qos_ctrl
1168       */
1169      union {
1170          A_UINT32 qos_ctrl_frame_ctrl;
1171          struct {
1172              A_UINT32 frame_ctrl:       16,
1173                       qos_ctrl:         16;
1174          };
1175      };
1176  
1177      /*
1178       * Data fields containing the physical address info of a MSDU buffer
1179       * as well as the owner and a SW cookie info that can be used by the host
1180       * to look up the virtual address of the MSDU buffer.
1181       * These fields are only valid if is_buffer_addr_info_valid is set to 1.
1182       */
1183       A_UINT32 buffer_paddr_31_0       : 32;
1184       A_UINT32 buffer_paddr_39_32      :  8,
1185                return_buffer_manager   :  3,
1186                sw_buffer_cookie        : 21;
1187  
1188      /*
1189       * host_opaque_cookie : Host can send upto 2 bytes of opaque
1190       * cookie in TCL_DATA_CMD and FW will replay this back in
1191       * HTT PPDU stats. Valid only if sent to FW through
1192       * exception mechanism.
1193       *
1194       * is_standalone : This msdu was sent as a single MSDU/MPDU
1195       * PPDU as indicated by host via TCL_DATA_CMD using
1196       * the send_as_standalone bit.
1197       *
1198       * is_buffer_addr_info_valid : This will be set whenever a MSDU is sent as
1199       * a singleton (single-MSDU PPDU) for FW use-cases or as indicated by host
1200       * via send_as_standalone in TCL_DATA_CMD.
1201       *
1202       * The fields is_sw_rts_enabled, is_hw_rts_enabled, is_sfm_war_enabled
1203       * indicate whether SW RTS, HW RTS, SFM WAR are enabled for the
1204       * current Tx-sequence respectively.
1205       */
1206      A_UINT32 host_opaque_cookie:        16,
1207               is_host_opaque_valid:       1,
1208               is_standalone:              1,
1209               is_buffer_addr_info_valid:  1,
1210               is_sw_rts_enabled:          1,
1211               is_hw_rts_enabled:          1,
1212               is_sfm_war_enabled:         1,
1213               reserved1:                 10;
1214  
1215      /* qdepth bytes : Contains Number of bytes of TIDQ depth */
1216      A_UINT32 qdepth_bytes;
1217      A_UINT32 full_aid : 12,
1218               reserved : 20;
1219  
1220      /* data_frm_ppdu_id:
1221       * Note - this is valid in case delayed BA processing specifically for
1222       * BAR frames*/
1223      A_UINT32 data_frm_ppdu_id;
1224  
1225      /* sw_rts_prot_dur_us:
1226       * SW RTS protection duration in micro sec.
1227       * Note - this is valid if SW RTS was used instead of HW RTS.
1228       */
1229      A_UINT32 sw_rts_prot_dur_us;
1230  
1231      /* tx_pwr_multiplier:
1232       * Hawkeye now supports power accuracy in 0.25 dBm steps,
1233       * so all powers are x4.
1234       * This is needed to resolve compatibility issues with previous
1235       * generation chipsets.
1236       * API in halphy phyrf_bdf_GetMaxRatePwrMultiplier, used to find out
1237       * what the multiplier and use that to correctly report the TPC value
1238       * to host.
1239       *
1240       * chain_enable_bits:
1241       * Indicates the valid tx_pwr values in the tx_pwr field.
1242       * Default value: 1
1243       * tx_pwr[0] value is used for all chains if chain_enable_bits field
1244       * is set to 1.
1245       *
1246       * is_smart_ulofdma_basic_trig:
1247       * To check if user grouped in UL OFDMA Basic Trigger Frame is
1248       * due to Smart Basic Trigger.
1249       */
1250      A_UINT32 tx_pwr_multiplier          :  8,
1251               chain_enable_bits          :  8,
1252               is_smart_ulofdma_basic_trig:  1,
1253               is_primary_link_peer       :  1,
1254               reserved2                  : 14;
1255  
1256      /*
1257       * Transmit powers (signed values packed into unsigned bitfields)
1258       * in units of 0.25 dBm per chain.
1259       * To report the tx_pwr value in dBm units, stored value has to be
1260       * divided with tx_pwr_multiplier field.
1261       * Per chain tx_pwr configuration is not available for all chipsets.
1262       * Use tx_pwr[0] value for all chains if chain_enable_bits field
1263       * is set to 1.
1264       * Each chain uses 1 byte to store the transmit power.
1265       * The bytes within a A_UINT32 use little-endian order,
1266       * i.e. bits 7:0 of tx_pwr[0] store the tx pwr for chain 0,
1267       * bits 15:8 of tx_pwr[0] store the tx pwr for chain 1, etc.
1268       * Since HTT_STATS_MAX_CHAINS is a multiple of 4, no rounding is needed
1269       * to determine the number of A_UINT32 array elements.
1270       * Any bytes that exceed the number of chains with valid
1271       * tx_pwr data will be filled with 0x00.
1272       * When packing the 1-byte tx_pwr values into the A_UINT32,
1273       * masking is needed to keep the sign bits from clobbering
1274       * the higher bytes.
1275       * When extracting the 1-byte tx_pwr values from the A_UINT32,
1276       * sign-extension is needed if the variable holding the extracted
1277       * value is larger than A_INT8.
1278       */
1279      A_UINT32 tx_pwr[HTT_STATS_MAX_CHAINS / HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32];
1280  
1281      /*
1282       * Transmit powers for the alternate transmit descriptor used for BT COEX
1283       * (signed values packed into unsigned bitfields) in units of
1284       * 0.25 dBm per chain.
1285       * Not used by the host currently.
1286       * To report the alt_tx_pwr value in dBm units, stored value has to be
1287       * divided with tx_pwr_multiplier field.
1288       * Per chain alt_tx_pwr configuration is not available for all chipsets.
1289       * Use alt_tx_pwr[0] value for all chains if chain_enable_bits field
1290       * is set to 1.
1291       * Each chain uses 1 byte to store the alternate transmit power.
1292       * The bytes within a A_UINT32 use little-endian order,
1293       * i.e. bits 7:0 of alt_tx_pwr[0] store the alt tx pwr for chain 0,
1294       * bits 15:8 of alt_tx_pwr[0] store the alt tx pwr for chain 1, etc.
1295       * Since HTT_STATS_MAX_CHAINS is a multiple of 4, no rounding is needed
1296       * to determine the number of A_UINT32 array elements.
1297       * Any bytes that exceed the number of chains with valid
1298       * alt_tx_pwr data will be filled with 0x00.
1299       * When packing the 1-byte alt_tx_pwr values into the A_UINT32,
1300       * masking is needed to keep the sign bits from clobbering
1301       * the higher bytes.
1302       * When extracting the 1-byte alt_tx_pwr values from the A_UINT32,
1303       * sign-extension is needed if the variable holding the extracted
1304       * value is larger than A_INT8.
1305       */
1306      A_UINT32 alt_tx_pwr[HTT_STATS_MAX_CHAINS / HTT_PPDU_STATS_USER_COMMON_TLV_TX_PWR_CHAINS_PER_U32];
1307  
1308      /*
1309       * A bitmap indicating the MSDUQs that the scheduler is attempting to
1310       * transmit in this PPDU. Note that in some cases, the scheduler's notion
1311       * of what MSDUQs are being transmitted from may not be fully accurate,
1312       * such as when MPDUs are retried, or when some previously generated MPDUs
1313       * that were not attempted OTA yet are tried.
1314       *
1315       * The valid bit indices for this bitmap are defined by the HTT_MSDUQ_INDEX
1316       * enum (in htt.h). For example, (1 << HTT_MSDUQ_INDEX_UDP) would
1317       * correspond to the default UDP msduq.
1318       */
1319      A_UINT32 msduq_bitmap;
1320  } htt_ppdu_stats_user_common_tlv;
1321  
1322  #define HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_M     0x000000ff
1323  #define HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_S              0
1324  
1325  #define HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_GET(_var) \
1326      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_M) >> \
1327      HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_S)
1328  
1329  #define HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_SET(_var, _val) \
1330       do { \
1331           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM, _val); \
1332           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_S)); \
1333       } while (0)
1334  
1335  #define HTT_PPDU_STATS_USER_RATE_TLV_RESERVED_M     0x0000ff00
1336  #define HTT_PPDU_STATS_USER_RATE_TLV_RESERVED_S              8
1337  
1338  
1339  #define HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_M     0xffff0000
1340  #define HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_S             16
1341  
1342  #define HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_GET(_var) \
1343      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_M) >> \
1344      HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_S)
1345  
1346  #define HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_SET(_var, _val) \
1347       do { \
1348           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID, _val); \
1349           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_S)); \
1350       } while (0)
1351  
1352  #define HTT_PPDU_STATS_USER_RATE_TLV_USER_POS_M     0x0000000f
1353  #define HTT_PPDU_STATS_USER_RATE_TLV_USER_POS_S              0
1354  
1355  #define HTT_PPDU_STATS_USER_RATE_TLV_USER_POS_GET(_var) \
1356      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_USER_POS_M) >> \
1357      HTT_PPDU_STATS_USER_RATE_TLV_USER_POS_S)
1358  
1359  #define HTT_PPDU_STATS_USER_RATE_TLV_USER_POS_SET(_var, _val) \
1360       do { \
1361           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_USER_POS, _val); \
1362           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_USER_POS_S)); \
1363       } while (0)
1364  
1365  #define HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID_M     0x00000ff0
1366  #define HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID_S              4
1367  
1368  #define HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID_GET(_var) \
1369      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID_M) >> \
1370      HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID_S)
1371  
1372  #define HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID_SET(_var, _val) \
1373       do { \
1374           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID, _val); \
1375           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_MU_GROUPID_S)); \
1376       } while (0)
1377  
1378  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_M     0x0000ffff
1379  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_S              0
1380  
1381  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_GET(_var) \
1382      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RU_END_M) >> \
1383      HTT_PPDU_STATS_USER_RATE_TLV_RU_END_S)
1384  
1385  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_SET(_var, _val) \
1386       do { \
1387           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RU_END, _val); \
1388           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RU_END_S)); \
1389       } while (0)
1390  
1391  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_M     0xffff0000
1392  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_S             16
1393  
1394  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_GET(_var) \
1395      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RU_START_M) >> \
1396      HTT_PPDU_STATS_USER_RATE_TLV_RU_START_S)
1397  
1398  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_SET(_var, _val) \
1399       do { \
1400           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RU_START, _val); \
1401           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RU_START_S)); \
1402       } while (0)
1403  
1404  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID_M     0x00000001
1405  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID_S              0
1406  
1407  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID_GET(_var) \
1408      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID_M) >> \
1409      HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID_S)
1410  
1411  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID_SET(_var, _val) \
1412       do { \
1413           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID, _val); \
1414           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RESP_TYPE_VALID_S)); \
1415       } while (0)
1416  
1417  
1418  #define HTT_PPDU_STATS_BUF_ADDR_39_32_M     0x000000ff
1419  #define HTT_PPDU_STATS_BUF_ADDR_39_32_S              0
1420  
1421  #define HTT_PPDU_STATS_BUF_ADDR_39_32__GET(_var) \
1422      (((_var) & HTT_PPDU_STATS_BUF_ADDR_39_32_M) >> \
1423      HTT_PPDU_STATS_BUF_ADDR_39_32_S)
1424  
1425  #define HTT_PPDU_STATS_BUF_ADDR_39_32_SET(_var, _val) \
1426       do { \
1427           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_BUF_ADDR_39_32, _val); \
1428           ((_var) |= ((_val) << HTT_PPDU_STATS_BUF_ADDR_39_32_S)); \
1429       } while (0)
1430  
1431  
1432  #define HTT_PPDU_STATS_RETURN_BUF_MANAGER_M     0x00000700
1433  #define HTT_PPDU_STATS_RETURN_BUF_MANAGER_S              8
1434  
1435  #define HTT_PPDU_STATS_RETURN_BUF_MANAGER_GET(_var) \
1436      (((_var) & HTT_PPDU_STATS_RETURN_BUF_MANAGER_M) >> \
1437      HTT_PPDU_STATS_RETURN_BUF_MANAGER_S)
1438  
1439  #define HTT_PPDU_STATS_RETURN_BUF_MANAGER_SET(_var, _val) \
1440       do { \
1441           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_RETURN_BUF_MANAGER, _val); \
1442           ((_var) |= ((_val) << HTT_PPDU_STATS_RETURN_BUF_MANAGER_S)); \
1443       } while (0)
1444  
1445  
1446  #define HTT_PPDU_STATS_SW_BUFFER_COOKIE_M     0xfffff800
1447  #define HTT_PPDU_STATS_SW_BUFFER_COOKIE_S             11
1448  
1449  #define HTT_PPDU_STATS_SW_BUFFER_COOKIE_GET(_var) \
1450      (((_var) & HTT_PPDU_STATS_SW_BUFFER_COOKIE_M) >> \
1451      HTT_PPDU_STATS_SW_BUFFER_COOKIE_S)
1452  
1453  #define HTT_PPDU_STATS_SW_BUFFER_COOKIE_SET(_var, _val) \
1454       do { \
1455           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_SW_BUFFER_COOKIE, _val); \
1456           ((_var) |= ((_val) << HTT_PPDU_STATS_SW_BUFFER_COOKIE_S)); \
1457       } while (0)
1458  
1459  
1460  #define HTT_PPDU_STATS_HOST_OPAQUE_COOKIE_M     0x0000FFFF
1461  #define HTT_PPDU_STATS_HOST_OPAQUE_COOKIE_S              0
1462  
1463  #define HTT_PPDU_STATS_HOST_OPAQUE_COOKIE_GET(_var) \
1464      (((_var) & HTT_PPDU_STATS_HOST_OPAQUE_COOKIE_M) >> \
1465      HTT_PPDU_STATS_HOST_OPAQUE_COOKIE_S)
1466  
1467  #define HTT_PPDU_STAT_HOST_OPAQUE_COOKIE_SET(_var, _val) \
1468       do { \
1469           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_HOST_OPAQUE_COOKIE, _val); \
1470           ((_var) |= ((_val) << HTT_PPDU_STATS_HOST_OPAQUE_COOKIE_S)); \
1471       } while (0)
1472  
1473  
1474  #define HTT_PPDU_STATS_IS_OPAQUE_VALID_M        0x00010000
1475  #define HTT_PPDU_STATS_IS_OPAQUE_VALID_S                16
1476  
1477  #define HTT_PPDU_STATS_IS_OPAQUE_VALID_GET(_var) \
1478      (((_var) & HTT_PPDU_STATS_IS_OPAQUE_VALID_M) >> \
1479      HTT_PPDU_STATS_IS_OPAQUE_VALID_S)
1480  
1481  #define HTT_PPDU_STATS_IS_OPAQUE_VALID_SET(_var, _val) \
1482       do { \
1483           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_IS_OPAQUE_VALID, _val); \
1484           ((_var) |= ((_val) << HTT_PPDU_STATS_IS_OPAQUE_VALID_S)); \
1485       } while (0)
1486  
1487  
1488  #define HTT_PPDU_STATS_IS_STANDALONE_M          0x00020000
1489  #define HTT_PPDU_STATS_IS_STANDALONE_S                  17
1490  
1491  #define HTT_PPDU_STATS_IS_STANDALONE_GET(_var) \
1492      (((_var) & HTT_PPDU_STATS_IS_STANDALONE_M) >> \
1493      HTT_PPDU_STATS_IS_OPAQUE_VALID_S)
1494  
1495  #define HTT_PPDU_STATS_IS_STANDALONE_SET(_var, _val) \
1496       do { \
1497           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_IS_STANDALONE, _val); \
1498           ((_var) |= ((_val) << HTT_PPDU_STATS_IS_STANDALONE_S)); \
1499       } while (0)
1500  
1501  
1502  #define HTT_PPDU_STATS_IS_BUFF_INFO_VALID_M          0x000400000
1503  #define HTT_PPDU_STATS_IS_BUFF_INFO_VALID_S                   18
1504  
1505  #define HTT_PPDU_STATS_IS_BUFF_INFO_VALID_GET(_var) \
1506      (((_var) & HTT_PPDU_STATS_IS_BUFF_INFO_VALID_M) >> \
1507      HTT_PPDU_STATS_IS_BUFF_INFO_VALID_S)
1508  
1509  #define HTT_PPDU_STATS_IS_BUFF_INFO_VALID_SET(_var, _val) \
1510       do { \
1511           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_IS_BUFF_INFO_VALID, _val); \
1512           ((_var) |= ((_val) << HTT_PPDU_STATS_IS_BUFF_INFO_VALID_S)); \
1513       } while (0)
1514  
1515  enum HTT_PPDU_STATS_PPDU_TYPE {
1516      HTT_PPDU_STATS_PPDU_TYPE_SU,
1517      HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO,
1518      HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA,
1519      HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO_OFDMA,
1520      HTT_PPDU_STATS_PPDU_TYPE_UL_TRIG,
1521      HTT_PPDU_STATS_PPDU_TYPE_BURST_BCN,
1522      HTT_PPDU_STATS_PPDU_TYPE_UL_BSR_RESP,
1523      HTT_PPDU_STATS_PPDU_TYPE_UL_BSR_TRIG,
1524      HTT_PPDU_STATS_PPDU_TYPE_UL_RESP,
1525  
1526      HTT_PPDU_STATS_PPDU_TYPE_UNKNOWN = 0x1F,
1527  };
1528  typedef enum HTT_PPDU_STATS_PPDU_TYPE HTT_PPDU_STATS_PPDU_TYPE;
1529  
1530  #define HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_M     0x0000003E
1531  #define HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_S              1
1532  
1533  #define HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_GET(_var) \
1534      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_M) >> \
1535      HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_S)
1536  
1537  #define HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_SET(_var, _val) \
1538       do { \
1539           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE, _val); \
1540           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_S)); \
1541       } while (0)
1542  
1543  enum HTT_PPDU_STATS_TXBF_TYPE {
1544      HTT_PPDU_STATS_TXBF_OPEN_LOOP,
1545      HTT_PPDU_STATS_TXBF_IMPLICIT,
1546      HTT_PPDU_STATS_TXBF_EXPLICIT,
1547      HTT_PPDU_STATS_TXBF_MAX,
1548  };
1549  
1550  #define HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_M     0x00000003
1551  #define HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_S              0
1552  
1553  #define HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_GET(_var) \
1554      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_M) >> \
1555      HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_S)
1556  
1557  #define HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_SET(_var, _val) \
1558       do { \
1559           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE, _val); \
1560           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_S)); \
1561       } while (0)
1562  
1563  #define HTT_PPDU_STATS_USER_RATE_TLV_STBC_M     0x00000004
1564  #define HTT_PPDU_STATS_USER_RATE_TLV_STBC_S              2
1565  
1566  #define HTT_PPDU_STATS_USER_RATE_TLV_STBC_GET(_var) \
1567      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_STBC_M) >> \
1568      HTT_PPDU_STATS_USER_RATE_TLV_STBC_S)
1569  
1570  #define HTT_PPDU_STATS_USER_RATE_TLV_STBC_SET(_var, _val) \
1571       do { \
1572           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_STBC, _val); \
1573           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_STBC_S)); \
1574       } while (0)
1575  
1576  #define HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_M     0x00000008
1577  #define HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_S              3
1578  
1579  #define HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_GET(_var) \
1580      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_M) >> \
1581      HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_S)
1582  
1583  #define HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_SET(_var, _val) \
1584       do { \
1585           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_HE_RE, _val); \
1586           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_S)); \
1587       } while (0)
1588  
1589  #define HTT_PPDU_STATS_USER_RATE_TLV_TXBF_M     0x000000f0
1590  #define HTT_PPDU_STATS_USER_RATE_TLV_TXBF_S              4
1591  
1592  #define HTT_PPDU_STATS_USER_RATE_TLV_TXBF_GET(_var) \
1593      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_TXBF_M) >> \
1594      HTT_PPDU_STATS_USER_RATE_TLV_TXBF_S)
1595  
1596  #define HTT_PPDU_STATS_USER_RATE_TLV_TXBF_SET(_var, _val) \
1597       do { \
1598           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_TXBF, _val); \
1599           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_TXBF_S)); \
1600       } while (0)
1601  
1602  #define HTT_PPDU_STATS_USER_RATE_TLV_BW_M     0x00000f00
1603  #define HTT_PPDU_STATS_USER_RATE_TLV_BW_S              8
1604  
1605  #define HTT_PPDU_STATS_USER_RATE_TLV_BW_GET(_var) \
1606      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_BW_M) >> \
1607      HTT_PPDU_STATS_USER_RATE_TLV_BW_S)
1608  
1609  #define HTT_PPDU_STATS_USER_RATE_TLV_BW_SET(_var, _val) \
1610       do { \
1611           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_BW, _val); \
1612           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_BW_S)); \
1613       } while (0)
1614  
1615  #define HTT_PPDU_STATS_USER_RATE_TLV_NSS_M     0x0000f000
1616  #define HTT_PPDU_STATS_USER_RATE_TLV_NSS_S             12
1617  
1618  #define HTT_PPDU_STATS_USER_RATE_TLV_NSS_GET(_var) \
1619      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_NSS_M) >> \
1620      HTT_PPDU_STATS_USER_RATE_TLV_NSS_S)
1621  
1622  #define HTT_PPDU_STATS_USER_RATE_TLV_NSS_SET(_var, _val) \
1623       do { \
1624           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_NSS, _val); \
1625           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_NSS_S)); \
1626       } while (0)
1627  
1628  #define HTT_PPDU_STATS_USER_RATE_TLV_MCS_M     0x000f0000
1629  #define HTT_PPDU_STATS_USER_RATE_TLV_MCS_S             16
1630  
1631  #define HTT_PPDU_STATS_USER_RATE_TLV_MCS_GET(_var) \
1632      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_MCS_M) >> \
1633      HTT_PPDU_STATS_USER_RATE_TLV_MCS_S)
1634  
1635  #define HTT_PPDU_STATS_USER_RATE_TLV_MCS_SET(_var, _val) \
1636       do { \
1637           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_MCS, _val); \
1638           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_MCS_S)); \
1639       } while (0)
1640  
1641  /* Refer HTT_STATS_PREAM_TYPE */
1642  #define HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE_M     0x00f00000
1643  #define HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE_S             20
1644  
1645  #define HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE_GET(_var) \
1646      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE_M) >> \
1647      HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE_S)
1648  
1649  #define HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE_SET(_var, _val) \
1650       do { \
1651           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE, _val); \
1652           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_PREAMBLE_S)); \
1653       } while (0)
1654  
1655  /* Guard Intervals */
1656  enum HTT_PPDU_STATS_GI {
1657      HTT_PPDU_STATS_GI_800,
1658      HTT_PPDU_STATS_GI_400,
1659      HTT_PPDU_STATS_GI_1600,
1660      HTT_PPDU_STATS_GI_3200,
1661      HTT_PPDU_STATS_GI_CNT,
1662  };
1663  typedef enum HTT_PPDU_STATS_GI HTT_PPDU_STATS_GI;
1664  
1665  /* Refer HTT_PPDU_STATS_GI */
1666  #define HTT_PPDU_STATS_USER_RATE_TLV_GI_M     0x0f000000
1667  #define HTT_PPDU_STATS_USER_RATE_TLV_GI_S             24
1668  
1669  #define HTT_PPDU_STATS_USER_RATE_TLV_GI_GET(_var) \
1670      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_GI_M) >> \
1671      HTT_PPDU_STATS_USER_RATE_TLV_GI_S)
1672  
1673  #define HTT_PPDU_STATS_USER_RATE_TLV_GI_SET(_var, _val) \
1674       do { \
1675           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_GI, _val); \
1676           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_GI_S)); \
1677       } while (0)
1678  
1679  
1680  #define HTT_PPDU_STATS_USER_RATE_TLV_DCM_M     0x10000000
1681  #define HTT_PPDU_STATS_USER_RATE_TLV_DCM_S             28
1682  
1683  #define HTT_PPDU_STATS_USER_RATE_TLV_DCM_GET(_var) \
1684      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_DCM_M) >> \
1685      HTT_PPDU_STATS_USER_RATE_TLV_DCM_S)
1686  
1687  #define HTT_PPDU_STATS_USER_RATE_TLV_DCM_SET(_var, _val) \
1688       do { \
1689           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_DCM, _val); \
1690           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_DCM_S)); \
1691       } while (0)
1692  
1693  #define HTT_PPDU_STATS_USER_RATE_TLV_LDPC_M     0x20000000
1694  #define HTT_PPDU_STATS_USER_RATE_TLV_LDPC_S             29
1695  
1696  #define HTT_PPDU_STATS_USER_RATE_TLV_LDPC_GET(_var) \
1697      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_LDPC_M) >> \
1698      HTT_PPDU_STATS_USER_RATE_TLV_LDPC_S)
1699  
1700  #define HTT_PPDU_STATS_USER_RATE_TLV_LDPC_SET(_var, _val) \
1701       do { \
1702           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_LDPC, _val); \
1703           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_LDPC_S)); \
1704       } while (0)
1705  
1706  enum HTT_PPDU_STATS_RESP_PPDU_TYPE {
1707      HTT_PPDU_STATS_RESP_PPDU_TYPE_MU_MIMO_UL,
1708      HTT_PPDU_STATS_RESP_PPDU_TYPE_MU_OFDMA_UL,
1709  };
1710  typedef enum HTT_PPDU_STATS_RESP_PPDU_TYPE HTT_PPDU_STATS_RESP_PPDU_TYPE;
1711  
1712  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE_M     0xC0000000
1713  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE_S             30
1714  
1715  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE_GET(_var) \
1716      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE_M) >> \
1717      HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE_S)
1718  
1719  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE_SET(_var, _val) \
1720       do { \
1721           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE, _val); \
1722           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RESP_PPDU_TYPE_S)); \
1723       } while (0)
1724  
1725  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT_M        0x0000f000
1726  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT_S                12
1727  
1728  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT_GET(_var) \
1729      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT_M) >> \
1730      HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT_S)
1731  
1732  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT_SET(_var, _val) \
1733       do { \
1734           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT, _val); \
1735           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RU_FORMAT_S)); \
1736       } while (0)
1737  
1738  
1739  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_M           0x0000ffff
1740  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_S                    0
1741  
1742  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_GET(_var) \
1743      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RU_END_M) >> \
1744      HTT_PPDU_STATS_USER_RATE_TLV_RU_END_S)
1745  
1746  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_END_SET(_var, _val) \
1747       do { \
1748           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RU_END, _val); \
1749           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RU_END_S)); \
1750       } while (0)
1751  
1752  
1753  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_M         0xffff0000
1754  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_S                 16
1755  
1756  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_GET(_var) \
1757      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RU_START_M) >> \
1758      HTT_PPDU_STATS_USER_RATE_TLV_RU_START_S)
1759  
1760  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_START_SET(_var, _val) \
1761       do { \
1762           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RU_START, _val); \
1763           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RU_START_S)); \
1764       } while (0)
1765  
1766  
1767  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX_M         0x0000ffff
1768  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX_S                  0
1769  
1770  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX_GET(_var) \
1771      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX_M) >> \
1772      HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX_S)
1773  
1774  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX_SET(_var, _val) \
1775       do { \
1776           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX, _val); \
1777           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RU_INDEX_S)); \
1778       } while (0)
1779  
1780  
1781  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE_M          0xffff0000
1782  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE_S                  16
1783  
1784  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE_GET(_var) \
1785      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE_M) >> \
1786      HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE_S)
1787  
1788  #define HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE_SET(_var, _val) \
1789       do { \
1790           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE, _val); \
1791           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RU_SIZE_S)); \
1792       } while (0)
1793  
1794  
1795  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END_M      0x0000ffff
1796  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END_S               0
1797  
1798  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END_GET(_var) \
1799      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END_M) >> \
1800      HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END_S)
1801  
1802  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END_SET(_var, _val) \
1803       do { \
1804           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END, _val); \
1805           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_END_S)); \
1806       } while (0)
1807  
1808  
1809  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START_M    0xffff0000
1810  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START_S            16
1811  
1812  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START_GET(_var) \
1813      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START_M) >> \
1814      HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START_S)
1815  
1816  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START_SET(_var, _val) \
1817       do { \
1818           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START, _val); \
1819           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_START_S)); \
1820       } while (0)
1821  
1822  
1823  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX_M    0x0000ffff
1824  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX_S             0
1825  
1826  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX_GET(_var) \
1827      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX_M) >> \
1828      HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX_S)
1829  
1830  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX_SET(_var, _val) \
1831       do { \
1832           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX, _val); \
1833           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_INDEX_S)); \
1834       } while (0)
1835  
1836  
1837  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE_M     0xffff0000
1838  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE_S             16
1839  
1840  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE_GET(_var) \
1841      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE_M) >> \
1842      HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE_S)
1843  
1844  #define HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE_SET(_var, _val) \
1845       do { \
1846           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE, _val); \
1847           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_RESP_RU_SIZE_S)); \
1848       } while (0)
1849  
1850  #define HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP_M  0x0000ffff
1851  #define HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP_S           0
1852  
1853  #define HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP_GET(_var) \
1854      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP_M) >> \
1855      HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP_S)
1856  
1857  #define HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP_SET (_var , _val) \
1858      do { \
1859          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP, _val); \
1860          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_PUNC_PATTERN_BITMAP_S)); \
1861      } while (0)
1862  
1863  #define HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF_M  0x00010000
1864  #define HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF_S          16
1865  
1866  #define HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF_GET(_var) \
1867      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF_M) >> \
1868      HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF_S)
1869  
1870  #define HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF_SET (_var , _val) \
1871      do { \
1872          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF, _val); \
1873          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_EXTRA_EHT_LTF_S)); \
1874      } while (0)
1875  
1876  #define HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE_M  0x00020000
1877  #define HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE_S          17
1878  
1879  #define HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE_GET(_var) \
1880      (((_var) & HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE_M) >> \
1881      HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE_S)
1882  
1883  #define HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE_SET (_var , _val) \
1884      do { \
1885          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE, _val); \
1886          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_RATE_TLV_IS_MIN_RATE_S)); \
1887      } while (0)
1888  
1889  typedef enum HTT_PPDU_STATS_RU_SIZE {
1890      HTT_PPDU_STATS_RU_26,
1891      HTT_PPDU_STATS_RU_52,
1892      HTT_PPDU_STATS_RU_52_26,
1893      HTT_PPDU_STATS_RU_106,
1894      HTT_PPDU_STATS_RU_106_26,
1895      HTT_PPDU_STATS_RU_242,
1896      HTT_PPDU_STATS_RU_484,
1897      HTT_PPDU_STATS_RU_484_242,
1898      HTT_PPDU_STATS_RU_996,
1899      HTT_PPDU_STATS_RU_996_484,
1900      HTT_PPDU_STATS_RU_996_484_242,
1901      HTT_PPDU_STATS_RU_996x2,
1902      HTT_PPDU_STATS_RU_996x2_484,
1903      HTT_PPDU_STATS_RU_996x3,
1904      HTT_PPDU_STATS_RU_996x3_484,
1905      HTT_PPDU_STATS_RU_996x4,
1906  } HTT_PPDU_STATS_RU_SIZE;
1907  
1908  typedef struct {
1909      htt_tlv_hdr_t tlv_hdr;
1910  
1911      /* BIT [ 7 :   0]   :- tid_num
1912       * BIT [ 15:   8]   :- reserved0
1913       * BIT [ 31:  16]   :- sw_peer_id
1914       */
1915      union {
1916          A_UINT32 sw_peer_id__tid_num;
1917          struct {
1918              A_UINT32 tid_num:            8,
1919                       reserved0:          8,
1920                       sw_peer_id:        16;
1921          };
1922      };
1923  
1924      /* BIT [ 3 :   0]   :- user_pos
1925       * BIT [ 11:   4]   :- mu_group_id
1926       * BIT [ 15:  12]   :- ru_format
1927       * BIT [ 31:  16]   :- reserved1
1928       */
1929      union {
1930          A_UINT32 mu_group_id__user_pos;
1931          struct {
1932              A_UINT32 user_pos:           4,
1933                       mu_group_id:        8,
1934                       ru_format:          4,
1935                       reserved1:         16;
1936          };
1937      };
1938  
1939      /* BIT [ 15 :   0]   :- ru_end or ru_index
1940       * BIT [ 31 :  16]   :- ru_start or ru_size
1941       *
1942       * Discriminant is field ru_format:
1943       *     - ru_format = 0: ru_end, ru_start
1944       *     - ru_format = 1: ru_index, ru_size
1945       *     - ru_format = other: reserved for future expansion
1946       *
1947       * ru_start and ru_end are RU 26 indices
1948       *
1949       * ru_size is an HTT_PPDU_STATS_RU_SIZE, ru_index is a size
1950       * specific index for the given ru_size.
1951       */
1952      union {
1953          A_UINT32 ru_start__ru_end;
1954          A_UINT32 ru_size__ru_index;
1955          struct {
1956              A_UINT32 ru_end:   16,
1957                       ru_start: 16;
1958          };
1959          struct {
1960              A_UINT32 ru_index: 16,
1961                       ru_size:  16;
1962          };
1963      };
1964  
1965      /* BIT [ 15 :   0]   :- resp_ru_end or resp_ru_index
1966       * BIT [ 31 :  16]   :- resp_ru_start or resp_ru_size
1967       *
1968       * Discriminant is field ru_format:
1969       *     - ru_format = 0: resp_ru_end, resp_ru_start
1970       *     - ru_format = 1: resp_ru_index, resp_ru_size
1971       *     - ru_format = other: reserved for future expansion
1972       *
1973       * resp_ru_start and resp_ru_end are RU 26 indices
1974       *
1975       * resp_ru_size is an HTT_PPDU_STATS_RU_SIZE, resp_ru_index
1976       * is a size specific index for the given ru_size.
1977       */
1978      union {
1979          A_UINT32 resp_ru_start__ru_end;
1980          A_UINT32 resp_ru_size__ru_index;
1981          struct {
1982              A_UINT32 resp_ru_end:   16,
1983                       resp_ru_start: 16;
1984          };
1985          struct {
1986              A_UINT32 resp_ru_index: 16,
1987                       resp_ru_size:  16;
1988          };
1989      };
1990  
1991      /* BIT [ 0 :   0 ]   :- resp_type_valid
1992       * BIT [ 5 :   1 ]   :- ppdu_type - HTT_PPDU_STAT_PPDU_TYPE
1993       * BIT [ 31:   6 ]   :- reserved2
1994       */
1995      union {
1996          A_UINT32 resp_type_vld_ppdu_type;
1997          struct {
1998              A_UINT32 resp_type_vld:      1,
1999                       ppdu_type:          5,
2000                       reserved2:         26;
2001          };
2002      };
2003  
2004      /* BIT [ 1 :   0 ]   :- ltf_size
2005       * BIT [ 2 :   2 ]   :- stbc
2006       * BIT [ 3 :   3 ]   :- he_re (range extension)
2007       * BIT [ 7 :   4 ]   :- txbf
2008       * BIT [ 11:   8 ]   :- bw
2009       * BIT [ 15:   12]   :- nss  NSS 1,2, ...8
2010       * BIT [ 19:   16]   :- mcs
2011       * BIT [ 23:   20]   :- preamble
2012       * BIT [ 27:   24]   :- gi - HTT_PPDU_STATS_GI
2013       * BIT [ 28:   28]   :- dcm
2014       * BIT [ 29:   29]   :- ldpc
2015       * BIT [ 30:   30]   :- valid_skipped_rate_ctrl
2016       *                      This flag indicates whether the skipped_rate_ctrl
2017       *                      flag should be ignored, or if it holds valid data.
2018       * BIT [ 31:   31]   :- skipped_rate_ctrl
2019       */
2020      union {
2021          A_UINT32 rate_info;
2022          struct {
2023              A_UINT32 ltf_size:                2,
2024                       stbc:                    1,
2025                       he_re:                   1,
2026                       txbf:                    4,
2027                       bw:                      4,
2028                       nss:                     4,
2029                       mcs:                     4,
2030                       preamble:                4,
2031                       gi:                      4,
2032                       dcm:                     1,
2033                       ldpc:                    1,
2034                       valid_skipped_rate_ctrl: 1,
2035                       skipped_rate_ctrl:       1;
2036          };
2037      };
2038  
2039      /* Note: resp_rate_info is only valid for if resp_type is UL
2040       * BIT [ 1 :   0 ]   :- ltf_size
2041       * BIT [ 2 :   2 ]   :- stbc
2042       * BIT [ 3 :   3 ]   :- he_re (range extension)
2043       * BIT [ 7 :   4 ]   :- reserved3
2044       * BIT [ 11:   8 ]   :- bw
2045       * BIT [ 15:   12]   :- nss  NSS 1,2, ...8
2046       * BIT [ 19:   16]   :- mcs
2047       * BIT [ 23:   20]   :- preamble
2048       * BIT [ 27:   24]   :- gi
2049       * BIT [ 28:   28]   :- dcm
2050       * BIT [ 29:   29]   :- ldpc
2051       * BIT [ 31:   30]   :- resp_ppdu_type - HTT_PPDU_STATS_RESP_PPDU_TYPE
2052       */
2053      union {
2054          A_UINT32 resp_rate_info;
2055          struct {
2056              A_UINT32 resp_ltf_size:           2,
2057                       resp_stbc:               1,
2058                       resp_he_re:              1,
2059                       reserved3:               4,
2060                       resp_bw:                 4,
2061                       resp_nss:                4,
2062                       resp_mcs:                4,
2063                       resp_preamble:           4,
2064                       resp_gi:                 4,
2065                       resp_dcm:                1,
2066                       resp_ldpc:               1,
2067                       resp_ppdu_type:          2;
2068          };
2069      };
2070  
2071      /*
2072       * BIT [15:0]  :- Punctured BW bitmap pattern to indicate which BWs are
2073       *                punctured.
2074       * BIT 16      :- flag showing whether EHT extra LTF is applied
2075       *                for current PPDU
2076       */
2077      A_UINT32 punc_pattern_bitmap: 16,
2078               extra_eht_ltf:       1,
2079               is_min_rate:         1,
2080               reserved4:           14;
2081  } htt_ppdu_stats_user_rate_tlv;
2082  
2083  #define HTT_PPDU_STATS_USR_RATE_VALID_M     0x80000000
2084  #define HTT_PPDU_STATS_USR_RATE_VALID_S     31
2085  
2086  #define HTT_PPDU_STATS_USR_RATE_VALID_GET(_val) \
2087          (((_val) & HTT_PPDU_STATS_USR_RATE_VALID_M) >> \
2088           HTT_PPDU_STATS_USR_RATE_VALID_S)
2089  
2090  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_TID_NUM_M     0x000000ff
2091  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_TID_NUM_S              0
2092  
2093  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_TID_NUM_GET(_var) \
2094      (((_var) & HTT_PPDU_STATS_EMQ_MPDU_BITMAP_TLV_TID_NUM_M) >> \
2095      HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_TID_NUM_S)
2096  
2097  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_TID_NUM_SET(_var, _val) \
2098       do { \
2099           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_TID_NUM, _val); \
2100           ((_var) |= ((_val) << HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_TID_NUM_S)); \
2101       } while (0)
2102  
2103  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_RESERVED_M     0x0000ff00
2104  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_RESERVED_S              8
2105  
2106  
2107  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID_M     0xffff0000
2108  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID_S             16
2109  
2110  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID_GET(_var) \
2111      (((_var) & HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID_M) >> \
2112      HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID_S)
2113  
2114  #define HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID_SET(_var, _val) \
2115       do { \
2116           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID, _val); \
2117           ((_var) |= ((_val) << HTT_PPDU_STATS_ENQ_MPDU_BITMAP_TLV_SW_PEER_ID_S)); \
2118       } while (0)
2119  
2120  typedef struct {
2121      htt_tlv_hdr_t tlv_hdr;
2122      /* BIT [ 7 :   0]   :- tid_num
2123       * BIT [ 15:   8]   :- reserved0
2124       * BIT [ 31:  16]   :- sw_peer_id
2125       */
2126      union {
2127          A_UINT32 sw_peer_id__tid_num;
2128          struct {
2129              A_UINT32 tid_num:         8,
2130                       reserved0:       8,
2131                       sw_peer_id:     16;
2132          };
2133      };
2134      A_UINT32 start_seq;
2135      A_UINT32 enq_bitmap[HTT_BA_64_BIT_MAP_SIZE_DWORDS];
2136  } htt_ppdu_stats_enq_mpdu_bitmap_64_tlv;
2137  
2138  typedef struct {
2139      htt_tlv_hdr_t tlv_hdr;
2140      /* BIT [ 7 :   0]   :- tid_num
2141       * BIT [ 15:   8]   :- reserved0
2142       * BIT [ 31:  16]   :- sw_peer_id
2143       */
2144      union {
2145          A_UINT32 sw_peer_id__tid_num;
2146          struct {
2147              A_UINT32 tid_num:         8,
2148                       reserved0:       8,
2149                       sw_peer_id:     16;
2150          };
2151      };
2152      A_UINT32 start_seq;
2153      A_UINT32 enq_bitmap[HTT_BA_256_BIT_MAP_SIZE_DWORDS];
2154  } htt_ppdu_stats_enq_mpdu_bitmap_256_tlv;
2155  
2156  typedef struct {
2157      htt_tlv_hdr_t tlv_hdr;
2158      /* BIT [ 7 :   0]   :- tid_num
2159       * BIT [ 15:   8]   :- reserved0
2160       * BIT [ 31:  16]   :- sw_peer_id
2161       */
2162      union {
2163          A_UINT32 sw_peer_id__tid_num;
2164          struct {
2165              A_UINT32 tid_num:         8,
2166                       reserved0:       8,
2167                       sw_peer_id:     16;
2168          };
2169      };
2170      A_UINT32 start_seq;
2171      A_UINT32 enq_bitmap[HTT_BA_1024_BIT_MAP_SIZE_DWORDS];
2172  } htt_ppdu_stats_enq_mpdu_bitmap_1024_tlv;
2173  
2174  /* COMPLETION_STATUS defined in HTT_PPDU_STATS_USER_COMPLETION_STATUS */
2175  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS_M     0x000000ff
2176  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS_S              0
2177  
2178  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS_GET(_var) \
2179      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS_M) >> \
2180      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS_S)
2181  
2182  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS_SET(_var, _val) \
2183       do { \
2184           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS, _val); \
2185           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_COMPLETION_STATUS_S)); \
2186       } while (0)
2187  
2188  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM_M     0x0000ff00
2189  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM_S              8
2190  
2191  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM_GET(_var) \
2192      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM_M) >> \
2193      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM_S)
2194  
2195  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM_SET(_var, _val) \
2196       do { \
2197           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM, _val); \
2198           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TID_NUM_S)); \
2199       } while (0)
2200  
2201  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID_M     0xffff0000
2202  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID_S             16
2203  
2204  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID_GET(_var) \
2205      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID_M) >> \
2206      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID_S)
2207  
2208  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID_SET(_var, _val) \
2209       do { \
2210           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID, _val); \
2211           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SW_PEER_ID_S)); \
2212       } while (0)
2213  
2214  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED_M     0x0000ffff
2215  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED_S              0
2216  
2217  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED_GET(_var) \
2218      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED_M) >> \
2219      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED_S)
2220  
2221  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED_SET(_var, _val) \
2222       do { \
2223           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED, _val); \
2224           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_TRIED_S)); \
2225       } while (0)
2226  
2227  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS_M     0xffff0000
2228  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS_S             16
2229  
2230  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS_GET(_var) \
2231      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS_M) >> \
2232      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS_S)
2233  
2234  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS_SET(_var, _val) \
2235       do { \
2236           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS, _val); \
2237           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPDU_SUCCESS_S)); \
2238       } while (0)
2239  
2240  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY_M     0x0000000f
2241  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY_S              0
2242  
2243  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY_GET(_var) \
2244      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY_M) >> \
2245      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY_S)
2246  
2247  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY_SET(_var, _val) \
2248       do { \
2249           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY, _val); \
2250           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_LONG_RETRY_S)); \
2251       } while (0)
2252  
2253  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_M     0x000000f0
2254  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_S              4
2255  
2256  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_GET(_var) \
2257      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_M) >> \
2258      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_S)
2259  
2260  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_SET(_var, _val) \
2261       do { \
2262           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY, _val); \
2263           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_S)); \
2264       } while (0)
2265  
2266  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_M     0x00000100
2267  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_S              8
2268  
2269  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_GET(_var) \
2270      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_M) >> \
2271      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_S)
2272  
2273  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_SET(_var, _val) \
2274       do { \
2275           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU, _val); \
2276           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_S)); \
2277       } while (0)
2278  
2279  enum HTT_PPDU_STATS_RESP_TYPE {
2280      HTT_PPDU_STATS_NO_RESPONSE_EXPECTED_E                      = 0,
2281      HTT_PPDU_STATS_ACK_EXPECTED_E                              = 1,
2282      HTT_PPDU_STATS_BA_BITMAP_EXPECTED_E                        = 2,
2283      HTT_PPDU_STATS_UL_MU_BA_EXPECTED_E                         = 3,
2284      HTT_PPDU_STATS_UL_MU_BA_AND_DATA_EXPECTED_E                = 4,
2285      HTT_PPDU_STATS_CTS_EXPECTED_E                              = 5,
2286      HTT_PPDU_STATS_MU_CBF_EXPECTED_E                           = 6,
2287  };
2288  typedef enum HTT_PPDU_STATS_RESP_TYPE HTT_PPDU_STATS_RESP_TYPE;
2289  
2290  /* Refer HTT_PPDU_STATS_RESP_TYPE */
2291  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE_M     0x00001e00
2292  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE_S              9
2293  
2294  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE_GET(_var) \
2295      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE_M) >> \
2296      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE_S)
2297  
2298  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE_SET(_var, _val) \
2299       do { \
2300           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE, _val); \
2301           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RESP_TYPE_S)); \
2302       } while (0)
2303  
2304  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE_M  0x0000e000
2305  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE_S          13
2306  
2307  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE_GET(_var) \
2308      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE_M) >> \
2309      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE_S)
2310  
2311  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE_SET (_var , _val) \
2312      do { \
2313          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE, _val); \
2314          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MPROT_TYPE_S)); \
2315      } while (0)
2316  
2317  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_M  0x00010000
2318  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_S          16
2319  
2320  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_GET(_var) \
2321      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_M) >> \
2322      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_S)
2323  
2324  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_SET (_var, _val) \
2325      do { \
2326          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS, _val); \
2327          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_S)); \
2328      } while (0)
2329  
2330  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_M  0x00020000
2331  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_S          17
2332  
2333  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_GET(_var) \
2334      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_M) >> \
2335      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_S)
2336  
2337  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_SET (_var , _val) \
2338      do { \
2339          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE, _val); \
2340          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_S)); \
2341      } while (0)
2342  
2343  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_M  0x00040000
2344  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_S          18
2345  
2346  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_GET(_var) \
2347      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_M) >> \
2348      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_S)
2349  
2350  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_SET (_var , _val) \
2351      do { \
2352          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX, _val); \
2353          ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_S)); \
2354      } while (0)
2355  
2356  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_M     0xffffffff
2357  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_S              0
2358  
2359  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_GET(_var) \
2360      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_M) >> \
2361      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_S)
2362  
2363  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_SET(_var, _val) \
2364       do { \
2365           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI, _val); \
2366           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CHAIN_RSSI_S)); \
2367       } while (0)
2368  
2369  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK_M     0xffffffff
2370  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK_S              0
2371  
2372  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK_GET(_var) \
2373      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK_M) >> \
2374      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK_S)
2375  
2376  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK_SET(_var, _val) \
2377       do { \
2378           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK, _val); \
2379           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_TX_ANTENNA_MASK_S)); \
2380       } while (0)
2381  
2382  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING_M     0x00010000
2383  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING_S             16
2384  
2385  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING_GET(_var) \
2386      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING_M) >> \
2387      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING_S)
2388  
2389  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING_SET(_var, _val) \
2390       do { \
2391           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING, _val); \
2392           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_TRAINING_S)); \
2393       } while (0)
2394  
2395  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS_M     0x0000ffff
2396  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS_S              0
2397  
2398  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS_GET(_var) \
2399      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS_M) >> \
2400      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS_S)
2401  
2402  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS_SET(_var, _val) \
2403       do { \
2404           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS, _val); \
2405           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PENDING_TRAINING_PKTS_S)); \
2406       } while (0)
2407  
2408  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES_M     0xffffffff
2409  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES_S              0
2410  
2411  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES_GET(_var) \
2412      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES_M) >> \
2413      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES_S)
2414  
2415  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES_SET(_var, _val) \
2416       do { \
2417           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES, _val); \
2418           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_MAX_RATES_S)); \
2419       } while (0)
2420  
2421  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER_M     0xffffffff
2422  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER_S              0
2423  
2424  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER_GET(_var) \
2425      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER_M) >> \
2426      HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER_S)
2427  
2428  #define HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER_SET(_var, _val) \
2429       do { \
2430           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER, _val); \
2431           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_CURRENT_RATE_PER_S)); \
2432       } while (0)
2433  
2434  enum  HTT_PPDU_STATS_USER_COMPLETION_STATUS {
2435      HTT_PPDU_STATS_USER_STATUS_OK,
2436      HTT_PPDU_STATS_USER_STATUS_FILTERED,
2437      HTT_PPDU_STATS_USER_STATUS_RESP_TIMEOUT,
2438      HTT_PPDU_STATS_USER_STATUS_RESP_MISMATCH,
2439      HTT_PPDU_STATS_USER_STATUS_ABORT,
2440  };
2441  typedef enum HTT_PPDU_STATS_USER_COMPLETION_STATUS HTT_PPDU_STATS_USER_COMPLETION_STATUS;
2442  
2443  typedef struct {
2444      htt_tlv_hdr_t tlv_hdr;
2445      /* BIT [ 7 :   0]   :- completion_status
2446       * BIT [ 15:   8]   :- tid_num
2447       * BIT [ 31:  16]   :- sw_peer_id
2448       */
2449      union {
2450          A_UINT32 sw_peer_id__tid_num__completion_status;
2451          struct {
2452              A_UINT32 completion_status:         8,
2453                       tid_num:                   8,
2454                       sw_peer_id:               16;
2455          };
2456      };
2457  
2458      /* RSSI value of last ack packet (units = dB above noise floor) */
2459      A_UINT32 ack_rssi;
2460  
2461      /* BIT [ 15 :   0]   :- mpdu_tried
2462       * BIT [ 31 :  16]   :- mpdu_success
2463       */
2464      union {
2465          A_UINT32 mpdu_tried__mpdu_success;
2466          struct {
2467              A_UINT32 mpdu_tried:                16,
2468                       mpdu_success:              16;
2469          };
2470      };
2471  
2472      /* BIT [ 3 :   0]   :- long_retries
2473       * BIT [ 7 :   4]   :- short_retries
2474       * BIT [ 8 :   8]   :- is_ampdu
2475       * BIT [ 12:   9]   :- resp_type
2476       * BIT [ 15:  13]   :- medium protection type
2477       * BIT [ 16:  16]   :- rts_success (HW RTS)
2478       * BIT [ 17:  17]   :- rts_failure (HW RTS)
2479       * BIT [ 18:  18]   :- pream_punc_tx
2480       * BIT [ 31:  19]   :- reserved
2481       */
2482      union {
2483          /* older names */
2484          A_UINT32 resp_type_is_ampdu__short_retry__long_retry;
2485          A_UINT32 resp_type__is_ampdu__short_retry__long_retry__mprot_type__rts_success__rts_failure;
2486          /* newest name */
2487          A_UINT32 resp_type__is_ampdu__short_retry__long_retry__mprot_type__rts_success__rts_failure__pream_punc_tx;
2488          struct { /* bitfield names */
2489              A_UINT32 long_retries:               4,
2490                       short_retries:              4,
2491                       is_ampdu:                   1,
2492                       resp_type:                  4,
2493                       mprot_type:                 3,
2494                       rts_success:                1,
2495                       rts_failure:                1,
2496                       pream_punc_tx:              1,
2497                       reserved0:                 13;
2498          };
2499      };
2500  
2501      /*
2502       * ack RSSI per chain for last transmission to the peer-TID
2503       * (value in dB w.r.t noise floor)
2504       */
2505      A_UINT32 chain_rssi[HTT_STATS_MAX_CHAINS];
2506  
2507      /* Tx Antenna mask for last packet transmission */
2508      A_UINT32 tx_antenna_mask;
2509  
2510      /* For SmartAntenna
2511       * BIT [15:0]  :- pending_training_pkts
2512       *                Holds number of pending training packets during training.
2513       * BIT [16]    :- is_training
2514       *                This flag indicates if peer is under training.
2515       * BIT [31:17] :- reserved1
2516       */
2517      A_UINT32 pending_training_pkts:16,
2518               is_training:1,
2519               reserved1:15;
2520  
2521      /*
2522       * Max rates configured per BW:
2523       * for BW supported by Smart Antenna - 20MHZ, 40MHZ, 80MHZ and 160MHZ
2524       * (Note: 160 MHz is currently not supported by Smart Antenna)
2525       */
2526      A_UINT32 max_rates[HTT_STATS_NUM_SUPPORTED_BW_SMART_ANTENNA];
2527  
2528      /* PER of the last transmission to the peer-TID (in percent) */
2529      A_UINT32 current_rate_per;
2530  
2531      /*
2532       * For SW RTS
2533       * BIT [0]    :- Whether SW RTS successfully sent OTA.
2534       * BIT [1]    :- Whether SW RTS successful completion.
2535       * BIT [2]    :- Whether SW RTS failed completion.
2536       * BIT [3]    :- Whether SW RTS response with different BW.
2537       * BIT [31:4] :- reserved2
2538       */
2539      A_UINT32 sw_rts_tried:      1,
2540               sw_rts_success:    1,
2541               sw_rts_failure:    1,
2542               cts_rcvd_diff_bw:  1,
2543               reserved2:        28;
2544  
2545      /*
2546       * Max rates configured per BW:
2547       * for BW supported by Smart Antenna - 320 MHZ
2548       */
2549      A_UINT32 max_rates_ext;
2550  
2551      /* hw_prot_dur_us:
2552       * hw protection frame's FES duration in micro seconds.
2553       */
2554      A_UINT32 hw_prot_dur_us;
2555  } htt_ppdu_stats_user_cmpltn_common_tlv;
2556  
2557  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_TID_NUM_M     0x000000ff
2558  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_TID_NUM_S              0
2559  
2560  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_TID_NUM_GET(_var) \
2561      (((_var) & HTT_PPDU_STATS_EMQ_MPDU_BITMAP_TLV_TID_NUM_M) >> \
2562      HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_TID_NUM_S)
2563  
2564  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_TID_NUM_SET(_var, _val) \
2565       do { \
2566           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_TID_NUM, _val); \
2567           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_TID_NUM_S)); \
2568       } while (0)
2569  
2570  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_RESERVED_M     0x0000ff00
2571  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_RESERVED_S              8
2572  
2573  
2574  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID_M     0xffff0000
2575  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID_S             16
2576  
2577  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID_GET(_var) \
2578      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID_M) >> \
2579      HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID_S)
2580  
2581  #define HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID_SET(_var, _val) \
2582       do { \
2583           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID, _val); \
2584           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_BA_BITMAP_TLV_SW_PEER_ID_S)); \
2585       } while (0)
2586  
2587  
2588  typedef struct {
2589      htt_tlv_hdr_t tlv_hdr;
2590      /* BIT [ 7 :   0]   :- tid_num
2591       * BIT [ 15:   8]   :- reserved0
2592       * BIT [ 31:  16]   :- sw_peer_id
2593       */
2594      union {
2595          A_UINT32 sw_peer_id__tid_num;
2596          struct {
2597              A_UINT32 tid_num:        8,
2598                       reserved0:      8,
2599                       sw_peer_id:    16;
2600          };
2601      };
2602      A_UINT32 ba_seq_no;
2603      A_UINT32 ba_bitmap[HTT_BA_64_BIT_MAP_SIZE_DWORDS];
2604  } htt_ppdu_stats_user_compltn_ba_bitmap_64_tlv;
2605  
2606  typedef struct {
2607      htt_tlv_hdr_t tlv_hdr;
2608      /* BIT [ 7 :   0]   :- tid_num
2609       * BIT [ 15:   8]   :- reserved0
2610       * BIT [ 31:  16]   :- sw_peer_id
2611       */
2612      union {
2613          A_UINT32 sw_peer_id__tid_num;
2614          struct {
2615              A_UINT32 tid_num:        8,
2616                       reserved0:      8,
2617                       sw_peer_id:    16;
2618          };
2619      };
2620      A_UINT32 ba_seq_no;
2621      A_UINT32 ba_bitmap[HTT_BA_256_BIT_MAP_SIZE_DWORDS];
2622  } htt_ppdu_stats_user_compltn_ba_bitmap_256_tlv;
2623  
2624  typedef struct {
2625      htt_tlv_hdr_t tlv_hdr;
2626      /* BIT [ 7 :   0]   :- tid_num
2627       * BIT [ 15:   8]   :- reserved0
2628       * BIT [ 31:  16]   :- sw_peer_id
2629       */
2630      union {
2631          A_UINT32 sw_peer_id__tid_num;
2632          struct {
2633              A_UINT32 tid_num:        8,
2634                       reserved0:      8,
2635                       sw_peer_id:    16;
2636          };
2637      };
2638      A_UINT32 ba_seq_no;
2639      A_UINT32 ba_bitmap[HTT_BA_1024_BIT_MAP_SIZE_DWORDS];
2640  } htt_ppdu_stats_user_compltn_ba_bitmap_1024_tlv;
2641  
2642  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID_M     0x0000ffff
2643  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID_S              0
2644  
2645  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID_GET(_var) \
2646      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID_M) >> \
2647      HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID_S)
2648  
2649  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID_SET(_var, _val) \
2650       do { \
2651           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID, _val); \
2652           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_SW_PEER_ID_S)); \
2653       } while (0)
2654  
2655  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU_M     0x000001ff
2656  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU_S              0
2657  
2658  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU_GET(_var) \
2659      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU_M) >> \
2660      HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU_S)
2661  
2662  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU_SET(_var, _val) \
2663       do { \
2664           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU, _val); \
2665           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MPDU_S)); \
2666       } while (0)
2667  
2668  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_M     0x01fffe00
2669  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_S              9
2670  
2671  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_GET(_var) \
2672      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_M) >> \
2673      HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_S)
2674  
2675  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_SET(_var, _val) \
2676       do { \
2677           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU, _val); \
2678           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_S)); \
2679       } while (0)
2680  
2681  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM_M     0xfe000000
2682  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM_S             25
2683  
2684  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM_GET(_var) \
2685      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM_M) >> \
2686      HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM_S)
2687  
2688  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM_SET(_var, _val) \
2689       do { \
2690           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM, _val); \
2691           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_TID_NUM_S)); \
2692       } while (0)
2693  
2694  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ_M     0x0000ffff
2695  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ_S              0
2696  
2697  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ_GET(_var) \
2698      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ_M) >> \
2699      HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ_S)
2700  
2701  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ_SET(_var, _val) \
2702       do { \
2703           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ, _val); \
2704           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_CUR_SEQ_S)); \
2705       } while (0)
2706  
2707  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ_M     0xffff0000
2708  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ_S             16
2709  
2710  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ_GET(_var) \
2711      (((_var) & HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ_M) >> \
2712      HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ_S)
2713  
2714  #define HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ_SET(_var, _val) \
2715       do { \
2716           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ, _val); \
2717           ((_var) |= ((_val) << HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_START_SEQ_S)); \
2718       } while (0)
2719  
2720  typedef struct {
2721      htt_tlv_hdr_t tlv_hdr;
2722      A_UINT32 ppdu_id;
2723  
2724      /* BIT [ 15 :   0]   :- sw_peer_id
2725       * BIT [ 31 :  16]   :- reserved0
2726       */
2727      union {
2728          A_UINT32 rsvd_sw_peer_id;
2729          struct {
2730              A_UINT32 sw_peer_id:          16,
2731                       reserved0:           16;
2732          };
2733      };
2734  
2735      /* BIT [ 8  :   0]   :- num_mpdu
2736       * BIT [ 24 :   9]   :- num_msdu
2737       * BIT [ 31 :  25]   :- tid_num
2738       */
2739      union {
2740          A_UINT32 tid_num__num_msdu__num_mpdu;
2741          struct {
2742              A_UINT32 num_mpdu:             9,
2743                       num_msdu:            16,
2744                       tid_num:              7;
2745          };
2746      };
2747  
2748      /* BIT [ 15 :   0]   :- current_seq
2749       * BIT [ 31 :  16]   :- start_seq
2750       */
2751      union {
2752          A_UINT32 start_seq__current_seq;
2753          struct {
2754              A_UINT32 current_seq:          16,
2755                       start_seq:            16;
2756          };
2757      };
2758  
2759      A_UINT32 success_bytes;
2760  } htt_ppdu_stats_user_compltn_ack_ba_status_tlv;
2761  
2762  /* FLOW_TYPE defined in HTT_TX_FLOW_TYPE */
2763  #define HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_M     0x000000ff
2764  #define HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_S              0
2765  
2766  #define HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_GET(_var) \
2767      (((_var) & HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_M) >> \
2768      HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_S)
2769  
2770  #define HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_SET(_var, _val) \
2771       do { \
2772           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE, _val); \
2773           ((_var) |= ((_val) << HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_S)); \
2774       } while (0)
2775  
2776  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_M     0x0001ff00
2777  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_S              8
2778  
2779  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_GET(_var) \
2780      (((_var) & HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_M) >> \
2781      HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_S)
2782  
2783  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_SET(_var, _val) \
2784       do { \
2785           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU, _val); \
2786           ((_var) |= ((_val) << HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_S)); \
2787       } while (0)
2788  
2789  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_M     0x7ffe0000
2790  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_S             17
2791  
2792  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_GET(_var) \
2793      (((_var) & HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_M) >> \
2794      HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_S)
2795  
2796  #define HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_SET(_var, _val) \
2797       do { \
2798           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU, _val); \
2799           ((_var) |= ((_val) << HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_S)); \
2800       } while (0)
2801  
2802  #define HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_M     0x000000ff
2803  #define HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_S              0
2804  
2805  #define HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_GET(_var) \
2806      (((_var) & HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_M) >> \
2807      HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_S)
2808  
2809  #define HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_SET(_var, _val) \
2810       do { \
2811           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_FLUSH_TLV_TID_NUM, _val); \
2812           ((_var) |= ((_val) << HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_S)); \
2813       } while (0)
2814  
2815  #define HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_M     0x0000ff00
2816  #define HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_S              8
2817  
2818  #define HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_GET(_var) \
2819      (((_var) & HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_M) >> \
2820      HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_S)
2821  
2822  #define HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_SET(_var, _val) \
2823       do { \
2824           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE, _val); \
2825           ((_var) |= ((_val) << HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_S)); \
2826       } while (0)
2827  
2828  #define HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_M     0xffff0000
2829  #define HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_S             16
2830  
2831  #define HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_GET(_var) \
2832      (((_var) & HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_M) >> \
2833      HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_S)
2834  
2835  #define HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_SET(_var, _val) \
2836       do { \
2837           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID, _val); \
2838           ((_var) |= ((_val) << HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_S)); \
2839       } while (0)
2840  
2841  enum HTT_TX_FLOW_TYPE {
2842      HTT_TX_TID_FRAMEQ,
2843      HTT_TX_TQM_MSDUQ,
2844      HTT_TQM_MPDUQ,
2845  };
2846  
2847  enum HTT_FLUSH_STATUS_DROP_REASON {
2848      HTT_FLUSH_PEER_DELETE,
2849      HTT_FLUSH_TID_DELETE,
2850      HTT_FLUSH_TTL_EXCEEDED,
2851      HTT_FLUSH_EXCESS_RETRIES,
2852      HTT_FLUSH_REINJECT,
2853  };
2854  
2855  typedef struct {
2856      htt_tlv_hdr_t tlv_hdr;
2857  
2858      A_UINT32 drop_reason;
2859      /* BIT [ 7 :   0]   :- flow_type
2860       * BIT [ 16:   8]   :- num_mpdu
2861       * BIT [ 30:  17]   :- num_msdu
2862       * BIT [ 31:  31]   :- reserved0
2863       */
2864      union {
2865          A_UINT32 num_msdu__num_mpdu__flow_type;
2866          struct {
2867              A_UINT32 flow_type:        8,
2868                       num_mpdu:         9,
2869                       num_msdu:        14,
2870                       reserved0:        1;
2871          };
2872      };
2873  
2874      /* BIT [ 7  :   0]   :- tid_num
2875       * BIT [ 15 :   8]   :- queue_type
2876       * BIT [ 31 :  16]   :- sw_peer_id
2877       */
2878      union {
2879          A_UINT32 sw_peer_id__queue_type__tid_num;
2880          struct {
2881              A_UINT32 tid_num:          8,
2882                       queue_type:       8,
2883                       sw_peer_id:       16;
2884          };
2885      };
2886  } htt_ppdu_stats_flush_tlv;
2887  
2888  #define HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_M     0x0000ffff
2889  #define HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_S              0
2890  
2891  #define HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_GET(_var) \
2892      (((_var) & HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_M) >> \
2893      HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_S)
2894  
2895  #define HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_SET(_var, _val) \
2896       do { \
2897           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH, _val); \
2898           ((_var) |= ((_val) << HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_S)); \
2899       } while (0)
2900  
2901  typedef struct {
2902      htt_tlv_hdr_t tlv_hdr;
2903  
2904      /*
2905       * BIT [ 15 :   0]   :- frame_length
2906       * BIT [ 31 :  16]   :- reserved1
2907       */
2908      union {
2909          A_UINT32 rsvd__frame_length;
2910          struct {
2911              A_UINT32 frame_length: 16,
2912                       reserved1:    16; /* set to 0x0 */
2913          };
2914      };
2915  
2916      /* Future purpose */
2917      A_UINT32 reserved2; /* set to 0x0 */
2918      A_UINT32 reserved3; /* set to 0x0 */
2919  
2920      /* mgmt/ctrl frame payload
2921       * The size of the actual mgmt payload (in bytes) can be obtained from
2922       * the frame_length field.
2923       * The size of entire payload including the padding for alignment
2924       * (in bytes) can be derived from the length in tlv parameters,
2925       * minus the 12 bytes of the above fields.
2926       */
2927      HTT_PPDU_STATS_VAR_LEN_ARRAY1(A_UINT32, payload);
2928  } htt_ppdu_stats_tx_mgmtctrl_payload_tlv;
2929  
2930  #define HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_M     0x0000ffff
2931  #define HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_S              0
2932  
2933  #define HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_GET(_var) \
2934      (((_var) & HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_M) >> \
2935      HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_S)
2936  
2937  #define HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_SET(_var, _val) \
2938       do { \
2939           HTT_CHECK_SET_VAL(HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH, _val); \
2940           ((_var) |= ((_val) << HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_S)); \
2941       } while (0)
2942  
2943  typedef struct {
2944      htt_tlv_hdr_t tlv_hdr;
2945  
2946      /*
2947       * BIT [ 15 :   0]   :- frame_length (in bytes)
2948       * BIT [ 31 :  16]   :- reserved1
2949       */
2950      union {
2951          A_UINT32 rsvd__frame_length;
2952          struct {
2953              A_UINT32 frame_length: 16,
2954                       reserved1:    16; /* set to 0x0 */
2955          };
2956      };
2957  
2958      /* Future purpose */
2959      A_UINT32 reserved2; /* set to 0x0 */
2960      A_UINT32 reserved3; /* set to 0x0 */
2961  
2962      /* mgmt/ctrl frame payload
2963       * The size of the actual mgmt payload (in bytes) can be obtained from
2964       * the frame_length field.
2965       * The size of entire payload including the padding for alignment
2966       * (in bytes) can be derived from the length in tlv parameters,
2967       * minus the 12 bytes of the above fields.
2968       */
2969      HTT_PPDU_STATS_VAR_LEN_ARRAY1(A_UINT32, payload);
2970  } htt_ppdu_stats_rx_mgmtctrl_payload_tlv;
2971  
2972  #define HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS_M   0x000000ff
2973  #define HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS_S            0
2974  
2975  #define HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS_GET(_var) \
2976      (((_var) & HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS_M) >> \
2977      HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS_S)
2978  
2979  #define HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS_SET(_var, _val) \
2980      do { \
2981          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS, _val); \
2982          ((_var) |= ((_val) << HTT_PPDU_STATS_USERS_INFO_TLV_MAX_USERS_S)); \
2983      } while (0)
2984  
2985  #define HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE_M   0x0000ff00
2986  #define HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE_S            8
2987  
2988  #define HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE_GET(_var) \
2989      (((_var) & HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE_M) >> \
2990      HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE_S)
2991  
2992  #define HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE_SET(_var, _val) \
2993      do { \
2994          HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE, _val); \
2995          ((_var) |= ((_val) << HTT_PPDU_STATS_USERS_INFO_TLV_FRAME_TYPE_S)); \
2996      } while (0)
2997  
2998  typedef struct {
2999      htt_tlv_hdr_t tlv_hdr;
3000  
3001      /*
3002       * BIT [  7 :   0]   :- max_users
3003       * BIT [ 15 :   8]   :- frame_type (HTT_STATS_FTYPE)
3004       * BIT [ 31 :  16]   :- reserved1
3005       */
3006      union {
3007          A_UINT32 rsvd__frame_type__max_users;
3008          struct {
3009              A_UINT32 max_users: 8,
3010                       frame_type:     8,
3011                       reserved1:     16;
3012          };
3013      };
3014  } htt_ppdu_stats_users_info_tlv;
3015  
3016  typedef struct {
3017      htt_tlv_hdr_t tlv_hdr;
3018      A_UINT32 ppdu_id;
3019      A_UINT32 tid_num    : 8,
3020               reserved1  :24;
3021      A_UINT32 start_seq  :16, /* [15: 0] */
3022               /* ba_enabled:
3023                * To know if block ack established or not.
3024                * If block ack is not enabled, start_seq represents
3025                * the seq number of the current MPDU/PPDU.
3026                */
3027               ba_enabled : 1,
3028               nss        : 4,
3029               /* win_size:
3030                * Block ack window size in multiples of 32 bits.
3031                * For example: For a 64-bit block ack, win_size will be 2.
3032                */
3033               win_size   : 8,
3034               reserved2  : 3;
3035      /* The number of elements in the ba_bitmap array depends on win_size. */
3036      HTT_PPDU_STATS_VAR_LEN_ARRAY1(A_UINT32, ba_bitmap);
3037  } htt_ppdu_stats_for_smu_tlv;
3038  
3039  typedef struct {
3040      htt_tlv_hdr_t tlv_hdr;
3041      /*
3042       * BIT [  2 :   0]   :- response_reason
3043       * BIT [  6 :   3]   :- mlo_change_t1_cts2self
3044       * BIT [ 10 :   7]   :- mlo_change_t1_ppdu
3045       * BIT [ 14 :  11]   :- mlo_change_t2_response
3046       * BIT [ 18 :  15]   :- mlo_change_t3_r2r
3047       * BIT [ 19 :  19]   :- partner_link_info_valid
3048       * BIT [ 22 :  20]   :- partner_link_id
3049       * BIT [ 27 :  23]   :- partner_link_cmd_ring_id
3050       * BIT [ 28 :  28]   :- dot11ax_trigger_frame_embedded
3051       * BIT [ 31 :  29]   :- reserved_0a
3052       */
3053      A_UINT32 response_reason                                         :  3,
3054               mlo_change_t1_cts2self                                  :  4,
3055               mlo_change_t1_ppdu                                      :  4,
3056               mlo_change_t2_response                                  :  4,
3057               mlo_change_t3_r2r                                       :  4,
3058               partner_link_info_valid                                 :  1,
3059               partner_link_id                                         :  3,
3060               partner_link_cmd_ring_id                                :  5,
3061               dot11ax_trigger_frame_embedded                          :  1,
3062               reserved_0a                                             :  3;
3063      /*
3064       * BIT [ 15 :   0]   :- partner_link_schedule_id
3065       * BIT [ 31 :  16]   :- tx_rx_overlap_duration (microsecond units)
3066       */
3067      A_UINT32 partner_link_schedule_id                                : 16,
3068               tx_rx_overlap_duration_us                               : 16;
3069      /*
3070       * BIT [ 15 :   0]   :- cts2self_duration (microsecond units)
3071       * BIT [ 31 :  16]   :- ppdu_duration (microsecond units)
3072       */
3073      A_UINT32 cts2self_duration_us                                    : 16,
3074               ppdu_duration_us                                        : 16;
3075      /*
3076       * BIT [ 15 :   0]   :- response_duration (microsecond units)
3077       * BIT [ 31 :  16]   :- response_to_response_duration (microsecond units)
3078       */
3079      A_UINT32 response_duration_us                                    : 16,
3080               response_to_response_duration_us                        : 16;
3081      /*
3082       * BIT [ 15 :   0]   :- self_link_schedule_id
3083       * BIT [ 31 :  16]   :- hls_branch_debug_code
3084       */
3085      A_UINT32 self_link_schedule_id                                   : 16,
3086               hls_branch_debug_code                                   : 16;
3087      /*
3088       * BIT [ 31 :   0]   :- hls_decision_debug_info
3089       */
3090      A_UINT32 hls_decision_debug_info                                 : 32;
3091  } htt_ppdu_stats_mlo_tx_resp_tlv;
3092  
3093  typedef struct {
3094      htt_tlv_hdr_t tlv_hdr;
3095      /*
3096       * BIT [  2 :   0]   :- notification_reason
3097       * BIT [  3 :   3]   :- ml_decision
3098       * BIT [  4 :   4]   :- cts2self_padding
3099       * BIT [  5 :   5]   :- initiated_by_truncated_backoff
3100       * BIT [  8 :   6]   :- transmit_start_reason
3101       * BIT [ 14 :   9]   :- num_users
3102       * BIT [ 24 :  15]   :- nstr_mlo_sta_id
3103       * BIT [ 25 :  25]   :- block_self_ml_sync
3104       * BIT [ 26 :  26]   :- block_partner_ml_sync
3105       * BIT [ 27 :  27]   :- nstr_mlo_sta_id_valid
3106       * BIT [ 31 :  28]   :- reserved_0a
3107       */
3108      A_UINT32 notification_reason                                     :  3,
3109               ml_decision                                             :  1,
3110               cts2self_padding                                        :  1,
3111               initiated_by_truncated_backoff                          :  1,
3112               transmit_start_reason                                   :  3,
3113               num_users                                               :  6,
3114               nstr_mlo_sta_id                                         : 10,
3115               block_self_ml_sync                                      :  1,
3116               block_partner_ml_sync                                   :  1,
3117               nstr_mlo_sta_id_valid                                   :  1,
3118               reserved_0a                                             :  4;
3119      /*
3120       * BIT [ 15 :   0]   :- pdg_ppdu_duration_adjust_value (microsecond units)
3121       * BIT [ 31 :  16]   :- mlo_ppdu_duration_adjust_value (microsecond units)
3122       */
3123      A_UINT32 pdg_ppdu_duration_adjust_value_us                       : 16,
3124               mlo_ppdu_duration_adjust_value_us                       : 16;
3125      /*
3126       * BIT [ 15 :   0]   :- response_duration (microsecond units)
3127       * BIT [ 31 :  16]   :- response_to_response_duration (microsecond units)
3128       */
3129      A_UINT32 response_duration_us                                    : 16,
3130               response_to_response_duration_us                        : 16;
3131      /*
3132       * BIT [ 15 :   0]   :- schedule_id
3133       * BIT [ 20 :  16]   :- cmd_ring_id
3134       * BIT [ 31 :  21]   :- reserved_1a
3135       */
3136      A_UINT32 schedule_id                                             : 16,
3137               cmd_ring_id                                             :  5,
3138               reserved_1a                                             : 11;
3139      /*
3140       * BIT [ 31 :  0]   :- mlo_reference_timestamp (microsecond units)
3141       */
3142      A_UINT32 mlo_reference_timestamp_us                              : 32;
3143      /*
3144       * BIT [ 15 :   0]   :- cts2self_duration (microsecond units)
3145       * BIT [ 31 :  16]   :- ppdu_duration (microsecond units)
3146       */
3147      A_UINT32 cts2self_duration_us                                    : 16,
3148               ppdu_duration_us                                        : 16;
3149  } htt_ppdu_stats_mlo_tx_notification_tlv;
3150  
3151  
3152  #endif //__HTT_PPDU_STATS_H__
3153