1 /*
2  * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
6  *
7  *
8  * Permission to use, copy, modify, and/or distribute this software for
9  * any purpose with or without fee is hereby granted, provided that the
10  * above copyright notice and this permission notice appear in all
11  * copies.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
14  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
16  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
17  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
18  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20  * PERFORMANCE OF THIS SOFTWARE.
21  */
22 
23 /*
24  * This file was originally distributed by Qualcomm Atheros, Inc.
25  * under proprietary terms before Copyright ownership was assigned
26  * to the Linux Foundation.
27  */
28 
29 /**
30  * @file htt_isoc.h
31  *
32  * @details
33  *  This file defines the target --> host messages that configure the
34  *  host data-path SW with the information required for data transfers
35  *  to and from the target.
36  */
37 
38 #ifndef _HTT_ISOC_H_
39 #define _HTT_ISOC_H_
40 
41 #include <a_types.h>    /* A_UINT32, A_UINT8 */
42 #include <a_osapi.h>          /* A_COMPILE_TIME_ASSERT */
43 
44 #ifdef ATHR_WIN_NWF
45 #pragma warning( disable:4214 ) //bit field types other than int
46 #endif
47 
48 #include "htt_common.h"
49 
50 /*=== definitions that apply to all messages ================================*/
51 
52 typedef enum htt_isoc_t2h_msg_type {
53     /* 0x0 reserved for VERSION message (probably not needed) */
54 
55     /* PEER_INFO - specify ID and parameters of a new peer */
56     HTT_ISOC_T2H_MSG_TYPE_PEER_INFO     = 0x1,
57 
58     /* PEER_UNMAP - deallocate the ID that refers to a peer */
59     HTT_ISOC_T2H_MSG_TYPE_PEER_UNMAP    = 0x2,
60 
61     /* ADDBA - start rx aggregation for the specified peer-TID */
62     HTT_ISOC_T2H_MSG_TYPE_RX_ADDBA      = 0x3,
63 
64     /* DELBA - stop rx aggregation for the specified peer-TID */
65     HTT_ISOC_T2H_MSG_TYPE_RX_DELBA      = 0x4,
66 
67     /* TX_COMPL_IND - over-the-air tx completion notification for a tx frame */
68     HTT_ISOC_T2H_MSG_TYPE_TX_COMPL_IND  = 0x5,
69 
70     /* SEC_IND - notification of the type of security used for a new peer */
71     HTT_ISOC_T2H_MSG_TYPE_SEC_IND       = 0x6,
72 
73     /* PEER_TX_READY - the target is ready to transmit to a new peer */
74     HTT_ISOC_T2H_MSG_TYPE_PEER_TX_READY = 0x7,
75 
76     /* RX_ERR - notification that an rx frame was discarded due to errors */
77     HTT_ISOC_T2H_MSG_TYPE_RX_ERR        = 0x8,
78 
79     /*NLO_MATCH - notification that target found NLO match */
80     HTT_ISOC_T2H_MSG_TYPE_NLO_MATCH     = 0x9,
81 
82     /*NLO_SCAN_END - notification that target NLO SCAN END 1:1 map with  NLO_MATCH*/
83     HTT_ISOC_T2H_MSG_TYPE_NLO_SCAN_END  = 0xA,
84 
85     /* keep this last */
86     HTT_ISOC_T2H_NUM_MSGS
87 } htt_isoc_t2h_msg_type;
88 
89 /*
90  * HTT ISOC target to host message type -
91  * stored in bits 7:0 of the first word of the message
92  */
93 #define HTT_ISOC_T2H_MSG_TYPE_M      0xff
94 #define HTT_ISOC_T2H_MSG_TYPE_S      0
95 
96 #define HTT_ISOC_T2H_MSG_TYPE_SET(msg_addr, msg_type) \
97     (*((A_UINT8 *) msg_addr) = (msg_type))
98 #define HTT_ISOC_T2H_MSG_TYPE_GET(msg_addr) \
99     (*((A_UINT8 *) msg_addr))
100 
101 #ifndef INLINE
102 #ifdef QCA_SUPPORT_INTEGRATED_SOC
103 /* host SW */
104 #define INLINE inline
105 #else
106 /* target FW */
107 #define INLINE __inline
108 #endif
109 #define HTT_ISOC_INLINE_DEF
110 #endif /* INLINE */
111 
112 static INLINE void
htt_isoc_t2h_field_set(A_UINT32 * msg_addr32,unsigned offset32,unsigned mask,unsigned shift,unsigned value)113 htt_isoc_t2h_field_set(
114     A_UINT32 *msg_addr32,
115     unsigned offset32,
116     unsigned mask,
117     unsigned shift,
118     unsigned value)
119 {
120     /* sanity check: make sure the value fits within the field */
121     //adf_os_assert(value << shift == (value << shift) | mask);
122 
123     msg_addr32 += offset32;
124     /* clear the field */
125     *msg_addr32 &= ~mask;
126     /* write the new value */
127     *msg_addr32 |= (value << shift);
128 }
129 
130 #ifdef HTT_ISOC_INLINE_DEF
131 #undef HTT_ISOC_INLINE_DEF
132 #undef INLINE
133 #endif
134 
135 #define HTT_ISOC_T2H_FIELD_GET(msg_addr32, offset32, mask, shift) \
136     (((*(msg_addr32 + offset32)) & mask) >> shift)
137 
138 typedef enum {
139     /* ASSOC - "real" peer from STA-AP association */
140     HTT_ISOC_T2H_PEER_TYPE_ASSOC = 0x0,
141 
142     /* SELF - self-peer for unicast tx to unassociated peer */
143     HTT_ISOC_T2H_PEER_TYPE_SELF  = 0x1,
144 
145     /* BSSID - reserved for FW use for BT-AMP+IBSS */
146     HTT_ISOC_T2H_PEER_TYPE_BSSID = 0x2,
147 
148     /* BCAST - self-peer for multicast / broadcast tx */
149     HTT_ISOC_T2H_PEER_TYPE_BCAST = 0x3
150 } HTT_ISOC_T2H_PEER_TYPE_ENUM;
151 
152 enum {
153     HTT_ISOC_NON_QOS = 0,
154     HTT_ISOC_QOS     = 1
155 };
156 
157 enum {
158     HTT_ISOC_RMF_DISABLED = 0,
159     HTT_ISOC_RMF_ENABLED  = 1
160 };
161 
162 enum {
163     HTT_ISOC_TID_MGMT = 7
164 };
165 
166 
167 /*=== definitions for specific messages =====================================*/
168 
169 /*=== PEER_INFO message ===*/
170 
171 /**
172  * @brief target -> host peer info message definition
173  *
174  * @details
175  * The following diagram shows the format of the peer info message sent
176  * from the target to the host.  This layout assumes the target operates
177  * as little-endian.
178  *
179  * |31          25|24|23       18|17|16|15      11|10|9|8|7|6|            0|
180  * |-----------------------------------------------------------------------|
181  * |   mgmt DPU idx  |  bcast DPU idx  |     DPU idx     |     msg type    |
182  * |-----------------------------------------------------------------------|
183  * | mgmt DPU sig |bcast DPU sig |     DPU sig    |       peer ID          |
184  * |-----------------------------------------------------------------------|
185  * |    MAC addr 1   |    MAC addr 0   |     vdev ID     | |R|  peer type  |
186  * |-----------------------------------------------------------------------|
187  * |    MAC addr 5   |    MAC addr 4   |    MAC addr 3   |    MAC addr 2   |
188  * |-----------------------------------------------------------------------|
189  *
190  *
191  * The following field definitions describe the format of the peer info
192  * message sent from the target to the host.
193  *
194  * WORD 0:
195  *   - MSG_TYPE
196  *     Bits 7:0
197  *     Purpose: identifies this as peer info message
198  *     Value: 0x1
199  *   - DPU_IDX
200  *     Bits 15:8
201  *     Purpose: specify the DPU index (a.k.a. security key ID) to use for
202  *         unicast data frames sent to this peer
203  *     Value: key ID
204  *   - BCAST_DPU_IDX
205  *     Bits 23:16
206  *     Purpose: specify the DPU index (a.k.a. security key ID) to use for
207  *         broadcast data frames sent by this (self) peer
208  *     Value: key ID
209  *   - MGMT_DPU_IDX
210  *     Bits 31:24
211  *     Purpose: specify the DPU index (a.k.a. security key ID) to use for
212  *         unicast management frames sent by this (self) peer
213  *     Value: key ID
214  * WORD 1:
215  *   - PEER_ID
216  *     Bits 10:0
217  *     Purpose: The ID that the target has allocated to refer to the peer
218  *   - DPU_SIG
219  *     Bits 17:11
220  *     Purpose: specify the DPU signature (a.k.a. security key validity
221  *         magic number) to specify for unicast data frames sent to this peer
222  *   - BCAST_DPU_SIG
223  *     Bits 24:18
224  *     Purpose: specify the DPU signature (a.k.a. security key validity
225  *         magic number) to specify for broadcast data frames sent by this
226  *         (self) peer
227  *   - MGMT_DPU_SIG
228  *     Bits 31:25
229  *     Purpose: specify the DPU signature (a.k.a. security key validity
230  *         magic number) to specify for unicast management frames sent by this
231  *         (self) peer
232  * WORD 2:
233  *   - PEER_TYPE
234  *     Bits 5:0
235  *     Purpose: specify whether the peer in question is a real peer or
236  *         one of the types of "self-peer" created for the vdev
237  *     Value: HTT_ISOC_T2H_PEER_TYPE enum
238  *   - RMF_ENABLED (R)
239  *     Bit 6
240  *     Purpose: specify whether the peer in question has enable robust
241  *         management frames, to encrypt certain management frames
242  *     Value: HTT_ISOC_RMF enum
243  *     Value: HTT_ISOC_NON_QOS or HTT_ISOC_QOS
244  *   - VDEV_ID
245  *     Bits 15:8
246  *     Purpose: For a real peer, the vdev ID indicates which virtual device
247  *         the peer is associated with.  For a self-peer, the vdev ID shows
248  *         which virtual device the self-peer represents.
249  *   - MAC_ADDR_L16
250  *     Bits 31:16
251  *     Purpose: Identifies which peer the peer ID is for.
252  *     Value: lower 2 bytes of the peer's MAC address
253  *         For a self-peer, the peer's MAC address is the MAC address of the
254  *         vdev the self-peer represents.
255  * WORD 3:
256  *   - MAC_ADDR_U32
257  *     Bits 31:0
258  *     Purpose: Identifies which peer the peer ID is for.
259  *     Value: upper 4 bytes of the peer's MAC address
260  *         For a self-peer, the peer's MAC address is the MAC address of the
261  *         vdev the self-peer represents.
262  */
263 typedef struct htt_isoc_t2h_peer_info_s {
264     /* word 0 */
265     A_UINT32
266         msg_type:      8, /* HTT_ISOC_T2H_MSG_TYPE_PEER_INFO */
267         dpu_idx:       8,
268         bcast_dpu_idx: 8,
269         mgmt_dpu_idx:  8;
270     /* word 1 */
271     A_UINT32
272         peer_id:      11,
273         dpu_sig:       7,
274         bcast_dpu_sig: 7,
275         mgmt_dpu_sig:  7;
276     /* word 2 */
277     A_UINT32
278         peer_type:     6,
279         rmf_enabled:   1,
280         reserved0:     1,
281         vdev_id:       8,
282         mac_addr_l16: 16;
283     /* word 3 */
284     A_UINT32 mac_addr_u32;
285 } htt_isoc_t2h_peer_info_t;
286 
287 /* word 0 */
288 #define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_OFFSET32        0
289 #define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_M               0x0000ff00
290 #define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_S               8
291 
292 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_OFFSET32  0
293 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_M         0x00ff0000
294 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_S         16
295 
296 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_OFFSET32   0
297 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_M          0xff000000
298 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_S          24
299 
300 /* word 1 */
301 #define HTT_ISOC_T2H_PEER_INFO_PEER_ID_OFFSET32        1
302 #define HTT_ISOC_T2H_PEER_INFO_PEER_ID_M               0x000007ff
303 #define HTT_ISOC_T2H_PEER_INFO_PEER_ID_S               0
304 
305 #define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_OFFSET32        1
306 #define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_M               0x0003f800
307 #define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_S               11
308 
309 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_OFFSET32  1
310 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_M         0x01fc0000
311 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_S         18
312 
313 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_OFFSET32   1
314 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_M          0xfe000000
315 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_S          25
316 
317 /* word 2 */
318 #define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_OFFSET32      2
319 #define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_M             0x0000003f
320 #define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_S             0
321 
322 #define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_OFFSET32    2
323 #define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_M           0x00000040
324 #define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_S           6
325 
326 #define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_OFFSET32        2
327 #define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_M               0x0000ff00
328 #define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_S               8
329 
330 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_OFFSET32   2
331 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_M          0xffff0000
332 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_S          16
333 
334 /* word 3 */
335 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_OFFSET32   3
336 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_M          0xffffffff
337 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_S          0
338 
339 
340 /* general field access macros */
341 
342 #define HTT_ISOC_T2H_PEER_INFO_FIELD_SET(field, msg_addr, value) \
343     htt_isoc_t2h_field_set(                                      \
344         ((A_UINT32 *) msg_addr),                                 \
345         HTT_ISOC_T2H_PEER_INFO_ ## field ## _OFFSET32,           \
346         HTT_ISOC_T2H_PEER_INFO_ ## field ## _M,                  \
347         HTT_ISOC_T2H_PEER_INFO_ ## field ## _S,                  \
348         value)
349 
350 #define HTT_ISOC_T2H_PEER_INFO_FIELD_GET(field, msg_addr) \
351     HTT_ISOC_T2H_FIELD_GET(                               \
352         ((A_UINT32 *) msg_addr),                          \
353         HTT_ISOC_T2H_PEER_INFO_ ## field ## _OFFSET32,    \
354         HTT_ISOC_T2H_PEER_INFO_ ## field ## _M,           \
355         HTT_ISOC_T2H_PEER_INFO_ ## field ## _S)
356 
357 /* access macros for specific fields */
358 
359 #define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_SET(msg_addr, value) \
360     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(DPU_IDX, msg_addr, value)
361 #define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_GET(msg_addr) \
362     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(DPU_IDX, msg_addr)
363 
364 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_M_Size_Check, \
365     (HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_M >> HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_S)\
366     <= ((A_UINT8)~((A_UINT8)0)));
367 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_SET(msg_addr, value) \
368     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(BCAST_DPU_IDX, msg_addr, value)
369 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_GET(msg_addr) \
370     (A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(BCAST_DPU_IDX, msg_addr))
371 
372 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_M_Size_Check,\
373    (HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_M >> HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_S) \
374                       <= ((A_UINT8)~((A_UINT8)0)));
375 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_SET(msg_addr, value) \
376     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MGMT_DPU_IDX, msg_addr, value)
377 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_GET(msg_addr) \
378     (A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MGMT_DPU_IDX, msg_addr))
379 
380 #define HTT_ISOC_T2H_PEER_INFO_PEER_ID_SET(msg_addr, value) \
381     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(PEER_ID, msg_addr, value)
382 #define HTT_ISOC_T2H_PEER_INFO_PEER_ID_GET(msg_addr) \
383     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(PEER_ID, msg_addr)
384 
385 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_DPU_SIG_M_Size_Check,\
386   (HTT_ISOC_T2H_PEER_INFO_DPU_SIG_M >> HTT_ISOC_T2H_PEER_INFO_DPU_SIG_S)\
387                <= ((A_UINT8)~((A_UINT8)0)));
388 #define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_SET(msg_addr, value) \
389     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(DPU_SIG, msg_addr, value)
390 #define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_GET(msg_addr) \
391     (A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(DPU_SIG, msg_addr))
392 
393 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_M_Size_Check,\
394   (HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_M >> HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_S)\
395   <= ((A_UINT8)~((A_UINT8)0)));
396 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_SET(msg_addr, value) \
397     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(BCAST_DPU_SIG, msg_addr, value)
398 #define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_GET(msg_addr) \
399     (A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(BCAST_DPU_SIG, msg_addr))
400 
401 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_SET(msg_addr, value) \
402     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MGMT_DPU_SIG, msg_addr, value)
403 #define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_GET(msg_addr) \
404     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MGMT_DPU_SIG, msg_addr)
405 
406 #define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_SET(msg_addr, value) \
407     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(PEER_TYPE, msg_addr, value)
408 #define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_GET(msg_addr) \
409     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(PEER_TYPE, msg_addr)
410 
411 #define HTT_ISOC_T2H_PEER_INFO_QOS_CAPABLE_SET(msg_addr, value) \
412     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(QOS_CAPABLE, msg_addr, value)
413 #define HTT_ISOC_T2H_PEER_INFO_QOS_CAPABLE_GET(msg_addr) \
414     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(QOS_CAPABLE, msg_addr)
415 
416 #define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_SET(msg_addr, value) \
417     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(RMF_ENABLED, msg_addr, value)
418 #define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_GET(msg_addr) \
419     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(RMF_ENABLED, msg_addr)
420 
421 #define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_SET(msg_addr, value) \
422     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(VDEV_ID, msg_addr, value)
423 #define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_GET(msg_addr) \
424     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(VDEV_ID, msg_addr)
425 
426 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_SET(msg_addr, value) \
427     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MAC_ADDR_L16, msg_addr, value)
428 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_GET(msg_addr) \
429     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MAC_ADDR_L16, msg_addr)
430 
431 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_SET(msg_addr, value) \
432     HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MAC_ADDR_U32, msg_addr, value)
433 #define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_GET(msg_addr) \
434     HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MAC_ADDR_U32, msg_addr)
435 
436 /*=== PEER_UNMAP message ===*/
437 
438 /**
439  * @brief target -> host peer unmap message definition
440  *
441  * @details
442  * The following diagram shows the format of the peer unmap message sent
443  * from the target to the host.  This layout assumes the target operates
444  * as little-endian.
445  *
446  * |31                      19|18                       8|7               0|
447  * |-----------------------------------------------------------------------|
448  * |         reserved         |          peer ID         |     msg type    |
449  * |-----------------------------------------------------------------------|
450  *
451  *
452  * The following field definitions describe the format of the peer info
453  * message sent from the target to the host.
454  *
455  * WORD 0:
456  *   - MSG_TYPE
457  *     Bits 7:0
458  *     Purpose: identifies this as peer unmap message
459  *     Value: 0x2
460  *   - PEER_ID
461  *     Bits 18:8
462  *     Purpose: The ID that the target has allocated to refer to the peer
463  */
464 typedef struct htt_isoc_t2h_peer_unmap_s {
465     /* word 0 */
466     A_UINT32
467         msg_type:      8, /* HTT_ISOC_T2H_MSG_TYPE_PEER_UNMAP */
468         peer_id:      11,
469         reserved0:    13;
470 } htt_isoc_t2h_peer_unmap_t;
471 
472 /* word 0 */
473 #define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_OFFSET32        0
474 #define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_M               0x0007ff00
475 #define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_S               8
476 
477 
478 /* general field access macros */
479 
480 #define HTT_ISOC_T2H_PEER_UNMAP_FIELD_SET(field, msg_addr, value) \
481     htt_isoc_t2h_field_set(                                       \
482         ((A_UINT32 *) msg_addr),                                  \
483         HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _OFFSET32,           \
484         HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _M,                  \
485         HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _S,                  \
486         value)
487 
488 #define HTT_ISOC_T2H_PEER_UNMAP_FIELD_GET(field, msg_addr) \
489     HTT_ISOC_T2H_FIELD_GET(                                \
490         ((A_UINT32 *) msg_addr),                           \
491         HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _OFFSET32,    \
492         HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _M,           \
493         HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _S)
494 
495 /* access macros for specific fields */
496 
497 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_M_Size_Check,\
498   (HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_M >> HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_S)\
499   < ((A_UINT16)~((A_UINT16)0)));
500 #define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_SET(msg_addr, value) \
501     HTT_ISOC_T2H_PEER_UNMAP_FIELD_SET(PEER_ID, msg_addr, value)
502 #define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_GET(msg_addr) \
503     (A_UINT16)(HTT_ISOC_T2H_PEER_UNMAP_FIELD_GET(PEER_ID, msg_addr))
504 
505 /*=== ADDBA message ===*/
506 enum {
507     htt_isoc_addba_success = 0,
508     /* TBD: use different failure values to specify failure causes? */
509     htt_isoc_addba_fail = 1,
510 };
511 
512 /**
513  * @brief target -> host ADDBA message definition
514  *
515  * @details
516  * The following diagram shows the format of the rx ADDBA message sent
517  * from the target to the host:
518  *
519  * |31                      20|19  16|15     12|11    8|7               0|
520  * |---------------------------------------------------------------------|
521  * |          peer ID         |  TID |   window size   |     msg type    |
522  * |---------------------------------------------------------------------|
523  * |                  reserved                |S|      start seq num     |
524  * |---------------------------------------------------------------------|
525  *
526  * The following field definitions describe the format of the ADDBA
527  * message sent from the target to the host.
528  *
529  * WORD 0:
530  *   - MSG_TYPE
531  *     Bits 7:0
532  *     Purpose: identifies this as an ADDBA message
533  *     Value: 0x3
534  *   - WIN_SIZE
535  *     Bits 15:8
536  *     Purpose: Specifies the length of the block ack window (max = 64).
537  *     Value:
538  *         block ack window length specified by the received ADDBA
539  *         management message.
540  *   - TID
541  *     Bits 19:16
542  *     Purpose: Specifies which traffic identifier the ADDBA is for.
543  *     Value:
544  *         TID specified by the received ADDBA management message.
545  *   - PEER_ID
546  *     Bits 31:20
547  *     Purpose: Identifies which peer sent the ADDBA.
548  *     Value:
549  *         ID (hash value) used by the host for fast, direct lookup of
550  *         host SW peer info, including rx reorder states.
551  *   - START_SEQ_NUM
552  *     Bits 11:0
553  *     Purpose: Specifies the initial location of the block ack window
554  *     Value: start sequence value specified by the ADDBA-request message
555  *   - STATUS
556  *     Bit 12
557  *     Purpose: status of the WMI ADDBA request
558  *     Value: 0 - SUCCESS, 1 - FAILURE
559  */
560 typedef struct htt_isoc_t2h_addba_s {
561     /* word 0 */
562     A_UINT32 msg_type:       8, /* HTT_ISOC_T2H_MSG_TYPE_ADDBA */
563              win_size:       8,
564              tid:            4,
565              peer_id:       12;
566     /* word 1 */
567     A_UINT32 start_seq_num: 12,
568              status:         1,
569              reserved0:     19;
570 } htt_isoc_t2h_addba_t;
571 
572 /* word 0 */
573 #define HTT_ISOC_T2H_ADDBA_WIN_SIZE_OFFSET32       0
574 #define HTT_ISOC_T2H_ADDBA_WIN_SIZE_M              0x0000ff00
575 #define HTT_ISOC_T2H_ADDBA_WIN_SIZE_S              8
576 
577 #define HTT_ISOC_T2H_ADDBA_TID_OFFSET32            0
578 #define HTT_ISOC_T2H_ADDBA_TID_M                   0x000f0000
579 #define HTT_ISOC_T2H_ADDBA_TID_S                   16
580 
581 #define HTT_ISOC_T2H_ADDBA_PEER_ID_OFFSET32        0
582 #define HTT_ISOC_T2H_ADDBA_PEER_ID_M               0xfff00000
583 #define HTT_ISOC_T2H_ADDBA_PEER_ID_S               20
584 
585 /* word 1 */
586 #define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_OFFSET32  1
587 #define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_M         0x00000fff
588 #define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_S         0
589 
590 #define HTT_ISOC_T2H_ADDBA_STATUS_OFFSET32         1
591 #define HTT_ISOC_T2H_ADDBA_STATUS_M                0x00001000
592 #define HTT_ISOC_T2H_ADDBA_STATUS_S                12
593 
594 /* general field access macros */
595 #define HTT_ISOC_T2H_ADDBA_FIELD_SET(field, msg_addr, value) \
596     htt_isoc_t2h_field_set(                                       \
597         ((A_UINT32 *) msg_addr),                                  \
598         HTT_ISOC_T2H_ADDBA_ ## field ## _OFFSET32,           \
599         HTT_ISOC_T2H_ADDBA_ ## field ## _M,                  \
600         HTT_ISOC_T2H_ADDBA_ ## field ## _S,                  \
601         value)
602 
603 #define HTT_ISOC_T2H_ADDBA_FIELD_GET(field, msg_addr) \
604     HTT_ISOC_T2H_FIELD_GET(                                \
605         ((A_UINT32 *) msg_addr),                           \
606         HTT_ISOC_T2H_ADDBA_ ## field ## _OFFSET32,    \
607         HTT_ISOC_T2H_ADDBA_ ## field ## _M,           \
608         HTT_ISOC_T2H_ADDBA_ ## field ## _S)
609 
610 /* access macros for specific fields */
611 
612 #define HTT_ISOC_T2H_ADDBA_WIN_SIZE_SET(msg_addr, value) \
613     HTT_ISOC_T2H_ADDBA_FIELD_SET(WIN_SIZE, msg_addr, value)
614 #define HTT_ISOC_T2H_ADDBA_WIN_SIZE_GET(msg_addr) \
615     HTT_ISOC_T2H_ADDBA_FIELD_GET(WIN_SIZE, msg_addr)
616 
617 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_ADDBA_TID_M_Size_Check,\
618   (HTT_ISOC_T2H_ADDBA_TID_M >> HTT_ISOC_T2H_ADDBA_TID_S) \
619   < ((A_UINT8)~((A_UINT8)0)));
620 #define HTT_ISOC_T2H_ADDBA_TID_SET(msg_addr, value) \
621     HTT_ISOC_T2H_ADDBA_FIELD_SET(TID, msg_addr, value)
622 #define HTT_ISOC_T2H_ADDBA_TID_GET(msg_addr) \
623     (A_UINT8)(HTT_ISOC_T2H_ADDBA_FIELD_GET(TID, msg_addr))
624 
625 #define HTT_ISOC_T2H_ADDBA_PEER_ID_SET(msg_addr, value) \
626     HTT_ISOC_T2H_ADDBA_FIELD_SET(PEER_ID, msg_addr, value)
627 #define HTT_ISOC_T2H_ADDBA_PEER_ID_GET(msg_addr) \
628     HTT_ISOC_T2H_ADDBA_FIELD_GET(PEER_ID, msg_addr)
629 
630 #define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_SET(msg_addr, value) \
631     HTT_ISOC_T2H_ADDBA_FIELD_SET(START_SEQ_NUM, msg_addr, value)
632 #define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_GET(msg_addr) \
633     HTT_ISOC_T2H_ADDBA_FIELD_GET(START_SEQ_NUM, msg_addr)
634 
635 #define HTT_ISOC_T2H_ADDBA_STATUS_SET(msg_addr, value) \
636     HTT_ISOC_T2H_ADDBA_FIELD_SET(STATUS, msg_addr, value)
637 #define HTT_ISOC_T2H_ADDBA_STATUS_GET(msg_addr) \
638     HTT_ISOC_T2H_ADDBA_FIELD_GET(STATUS, msg_addr)
639 
640 /*=== DELBA message ===*/
641 
642 /**
643  * @brief target -> host DELBA message definition
644  *
645  * @details
646  * The following diagram shows the format of the rx DELBA message sent
647  * from the target to the host:
648  *
649  * |31                      20|19  16|15     12|11    8|7               0|
650  * |---------------------------------------------------------------------|
651  * |          peer ID         |  TID |    reserved   |S|     msg type    |
652  * |---------------------------------------------------------------------|
653  *
654  * The following field definitions describe the format of the ADDBA
655  * message sent from the target to the host.
656  *
657  * WORD 0:
658  *   - MSG_TYPE
659  *     Bits 7:0
660  *     Purpose: identifies this as an DELBA message
661  *     Value: 0x4
662  *   - TID
663  *     Bits 19:16
664  *     Purpose: Specifies which traffic identifier the DELBA is for.
665  *     Value:
666  *         TID specified by the received DELBA management message.
667  *   - PEER_ID
668  *     Bits 31:20
669  *     Purpose: Identifies which peer sent the DELBA.
670  *     Value:
671  *         ID (hash value) used by the host for fast, direct lookup of
672  *         host SW peer info, including rx reorder states.
673  *   - STATUS
674  *     Bit 8
675  *     Purpose: status of the WMI DELBA request
676  *     Value: 0 - SUCCESS, 1 - FAILURE
677  */
678 typedef struct htt_isoc_t2h_delba_s {
679     /* word 0 */
680     A_UINT32
681         msg_type:       8, /* HTT_ISOC_T2H_MSG_TYPE_DELBA */
682         status:         1,
683         reserved0:      7,
684         tid:            4,
685         peer_id:       12;
686 } htt_isoc_t2h_delba_t;
687 
688 /* word 0 */
689 #define HTT_ISOC_T2H_DELBA_TID_OFFSET32            0
690 #define HTT_ISOC_T2H_DELBA_TID_M                   0x000f0000
691 #define HTT_ISOC_T2H_DELBA_TID_S                   16
692 
693 #define HTT_ISOC_T2H_DELBA_PEER_ID_OFFSET32        0
694 #define HTT_ISOC_T2H_DELBA_PEER_ID_M               0xfff00000
695 #define HTT_ISOC_T2H_DELBA_PEER_ID_S               20
696 
697 #define HTT_ISOC_T2H_DELBA_STATUS_OFFSET32         0
698 #define HTT_ISOC_T2H_DELBA_STATUS_M                0x00000100
699 #define HTT_ISOC_T2H_DELBA_STATUS_S                8
700 
701 /* general field access macros */
702 
703 #define HTT_ISOC_T2H_DELBA_FIELD_SET(field, msg_addr, value) \
704     htt_isoc_t2h_field_set(                                       \
705         ((A_UINT32 *) msg_addr),                                  \
706         HTT_ISOC_T2H_DELBA_ ## field ## _OFFSET32,           \
707         HTT_ISOC_T2H_DELBA_ ## field ## _M,                  \
708         HTT_ISOC_T2H_DELBA_ ## field ## _S,                  \
709         value)
710 
711 #define HTT_ISOC_T2H_DELBA_FIELD_GET(field, msg_addr) \
712     HTT_ISOC_T2H_FIELD_GET(                                \
713         ((A_UINT32 *) msg_addr),                           \
714         HTT_ISOC_T2H_DELBA_ ## field ## _OFFSET32,    \
715         HTT_ISOC_T2H_DELBA_ ## field ## _M,           \
716         HTT_ISOC_T2H_DELBA_ ## field ## _S)
717 
718 /* access macros for specific fields */
719 
720 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_DELBA_TID_M_Size_Check,\
721   (HTT_ISOC_T2H_DELBA_TID_M >> HTT_ISOC_T2H_DELBA_TID_S) \
722   < ((A_UINT8)~((A_UINT8)0)));
723 #define HTT_ISOC_T2H_DELBA_TID_SET(msg_addr, value) \
724     HTT_ISOC_T2H_DELBA_FIELD_SET(TID, msg_addr, value)
725 #define HTT_ISOC_T2H_DELBA_TID_GET(msg_addr) \
726     (A_UINT8)HTT_ISOC_T2H_DELBA_FIELD_GET(TID, msg_addr)
727 
728 #define HTT_ISOC_T2H_DELBA_PEER_ID_SET(msg_addr, value) \
729     HTT_ISOC_T2H_DELBA_FIELD_SET(PEER_ID, msg_addr, value)
730 #define HTT_ISOC_T2H_DELBA_PEER_ID_GET(msg_addr) \
731     HTT_ISOC_T2H_DELBA_FIELD_GET(PEER_ID, msg_addr)
732 
733 #define HTT_ISOC_T2H_DELBA_STATUS_SET(msg_addr, value) \
734     HTT_ISOC_T2H_DELBA_FIELD_SET(STATUS, msg_addr, value)
735 #define HTT_ISOC_T2H_DELBA_STATUS_GET(msg_addr) \
736     HTT_ISOC_T2H_DELBA_FIELD_GET(STATUS, msg_addr)
737 
738 /*=== SEC_IND message ===*/
739 
740 /**
741  * @brief target -> host Security indication message definition
742  *
743  * @details
744  * The following diagram shows the format of the SEC_IND message sent
745  * from the target to the host.  This layout assumes the target operates
746  * as little-endian.
747  *
748  * |31          25|24|23       18|17|16|15      11|10|9|8|7|6|            0|
749  * |-----------------------------------------------------------------------|
750  * |   is unicast    |  sec type       |     Peer id     |     msg type    |
751  * |-----------------------------------------------------------------------|
752  * |                    mic key1                                           |
753  * |-----------------------------------------------------------------------|
754  * |                    mic key2                                           |
755  * |-----------------------------------------------------------------------|
756  *
757  *
758  * The following field definitions describe the format of the peer info
759  * message sent from the target to the host.
760  *
761  * WORD 0:
762  *   - MSG_TYPE
763  *     Bits 7:0
764  *     Purpose: identifies this as SEC_IND message
765  *     Value: 0x6
766  *   - PEER_ID
767  *     Bits 15:8
768  *     Purpose: The ID that the target has allocated to refer to the peer
769  *     Value: Peer ID
770  *   - SEC_TYPE
771  *     Bits 23:16
772  *     Purpose: specify the security encryption type
773  *     Value: htt_sec_type
774  *   - is unicast
775  *     Bits 31:24
776  *     Purpose: specify unicast/bcast
777  *     Value: 1-unicast/0-bcast
778  * WORD 1:
779  *   - MIC1
780  *     Bits 31:0
781  *     Purpose: Mickey1
782  * WORD 2:
783  *   - MIC2
784  *     Bits 31:0
785  *     Purpose: Mickey2
786  */
787 typedef struct htt_isoc_t2h_sec_ind_s {
788     /* word 0 */
789     A_UINT32
790         msg_type:      8, /* HTT_ISOC_T2H_MSG_TYPE_SEC_IND */
791         peer_id:       8,
792         sec_type:      8,
793         is_unicast:    8;
794     /* word 1 */
795     A_UINT32 mic_key1;
796     /* word 2 */
797     A_UINT32 mic_key2;
798     /* word 3 */
799     A_UINT32 status;
800 } htt_isoc_t2h_sec_ind_t;
801 
802 /* word 0 */
803 #define HTT_ISOC_T2H_SEC_IND_PEER_ID_OFFSET32        0
804 #define HTT_ISOC_T2H_SEC_IND_PEER_ID_M               0x0000ff00
805 #define HTT_ISOC_T2H_SEC_IND_PEER_ID_S               8
806 
807 #define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_OFFSET32       0
808 #define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_M              0x00ff0000
809 #define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_S              16
810 
811 #define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_OFFSET32     0
812 #define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_M            0xff000000
813 #define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_S            24
814 
815 /* word 1 */
816 #define HTT_ISOC_T2H_SEC_IND_MIC1_OFFSET32           1
817 #define HTT_ISOC_T2H_SEC_IND_MIC1_M                  0xffffffff
818 #define HTT_ISOC_T2H_SEC_IND_MIC1_S                  0
819 
820 /* word 2 */
821 #define HTT_ISOC_T2H_SEC_IND_MIC2_OFFSET32           2
822 #define HTT_ISOC_T2H_SEC_IND_MIC2_M                  0xffffffff
823 #define HTT_ISOC_T2H_SEC_IND_MIC2_S                  0
824 
825 
826 /* general field access macros */
827 #define HTT_ISOC_T2H_SEC_IND_FIELD_SET(field, msg_addr, value) \
828     htt_isoc_t2h_field_set(                                      \
829         ((A_UINT32 *) msg_addr),                                 \
830         HTT_ISOC_T2H_SEC_IND_ ## field ## _OFFSET32,           \
831         HTT_ISOC_T2H_SEC_IND_ ## field ## _M,                  \
832         HTT_ISOC_T2H_SEC_IND_ ## field ## _S,                  \
833         value)
834 
835 #define HTT_ISOC_T2H_SEC_IND_FIELD_GET(field, msg_addr) \
836     HTT_ISOC_T2H_FIELD_GET(                               \
837         ((A_UINT32 *) msg_addr),                          \
838         HTT_ISOC_T2H_SEC_IND_ ## field ## _OFFSET32,    \
839         HTT_ISOC_T2H_SEC_IND_ ## field ## _M,           \
840         HTT_ISOC_T2H_SEC_IND_ ## field ## _S)
841 
842 /* access macros for specific fields */
843 #define HTT_ISOC_T2H_SEC_IND_PEER_ID_SET(msg_addr, value) \
844     HTT_ISOC_T2H_SEC_IND_FIELD_SET(PEER_ID, msg_addr, value)
845 #define HTT_ISOC_T2H_SEC_IND_PEER_ID_GET(msg_addr) \
846     HTT_ISOC_T2H_SEC_IND_FIELD_GET(PEER_ID, msg_addr)
847 
848 #define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_SET(msg_addr, value) \
849     HTT_ISOC_T2H_SEC_IND_FIELD_SET(SEC_TYPE, msg_addr, value)
850 #define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_GET(msg_addr) \
851     HTT_ISOC_T2H_SEC_IND_FIELD_GET(SEC_TYPE, msg_addr)
852 
853 #define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_SET(msg_addr, value) \
854     HTT_ISOC_T2H_SEC_IND_FIELD_SET(IS_UNICAST, msg_addr, value)
855 #define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_GET(msg_addr) \
856     HTT_ISOC_T2H_SEC_IND_FIELD_GET(IS_UNICAST, msg_addr)
857 
858 #define HTT_ISOC_T2H_SEC_IND_MIC1_SET(msg_addr, value) \
859     HTT_ISOC_T2H_SEC_IND_FIELD_SET(MIC1, msg_addr, value)
860 #define HTT_ISOC_T2H_SEC_IND_MIC1_GET(msg_addr) \
861     HTT_ISOC_T2H_SEC_IND_FIELD_GET(MIC1, msg_addr)
862 
863 #define HTT_ISOC_T2H_SEC_IND_MIC2_SET(msg_addr, value) \
864     HTT_ISOC_T2H_SEC_IND_FIELD_SET(MIC2, msg_addr, value)
865 #define HTT_ISOC_T2H_SEC_IND_MIC2_GET(msg_addr) \
866     HTT_ISOC_T2H_SEC_IND_FIELD_GET(MIC2, msg_addr)
867 
868 /*=== PEER_TX_READY message ===*/
869 
870 /**
871  * @brief target -> host peer tx ready message definition
872  *
873  * @details
874  * The following diagram shows the format of the peer tx ready message sent
875  * from the target to the host.  This layout assumes the target operates
876  * as little-endian.
877  *
878  * |31                      19|18                       8|7               0|
879  * |-----------------------------------------------------------------------|
880  * |         reserved         |          peer ID         |     msg type    |
881  * |-----------------------------------------------------------------------|
882  *
883  *
884  * The following field definitions describe the format of the peer info
885  * message sent from the target to the host.
886  *
887  * WORD 0:
888  *   - MSG_TYPE
889  *     Bits 7:0
890  *     Purpose: identifies this as peer tx ready message
891  *     Value: 0x7
892  *   - PEER_ID
893  *     Bits 18:8
894  *     Purpose: The ID assigned to the peer by the PEER_INFO message
895  */
896 typedef struct htt_isoc_t2h_peer_tx_ready_s {
897     /* word 0 */
898     A_UINT32
899         msg_type:      8, /* HTT_ISOC_T2H_MSG_TYPE_PEER_TX_READY */
900         peer_id:      11,
901         reserved0:    13;
902 } htt_isoc_t2h_peer_tx_ready_t;
903 
904 /* word 0 */
905 #define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_OFFSET32        0
906 #define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_M               0x0007ff00
907 #define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_S               8
908 
909 
910 /* general field access macros */
911 
912 #define HTT_ISOC_T2H_PEER_TX_READY_FIELD_SET(field, msg_addr, value) \
913     htt_isoc_t2h_field_set(                                       \
914         ((A_UINT32 *) msg_addr),                                  \
915         HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _OFFSET32,           \
916         HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _M,                  \
917         HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _S,                  \
918         value)
919 
920 #define HTT_ISOC_T2H_PEER_TX_READY_FIELD_GET(field, msg_addr) \
921     HTT_ISOC_T2H_FIELD_GET(                                \
922         ((A_UINT32 *) msg_addr),                           \
923         HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _OFFSET32,    \
924         HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _M,           \
925         HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _S)
926 
927 /* access macros for specific fields */
928 
929 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_M_Size_Check, (HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_M >> HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_S) < ((A_UINT16)~((A_UINT16)0)));
930 
931 #define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_SET(msg_addr, value) \
932     HTT_ISOC_T2H_PEER_TX_READY_FIELD_SET(PEER_ID, msg_addr, value)
933 #define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_GET(msg_addr) \
934     ((A_UINT16)(HTT_ISOC_T2H_PEER_TX_READY_FIELD_GET(PEER_ID, msg_addr)))
935 
936 
937 /*=== RX_ERR message ===*/
938 
939 /**
940  * @brief target -> host rx error notification message definition
941  *
942  * @details
943  * The following diagram shows the format of the rx err message sent
944  * from the target to the host.  This layout assumes the target operates
945  * as little-endian.
946  *
947  * |31                               16|15              8|7|6|5|4       0|
948  * |---------------------------------------------------------------------|
949  * |               peer ID             |   rx err type   |    msg type   |
950  * |---------------------------------------------------------------------|
951  * |               reserved            |   rx err count  |M| r | ext TID |
952  * |---------------------------------------------------------------------|
953  * M = multicast
954  * r = reserved
955  *
956  * The following field definitions describe the format of the peer info
957  * message sent from the target to the host.
958  *
959  * WORD 0:
960  *   - MSG_TYPE
961  *     Bits 7:0
962  *     Purpose: identifies this as an rx err message
963  *     Value: 0x8
964  *   - RX_ERR_TYPE
965  *     Bits 15:8
966  *     Purpose: specifies which type of rx error is being reported
967  *     Value: htt_rx_ind_mpdu_status enum
968  *   - PEER_ID
969  *     Bits 31:16
970  *     Purpose: specify which peer sent the frame that resulted in an error
971  * WORD 1:
972  *   - EXT_TID
973  *     Bits 4:0
974  *     Purpose: specifies which traffic type had the rx error
975  *     Value: 0-15 for a real TID value, 16 for non-QoS data, 31 for unknown
976  *   - MCAST
977  *     Bit 6
978  *     Purpose: specify whether the rx error frame was unicast or multicast
979  *     Value: 0 -> unicast, 1 -> multicast
980  *   - L2_HDR_IS_80211
981  *     Bit 7
982  *     Purpose: specifies whether the included L2 header (if present) is in
983  *         802.3 or 802.11 format
984  *     Value: 0 -> 802.3, 1 -> 802.11
985  *   - L2_HDR_BYTES
986  *     Bits 15:8
987  *     Purpose: Specify the size of the L2 header in this rx error report.
988  *     Value:
989  *         If no L2 header is included, this field shall be 0.
990  *         If a 802.3 + LLC/SNAP header is included, this field shall be
991  *         14 (ethernet header) + 8 (LLC/SNAP).
992  *         If a 802.11 header is included, this field shall be 24 bytes for
993  *         a basic header, or 26 bytes if a QoS control field is included,
994  *         or 30 bytes if a 4th address is included, or 32 bytes if a 4th
995  *         address and a QoS control field are included, etc.
996  *         Though the L2 header included in the message needs to include
997  *         padding up to a 4-byte boundary, this L2 header size field need
998  *         not account for the padding following the L2 header.
999  *   - SEC_HDR_BYTES
1000  *     Bits 23:16
1001  *     Purpose: Specify the size of the security encapsulation header in
1002  *         this rx error report.
1003  *     Value:
1004  *         If no security header is included, this field shall be 0.
1005  *         If a security header is included, this field depends on the
1006  *         security type, which can be inferred from the rx error type.
1007  *         For TKIP MIC errors, the security header could be any of:
1008  *             8  - if IV / KeyID and Extended IV are included
1009  *             16 - if MIC is also included
1010  *             20 - if ICV is also included
1011  *   - RX_ERR_CNT
1012  *     Bits 31:24
1013  *     Purpose: specifies how many rx errors are reported in this message
1014  *     Value:
1015  *         Rx error reports that include a L2 header and/or security header
1016  *         will set this field to 1, to indicate that the error notification
1017  *         is for a single frame.
1018  *         Rx error reports that don't include a L2 header or security header
1019  *         can use this field to send a single message to report multiple
1020  *         erroneous rx frames.
1021  */
1022 typedef struct htt_isoc_t2h_rx_err_s {
1023     /* word 0 */
1024     A_UINT32
1025         msg_type:        8, /* HTT_ISOC_T2H_MSG_TYPE_RX_ERR */
1026         rx_err_type:     8,
1027         peer_id:        16;
1028     /* word 1 */
1029     A_UINT32
1030         ext_tid:         5,
1031         reserved1:       1,
1032         mcast:           1,
1033         l2_hdr_is_80211: 1,
1034         l2_hdr_bytes:    8,
1035         sec_hdr_bytes:   8,
1036         rx_err_cnt:      8;
1037     /* words 2 - M-1: L2 header */
1038     /* words M - N: security header */
1039 } htt_isoc_t2h_rx_err_t;
1040 
1041 /* This needs to be exact bytes for structure htt_isoc_t2h_rx_err_t
1042  *  * Since it is shared between host and FW, sizeof may not be used.
1043  *  * */
1044 #define HTT_ISOC_T2H_RX_ERR_BASE_BYTES                20
1045 
1046 /* word 0 */
1047 #define HTT_ISOC_T2H_RX_ERR_TYPE_OFFSET32             0
1048 #define HTT_ISOC_T2H_RX_ERR_TYPE_M                    0x0000ff00
1049 #define HTT_ISOC_T2H_RX_ERR_TYPE_S                    8
1050 
1051 #define HTT_ISOC_T2H_RX_ERR_PEER_ID_OFFSET32          0
1052 #define HTT_ISOC_T2H_RX_ERR_PEER_ID_M                 0xffff0000
1053 #define HTT_ISOC_T2H_RX_ERR_PEER_ID_S                 16
1054 
1055 /* word 1 */
1056 #define HTT_ISOC_T2H_RX_ERR_EXT_TID_OFFSET32          1
1057 #define HTT_ISOC_T2H_RX_ERR_EXT_TID_M                 0x0000001f
1058 #define HTT_ISOC_T2H_RX_ERR_EXT_TID_S                 0
1059 
1060 #define HTT_ISOC_T2H_RX_ERR_MCAST_OFFSET32            1
1061 #define HTT_ISOC_T2H_RX_ERR_MCAST_M                   0x00000040
1062 #define HTT_ISOC_T2H_RX_ERR_MCAST_S                   6
1063 
1064 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_OFFSET32  1
1065 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_M         0x00000080
1066 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_S         7
1067 
1068 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_OFFSET32     1
1069 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_M            0x0000ff00
1070 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_S            8
1071 
1072 #define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_OFFSET32    1
1073 #define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_M           0x00ff0000
1074 #define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_S           16
1075 
1076 #define HTT_ISOC_T2H_RX_ERR_CNT_OFFSET32              1
1077 #define HTT_ISOC_T2H_RX_ERR_CNT_M                     0xff000000
1078 #define HTT_ISOC_T2H_RX_ERR_CNT_S                     24
1079 
1080 
1081 /* general field access macros */
1082 
1083 #define HTT_ISOC_T2H_RX_ERR_FIELD_SET(field, msg_addr, value) \
1084     htt_isoc_t2h_field_set(                                       \
1085         ((A_UINT32 *) msg_addr),                                  \
1086         HTT_ISOC_T2H_RX_ERR_ ## field ## _OFFSET32,           \
1087         HTT_ISOC_T2H_RX_ERR_ ## field ## _M,                  \
1088         HTT_ISOC_T2H_RX_ERR_ ## field ## _S,                  \
1089         value)
1090 
1091 #define HTT_ISOC_T2H_RX_ERR_FIELD_GET(field, msg_addr) \
1092     HTT_ISOC_T2H_FIELD_GET(                                \
1093         ((A_UINT32 *) msg_addr),                           \
1094         HTT_ISOC_T2H_RX_ERR_ ## field ## _OFFSET32,    \
1095         HTT_ISOC_T2H_RX_ERR_ ## field ## _M,           \
1096         HTT_ISOC_T2H_RX_ERR_ ## field ## _S)
1097 
1098 /* access macros for specific fields */
1099 
1100 #define HTT_ISOC_T2H_RX_ERR_TYPE_SET(msg_addr, value) \
1101     HTT_ISOC_T2H_RX_ERR_FIELD_SET(TYPE, msg_addr, value)
1102 #define HTT_ISOC_T2H_RX_ERR_TYPE_GET(msg_addr) \
1103     HTT_ISOC_T2H_RX_ERR_FIELD_GET(TYPE, msg_addr)
1104 
1105 A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_RX_ERR_PEER_ID_M_Size_Check, (HTT_ISOC_T2H_RX_ERR_PEER_ID_M >> HTT_ISOC_T2H_RX_ERR_PEER_ID_S) <= ((A_UINT16)~((A_UINT16)0)));
1106 #define HTT_ISOC_T2H_RX_ERR_PEER_ID_SET(msg_addr, value) \
1107     HTT_ISOC_T2H_RX_ERR_FIELD_SET(PEER_ID, msg_addr, value)
1108 #define HTT_ISOC_T2H_RX_ERR_PEER_ID_GET(msg_addr) \
1109     ((A_UINT16)HTT_ISOC_T2H_RX_ERR_FIELD_GET(PEER_ID, msg_addr))
1110 
1111 #define HTT_ISOC_T2H_RX_ERR_EXT_TID_SET(msg_addr, value) \
1112     HTT_ISOC_T2H_RX_ERR_FIELD_SET(EXT_TID, msg_addr, value)
1113 #define HTT_ISOC_T2H_RX_ERR_EXT_TID_GET(msg_addr) \
1114     HTT_ISOC_T2H_RX_ERR_FIELD_GET(EXT_TID, msg_addr)
1115 
1116 #define HTT_ISOC_T2H_RX_ERR_MCAST_SET(msg_addr, value) \
1117     HTT_ISOC_T2H_RX_ERR_FIELD_SET(MCAST, msg_addr, value)
1118 #define HTT_ISOC_T2H_RX_ERR_MCAST_GET(msg_addr) \
1119     HTT_ISOC_T2H_RX_ERR_FIELD_GET(MCAST, msg_addr)
1120 
1121 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_SET(msg_addr, value) \
1122     HTT_ISOC_T2H_RX_ERR_FIELD_SET(L2_HDR_IS_80211, msg_addr, value)
1123 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_GET(msg_addr) \
1124     HTT_ISOC_T2H_RX_ERR_FIELD_GET(L2_HDR_IS_80211, msg_addr)
1125 
1126 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_SET(msg_addr, value) \
1127     HTT_ISOC_T2H_RX_ERR_FIELD_SET(L2_HDR_BYTES, msg_addr, value)
1128 #define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_GET(msg_addr) \
1129     HTT_ISOC_T2H_RX_ERR_FIELD_GET(L2_HDR_BYTES, msg_addr)
1130 
1131 #define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_SET(msg_addr, value) \
1132     HTT_ISOC_T2H_RX_ERR_FIELD_SET(SEC_HDR_BYTES, msg_addr, value)
1133 #define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_GET(msg_addr) \
1134     HTT_ISOC_T2H_RX_ERR_FIELD_GET(SEC_HDR_BYTES, msg_addr)
1135 
1136 #define HTT_ISOC_T2H_RX_ERR_CNT_SET(msg_addr, value) \
1137     HTT_ISOC_T2H_RX_ERR_FIELD_SET(CNT, msg_addr, value)
1138 #define HTT_ISOC_T2H_RX_ERR_CNT_GET(msg_addr) \
1139     HTT_ISOC_T2H_RX_ERR_FIELD_GET(CNT, msg_addr)
1140 
1141 /*=== TX OTA complete indication message ===*/
1142 
1143 /**
1144  * @brief target -> tx complete indicate message
1145  *
1146  * @details
1147  * The following diagram shows the format of the tx complete indication message sent
1148  * from the target to the host.  This layout assumes the target operates
1149  * as little-endian.
1150  *
1151  * |31                      19|18                       8|7               0|
1152  * |-----------------------------------------------------------------------|
1153  * |         reserved         |          status          |     msg type    |
1154  * |-----------------------------------------------------------------------|
1155  *
1156  *
1157  * The following field definitions describe the format of the peer info
1158  * message sent from the target to the host.
1159  *
1160  * WORD 0:
1161  *   - MSG_TYPE
1162  *     Bits 7:0
1163  *     Purpose: identifies this as tx complete indication message
1164  *     Value: 0x7
1165  *   - status
1166  *     Bits 18:8
1167  *     Purpose: TX completion status
1168  */
1169 typedef struct htt_isoc_t2h_tx_compl_s {
1170     /* word 0 */
1171     A_UINT32
1172         msg_type:      8, /* HTT_ISOC_T2H_MSG_TYPE_TX_COMPL_IND */
1173         status:       11,
1174         reserved0:    13;
1175 } htt_isoc_t2h_tx_compl_t;
1176 
1177 /* word 0 */
1178 #define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_OFFSET32        0
1179 #define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_M               0x0007ff00
1180 #define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_S               8
1181 
1182 
1183 /* general field access macros */
1184 
1185 #define HTT_ISOC_T2H_TX_COMPL_IND_FIELD_SET(field, msg_addr, value) \
1186     htt_isoc_t2h_field_set(                                       \
1187         ((A_UINT32 *) msg_addr),                                  \
1188         HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _OFFSET32,           \
1189         HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _M,                  \
1190         HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _S,                  \
1191         value)
1192 
1193 #define HTT_ISOC_T2H_TX_COMPL_IND_FIELD_GET(field, msg_addr) \
1194     HTT_ISOC_T2H_FIELD_GET(                                \
1195         ((A_UINT32 *) msg_addr),                           \
1196         HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _OFFSET32,    \
1197         HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _M,           \
1198         HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _S)
1199 
1200 /* access macros for specific fields */
1201 
1202 #define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_SET(msg_addr, value) \
1203     HTT_ISOC_T2H_TX_COMPL_IND_FIELD_SET(STATUS, msg_addr, value)
1204 #define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_GET(msg_addr) \
1205     HTT_ISOC_T2H_TX_COMPL_IND_FIELD_GET(STATUS, msg_addr)
1206 
1207 #define HTT_TX_COMPL_IND_STAT_OK          0
1208 #define HTT_TX_COMPL_IND_STAT_DISCARD     1
1209 #define HTT_TX_COMPL_IND_STAT_NO_ACK      2
1210 #define HTT_TX_COMPL_IND_STAT_POSTPONE    3
1211 
1212 /*=== NLO indication message ===*/
1213 
1214 /**
1215 * @brief target -> NLO indicate message
1216 *
1217 * @details
1218 * The following diagram shows the format of the NLO indication message sent
1219 * from the target to the host.  This layout assumes the target operates
1220 * as little-endian.
1221 *
1222 * |31                                                  8|7               0|
1223 * |-----------------------------------------------------------------------|
1224 * |                      reserved                       |     msg type    |
1225 * |-----------------------------------------------------------------------|
1226 *
1227  *
1228  * The following field definitions describe the format of NLO MATCH indication
1229 * message sent from the target to the host.
1230 *
1231 * WORD 0:
1232 *   - MSG_TYPE
1233 *     Bits 7:0
1234 *     Purpose: identifies this as NLO indication message
1235 *     Value: 0x9 - HTT_ISOC_T2H_MSG_TYPE_NLO_MATCH
1236 *     Value: 0xA - HTT_ISOC_T2H_MSG_TYPE_NLO_SCAN_END
1237 */
1238 typedef struct htt_isoc_t2h_nlo_ind_s {
1239     /* word 0 */
1240     A_UINT32
1241         msg_type:      8,
1242         vdev_id:       8,
1243         reserved0:    16;
1244 } htt_isoc_t2h_nlo_ind_t;
1245 
1246 /* word 0 */
1247 #define HTT_ISOC_T2H_NLO_IND_VDEVID_OFFSET32            0
1248 #define HTT_ISOC_T2H_NLO_IND_VDEVID_M                   0x0000ff00
1249 #define HTT_ISOC_T2H_NLO_IND_VDEVID_S                   8
1250 
1251 
1252 /* general field access macros */
1253 
1254 #define HTT_ISOC_T2H_NLO_IND_FIELD_SET(field, msg_addr, value)  \
1255     htt_isoc_t2h_field_set(                                     \
1256         ((A_UINT32 *) msg_addr),                                \
1257         HTT_ISOC_T2H_NLO_IND_ ## field ## _OFFSET32,            \
1258         HTT_ISOC_T2H_NLO_IND_ ## field ## _M,                   \
1259         HTT_ISOC_T2H_NLO_IND_ ## field ## _S,                   \
1260         value)
1261 
1262 #define HTT_ISOC_T2H_NLO_IND_FIELD_GET(field, msg_addr)     \
1263     HTT_ISOC_T2H_FIELD_GET(                                 \
1264         ((A_UINT32 *) msg_addr),                            \
1265         HTT_ISOC_T2H_NLO_IND_ ## field ## _OFFSET32,        \
1266         HTT_ISOC_T2H_NLO_IND_ ## field ## _M,               \
1267         HTT_ISOC_T2H_NLO_IND_ ## field ## _S)
1268 
1269 /* access macros for specific fields */
1270 
1271 #define HTT_ISOC_T2H_NLO_IND_VDEVID_SET(msg_addr, value) \
1272     HTT_ISOC_T2H_NLO_IND_FIELD_SET(VDEVID, msg_addr, value)
1273 #define HTT_ISOC_T2H_NLO_IND_VDEVID_GET(msg_addr) \
1274     HTT_ISOC_T2H_NLO_IND_FIELD_GET(VDEVID, msg_addr)
1275 
1276 
1277 #endif /* _HTT_ISOC_H_ */
1278