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