/*
 * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

/**
 * @file htt_isoc.h
 *
 * @details
 *  This file defines the target --> host messages that configure the
 *  host data-path SW with the information required for data transfers
 *  to and from the target.
 */

#ifndef _HTT_ISOC_H_
#define _HTT_ISOC_H_

#include <a_types.h>    /* A_UINT32, A_UINT8 */
#include <a_osapi.h>          /* A_COMPILE_TIME_ASSERT */

#ifdef ATHR_WIN_NWF
#pragma warning(disable:4214) /* bit field types other than int */
#endif

#include "htt_common.h"

/*=== definitions that apply to all messages ================================*/

typedef enum htt_isoc_t2h_msg_type {
	/* 0x0 reserved for VERSION message (probably not needed) */

	/* PEER_INFO - specify ID and parameters of a new peer */
	HTT_ISOC_T2H_MSG_TYPE_PEER_INFO = 0x1,

	/* PEER_UNMAP - deallocate the ID that refers to a peer */
	HTT_ISOC_T2H_MSG_TYPE_PEER_UNMAP = 0x2,

	/* ADDBA - start rx aggregation for the specified peer-TID */
	HTT_ISOC_T2H_MSG_TYPE_RX_ADDBA = 0x3,

	/* DELBA - stop rx aggregation for the specified peer-TID */
	HTT_ISOC_T2H_MSG_TYPE_RX_DELBA = 0x4,

	/* TX_COMPL_IND - over-the-air tx completion notification for a tx frame */
	HTT_ISOC_T2H_MSG_TYPE_TX_COMPL_IND = 0x5,

	/* SEC_IND - notification of the type of security used for a new peer */
	HTT_ISOC_T2H_MSG_TYPE_SEC_IND = 0x6,

	/* PEER_TX_READY - the target is ready to transmit to a new peer */
	HTT_ISOC_T2H_MSG_TYPE_PEER_TX_READY = 0x7,

	/* RX_ERR - notification that an rx frame was discarded due to errors */
	HTT_ISOC_T2H_MSG_TYPE_RX_ERR = 0x8,

	/* NLO_MATCH - notification that target found NLO match */
	HTT_ISOC_T2H_MSG_TYPE_NLO_MATCH     = 0x9,

	/* NLO_SCAN_END - notification that target NLO SCAN END 1:1 map with  NLO_MATCH */
	HTT_ISOC_T2H_MSG_TYPE_NLO_SCAN_END  = 0xA,
	/* keep this last */
	HTT_ISOC_T2H_NUM_MSGS
} htt_isoc_t2h_msg_type;

/*
 * HTT ISOC target to host message type -
 * stored in bits 7:0 of the first word of the message
 */
#define HTT_ISOC_T2H_MSG_TYPE_M      0xff
#define HTT_ISOC_T2H_MSG_TYPE_S      0

#define HTT_ISOC_T2H_MSG_TYPE_SET(msg_addr, msg_type) \
	(*((A_UINT8 *) msg_addr) = (msg_type))
#define HTT_ISOC_T2H_MSG_TYPE_GET(msg_addr) \
	(*((A_UINT8 *) msg_addr))

#ifndef INLINE
#ifdef QCA_SUPPORT_INTEGRATED_SOC
/* host SW */
#define INLINE inline
#else
/* target FW */
#define INLINE __inline
#endif
#define HTT_ISOC_INLINE_DEF
#endif /* INLINE */

static INLINE void
htt_isoc_t2h_field_set(
	A_UINT32 *msg_addr32,
	unsigned offset32,
	unsigned mask,
	unsigned shift,
	unsigned value)
{
	/* sanity check: make sure the value fits within the field */
	/* qdf_assert(value << shift == (value << shift) | mask); */

	msg_addr32 += offset32;
	/* clear the field */
	*msg_addr32 &= ~mask;
	/* write the new value */
	*msg_addr32 |= (value << shift);
}

#ifdef HTT_ISOC_INLINE_DEF
#undef HTT_ISOC_INLINE_DEF
#undef INLINE
#endif

#define HTT_ISOC_T2H_FIELD_GET(msg_addr32, offset32, mask, shift) \
	(((*(msg_addr32 + offset32)) & mask) >> shift)

typedef enum {
	/* ASSOC - "real" peer from STA-AP association */
	HTT_ISOC_T2H_PEER_TYPE_ASSOC = 0x0,

	/* SELF - self-peer for unicast tx to unassociated peer */
	HTT_ISOC_T2H_PEER_TYPE_SELF = 0x1,

	/* BSSID - reserved for FW use for BT-AMP+IBSS */
	HTT_ISOC_T2H_PEER_TYPE_BSSID = 0x2,

	/* BCAST - self-peer for multicast / broadcast tx */
	HTT_ISOC_T2H_PEER_TYPE_BCAST = 0x3
} HTT_ISOC_T2H_PEER_TYPE_ENUM;

enum {
	HTT_ISOC_NON_QOS = 0,
	HTT_ISOC_QOS = 1
};

enum {
	HTT_ISOC_RMF_DISABLED = 0,
	HTT_ISOC_RMF_ENABLED = 1
};

enum {
	HTT_ISOC_TID_MGMT = 7
};

/*=== definitions for specific messages =====================================*/

/*=== PEER_INFO message ===*/

/**
 * @brief target -> host peer info message definition
 *
 * @details
 * The following diagram shows the format of the peer info message sent
 * from the target to the host.  This layout assumes the target operates
 * as little-endian.
 *
 * |31          25|24|23       18|17|16|15      11|10|9|8|7|6|            0|
 * |-----------------------------------------------------------------------|
 * |   mgmt DPU idx  |  bcast DPU idx  |     DPU idx     |     msg type    |
 * |-----------------------------------------------------------------------|
 * | mgmt DPU sig |bcast DPU sig |     DPU sig    |       peer ID          |
 * |-----------------------------------------------------------------------|
 * |    MAC addr 1   |    MAC addr 0   |     vdev ID     | |R|  peer type  |
 * |-----------------------------------------------------------------------|
 * |    MAC addr 5   |    MAC addr 4   |    MAC addr 3   |    MAC addr 2   |
 * |-----------------------------------------------------------------------|
 *
 *
 * The following field definitions describe the format of the peer info
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as peer info message
 *     Value: 0x1
 *   - DPU_IDX
 *     Bits 15:8
 *     Purpose: specify the DPU index (a.k.a. security key ID) to use for
 *         unicast data frames sent to this peer
 *     Value: key ID
 *   - BCAST_DPU_IDX
 *     Bits 23:16
 *     Purpose: specify the DPU index (a.k.a. security key ID) to use for
 *         broadcast data frames sent by this (self) peer
 *     Value: key ID
 *   - MGMT_DPU_IDX
 *     Bits 31:24
 *     Purpose: specify the DPU index (a.k.a. security key ID) to use for
 *         unicast management frames sent by this (self) peer
 *     Value: key ID
 * WORD 1:
 *   - PEER_ID
 *     Bits 10:0
 *     Purpose: The ID that the target has allocated to refer to the peer
 *   - DPU_SIG
 *     Bits 17:11
 *     Purpose: specify the DPU signature (a.k.a. security key validity
 *         magic number) to specify for unicast data frames sent to this peer
 *   - BCAST_DPU_SIG
 *     Bits 24:18
 *     Purpose: specify the DPU signature (a.k.a. security key validity
 *         magic number) to specify for broadcast data frames sent by this
 *         (self) peer
 *   - MGMT_DPU_SIG
 *     Bits 31:25
 *     Purpose: specify the DPU signature (a.k.a. security key validity
 *         magic number) to specify for unicast management frames sent by this
 *         (self) peer
 * WORD 2:
 *   - PEER_TYPE
 *     Bits 5:0
 *     Purpose: specify whether the peer in question is a real peer or
 *         one of the types of "self-peer" created for the vdev
 *     Value: HTT_ISOC_T2H_PEER_TYPE enum
 *   - RMF_ENABLED (R)
 *     Bit 6
 *     Purpose: specify whether the peer in question has enable robust
 *         management frames, to encrypt certain managment frames
 *     Value: HTT_ISOC_RMF enum
 *     Value: HTT_ISOC_NON_QOS or HTT_ISOC_QOS
 *   - VDEV_ID
 *     Bits 15:8
 *     Purpose: For a real peer, the vdev ID indicates which virtual device
 *         the peer is associated with.  For a self-peer, the vdev ID shows
 *         which virtual device the self-peer represents.
 *   - MAC_ADDR_L16
 *     Bits 31:16
 *     Purpose: Identifies which peer the peer ID is for.
 *     Value: lower 2 bytes of the peer's MAC address
 *         For a self-peer, the peer's MAC address is the MAC address of the
 *         vdev the self-peer represents.
 * WORD 3:
 *   - MAC_ADDR_U32
 *     Bits 31:0
 *     Purpose: Identifies which peer the peer ID is for.
 *     Value: upper 4 bytes of the peer's MAC address
 *         For a self-peer, the peer's MAC address is the MAC address of the
 *         vdev the self-peer represents.
 */
typedef struct htt_isoc_t2h_peer_info_s {
	/* word 0 */
	A_UINT32 msg_type:8,    /* HTT_ISOC_T2H_MSG_TYPE_PEER_INFO */
		 dpu_idx:8, bcast_dpu_idx:8, mgmt_dpu_idx:8;
	/* word 1 */
	A_UINT32 peer_id:11, dpu_sig:7, bcast_dpu_sig:7, mgmt_dpu_sig:7;
	/* word 2 */
	A_UINT32
		peer_type:6, rmf_enabled:1, reserved0:1, vdev_id:8, mac_addr_l16:16;
	/* word 3 */
	A_UINT32 mac_addr_u32;
} htt_isoc_t2h_peer_info_t;

/* word 0 */
#define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_OFFSET32        0
#define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_M               0x0000ff00
#define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_S               8

#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_OFFSET32  0
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_M         0x00ff0000
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_S         16

#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_OFFSET32   0
#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_M          0xff000000
#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_S          24

/* word 1 */
#define HTT_ISOC_T2H_PEER_INFO_PEER_ID_OFFSET32        1
#define HTT_ISOC_T2H_PEER_INFO_PEER_ID_M               0x000007ff
#define HTT_ISOC_T2H_PEER_INFO_PEER_ID_S               0

#define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_OFFSET32        1
#define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_M               0x0003f800
#define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_S               11

#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_OFFSET32  1
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_M         0x01fc0000
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_S         18

#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_OFFSET32   1
#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_M          0xfe000000
#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_S          25

/* word 2 */
#define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_OFFSET32      2
#define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_M             0x0000003f
#define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_S             0

#define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_OFFSET32    2
#define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_M           0x00000040
#define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_S           6

#define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_OFFSET32        2
#define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_M               0x0000ff00
#define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_S               8

#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_OFFSET32   2
#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_M          0xffff0000
#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_S          16

/* word 3 */
#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_OFFSET32   3
#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_M          0xffffffff
#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_S          0

/* general field access macros */

#define HTT_ISOC_T2H_PEER_INFO_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(					     \
		((A_UINT32 *) msg_addr),				 \
		HTT_ISOC_T2H_PEER_INFO_ ## field ## _OFFSET32,		 \
		HTT_ISOC_T2H_PEER_INFO_ ## field ## _M,			 \
		HTT_ISOC_T2H_PEER_INFO_ ## field ## _S,			 \
		value)

#define HTT_ISOC_T2H_PEER_INFO_FIELD_GET(field, msg_addr) \
	HTT_ISOC_T2H_FIELD_GET(				      \
		((A_UINT32 *) msg_addr),			  \
		HTT_ISOC_T2H_PEER_INFO_ ## field ## _OFFSET32,	  \
		HTT_ISOC_T2H_PEER_INFO_ ## field ## _M,		  \
		HTT_ISOC_T2H_PEER_INFO_ ## field ## _S)

/* access macros for specific fields */

#define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(DPU_IDX, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_DPU_IDX_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(DPU_IDX, msg_addr)

A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_M_Size_Check,
	(HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_M >> HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_S) \
		<= ((A_UINT8)~((A_UINT8)0)));
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(BCAST_DPU_IDX, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_IDX_GET(msg_addr) \
	(A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(BCAST_DPU_IDX, msg_addr))

A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_M_Size_Check,
	(HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_M >> HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_S) \
		<= ((A_UINT8)~((A_UINT8)0)));
#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MGMT_DPU_IDX, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_IDX_GET(msg_addr) \
	(A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MGMT_DPU_IDX, msg_addr))

#define HTT_ISOC_T2H_PEER_INFO_PEER_ID_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(PEER_ID, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_PEER_ID_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(PEER_ID, msg_addr)

A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_DPU_SIG_M_Size_Check,
	(HTT_ISOC_T2H_PEER_INFO_DPU_SIG_M >> HTT_ISOC_T2H_PEER_INFO_DPU_SIG_S)\
		<= ((A_UINT8)~((A_UINT8)0)));
#define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(DPU_SIG, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_DPU_SIG_GET(msg_addr) \
	(A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(DPU_SIG, msg_addr))

A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_M_Size_Check,
	(HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_M >> HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_S)\
		<= ((A_UINT8)~((A_UINT8)0)));
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(BCAST_DPU_SIG, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_BCAST_DPU_SIG_GET(msg_addr) \
	(A_UINT8)(HTT_ISOC_T2H_PEER_INFO_FIELD_GET(BCAST_DPU_SIG, msg_addr))

#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MGMT_DPU_SIG, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_MGMT_DPU_SIG_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MGMT_DPU_SIG, msg_addr)

#define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(PEER_TYPE, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_PEER_TYPE_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(PEER_TYPE, msg_addr)

#define HTT_ISOC_T2H_PEER_INFO_QOS_CAPABLE_SET(msg_addr, value)	\
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(QOS_CAPABLE, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_QOS_CAPABLE_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(QOS_CAPABLE, msg_addr)

#define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_SET(msg_addr, value)	\
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(RMF_ENABLED, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_RMF_ENABLED_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(RMF_ENABLED, msg_addr)

#define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(VDEV_ID, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_VDEV_ID_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(VDEV_ID, msg_addr)

#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MAC_ADDR_L16, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_L16_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MAC_ADDR_L16, msg_addr)

#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_SET(MAC_ADDR_U32, msg_addr, value)
#define HTT_ISOC_T2H_PEER_INFO_MAC_ADDR_U32_GET(msg_addr) \
	HTT_ISOC_T2H_PEER_INFO_FIELD_GET(MAC_ADDR_U32, msg_addr)

/*=== PEER_UNMAP message ===*/

/**
 * @brief target -> host peer unmap message definition
 *
 * @details
 * The following diagram shows the format of the peer unmap message sent
 * from the target to the host.  This layout assumes the target operates
 * as little-endian.
 *
 * |31                      19|18                       8|7               0|
 * |-----------------------------------------------------------------------|
 * |         reserved         |          peer ID         |     msg type    |
 * |-----------------------------------------------------------------------|
 *
 *
 * The following field definitions describe the format of the peer info
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as peer unmap message
 *     Value: 0x2
 *   - PEER_ID
 *     Bits 18:8
 *     Purpose: The ID that the target has allocated to refer to the peer
 */
typedef struct htt_isoc_t2h_peer_unmap_s {
	/* word 0 */
	A_UINT32 msg_type:8,    /* HTT_ISOC_T2H_MSG_TYPE_PEER_UNMAP */
		 peer_id:11, reserved0:13;
} htt_isoc_t2h_peer_unmap_t;

/* word 0 */
#define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_OFFSET32        0
#define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_M               0x0007ff00
#define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_S               8

/* general field access macros */

#define HTT_ISOC_T2H_PEER_UNMAP_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(					      \
		((A_UINT32 *) msg_addr),				  \
		HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _OFFSET32,		  \
		HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _M,		  \
		HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _S,		  \
		value)

#define HTT_ISOC_T2H_PEER_UNMAP_FIELD_GET(field, msg_addr) \
	HTT_ISOC_T2H_FIELD_GET(				       \
		((A_UINT32 *) msg_addr),			   \
		HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _OFFSET32,	   \
		HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _M,	   \
		HTT_ISOC_T2H_PEER_UNMAP_ ## field ## _S)

/* access macros for specific fields */

A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_M_Size_Check,
	(HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_M >> HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_S) \
		< ((A_UINT16)~((A_UINT16)0)));
#define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_UNMAP_FIELD_SET(PEER_ID, msg_addr, value)
#define HTT_ISOC_T2H_PEER_UNMAP_PEER_ID_GET(msg_addr) \
	(A_UINT16)(HTT_ISOC_T2H_PEER_UNMAP_FIELD_GET(PEER_ID, msg_addr))

/*=== ADDBA message ===*/
enum {
	htt_isoc_addba_success = 0,
	/* TBD: use different failure values to specify failure causes? */
	htt_isoc_addba_fail = 1,
};

/**
 * @brief target -> host ADDBA message definition
 *
 * @details
 * The following diagram shows the format of the rx ADDBA message sent
 * from the target to the host:
 *
 * |31                      20|19  16|15     12|11    8|7               0|
 * |---------------------------------------------------------------------|
 * |          peer ID         |  TID |   window size   |     msg type    |
 * |---------------------------------------------------------------------|
 * |                  reserved                |S|      start seq num     |
 * |---------------------------------------------------------------------|
 *
 * The following field definitions describe the format of the ADDBA
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as an ADDBA message
 *     Value: 0x3
 *   - WIN_SIZE
 *     Bits 15:8
 *     Purpose: Specifies the length of the block ack window (max = 64).
 *     Value:
 *         block ack window length specified by the received ADDBA
 *         management message.
 *   - TID
 *     Bits 19:16
 *     Purpose: Specifies which traffic identifier the ADDBA is for.
 *     Value:
 *         TID specified by the received ADDBA management message.
 *   - PEER_ID
 *     Bits 31:20
 *     Purpose: Identifies which peer sent the ADDBA.
 *     Value:
 *         ID (hash value) used by the host for fast, direct lookup of
 *         host SW peer info, including rx reorder states.
 *   - START_SEQ_NUM
 *     Bits 11:0
 *     Purpose: Specifies the initial location of the block ack window
 *     Value: start sequence value specified by the ADDBA-request message
 *   - STATUS
 *     Bit 12
 *     Purpose: status of the WMI ADDBA request
 *     Value: 0 - SUCCESS, 1 - FAILURE
 */
typedef struct htt_isoc_t2h_addba_s {
	/* word 0 */
	A_UINT32 msg_type:8,    /* HTT_ISOC_T2H_MSG_TYPE_ADDBA */
		 win_size:8, tid:4, peer_id:12;
	/* word 1 */
	A_UINT32 start_seq_num:12, status:1, reserved0:19;
} htt_isoc_t2h_addba_t;

/* word 0 */
#define HTT_ISOC_T2H_ADDBA_WIN_SIZE_OFFSET32       0
#define HTT_ISOC_T2H_ADDBA_WIN_SIZE_M              0x0000ff00
#define HTT_ISOC_T2H_ADDBA_WIN_SIZE_S              8

#define HTT_ISOC_T2H_ADDBA_TID_OFFSET32            0
#define HTT_ISOC_T2H_ADDBA_TID_M                   0x000f0000
#define HTT_ISOC_T2H_ADDBA_TID_S                   16

#define HTT_ISOC_T2H_ADDBA_PEER_ID_OFFSET32        0
#define HTT_ISOC_T2H_ADDBA_PEER_ID_M               0xfff00000
#define HTT_ISOC_T2H_ADDBA_PEER_ID_S               20

/* word 1 */
#define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_OFFSET32  1
#define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_M         0x00000fff
#define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_S         0

#define HTT_ISOC_T2H_ADDBA_STATUS_OFFSET32         1
#define HTT_ISOC_T2H_ADDBA_STATUS_M                0x00001000
#define HTT_ISOC_T2H_ADDBA_STATUS_S                12

/* general field access macros */
#define HTT_ISOC_T2H_ADDBA_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(					      \
		((A_UINT32 *) msg_addr),				  \
		HTT_ISOC_T2H_ADDBA_ ## field ## _OFFSET32,	     \
		HTT_ISOC_T2H_ADDBA_ ## field ## _M,		     \
		HTT_ISOC_T2H_ADDBA_ ## field ## _S,		     \
		value)

#define HTT_ISOC_T2H_ADDBA_FIELD_GET(field, msg_addr) \
	HTT_ISOC_T2H_FIELD_GET(				       \
		((A_UINT32 *) msg_addr),			   \
		HTT_ISOC_T2H_ADDBA_ ## field ## _OFFSET32,    \
		HTT_ISOC_T2H_ADDBA_ ## field ## _M,	      \
		HTT_ISOC_T2H_ADDBA_ ## field ## _S)

/* access macros for specific fields */

#define HTT_ISOC_T2H_ADDBA_WIN_SIZE_SET(msg_addr, value) \
	HTT_ISOC_T2H_ADDBA_FIELD_SET(WIN_SIZE, msg_addr, value)
#define HTT_ISOC_T2H_ADDBA_WIN_SIZE_GET(msg_addr) \
	HTT_ISOC_T2H_ADDBA_FIELD_GET(WIN_SIZE, msg_addr)

A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_ADDBA_TID_M_Size_Check,
	(HTT_ISOC_T2H_ADDBA_TID_M >> HTT_ISOC_T2H_ADDBA_TID_S) \
		< ((A_UINT8)~((A_UINT8)0)));
#define HTT_ISOC_T2H_ADDBA_TID_SET(msg_addr, value) \
	HTT_ISOC_T2H_ADDBA_FIELD_SET(TID, msg_addr, value)
#define HTT_ISOC_T2H_ADDBA_TID_GET(msg_addr) \
	(A_UINT8)(HTT_ISOC_T2H_ADDBA_FIELD_GET(TID, msg_addr))

#define HTT_ISOC_T2H_ADDBA_PEER_ID_SET(msg_addr, value)	\
	HTT_ISOC_T2H_ADDBA_FIELD_SET(PEER_ID, msg_addr, value)
#define HTT_ISOC_T2H_ADDBA_PEER_ID_GET(msg_addr) \
	HTT_ISOC_T2H_ADDBA_FIELD_GET(PEER_ID, msg_addr)

#define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_SET(msg_addr, value) \
	HTT_ISOC_T2H_ADDBA_FIELD_SET(START_SEQ_NUM, msg_addr, value)
#define HTT_ISOC_T2H_ADDBA_START_SEQ_NUM_GET(msg_addr) \
	HTT_ISOC_T2H_ADDBA_FIELD_GET(START_SEQ_NUM, msg_addr)

#define HTT_ISOC_T2H_ADDBA_STATUS_SET(msg_addr, value) \
	HTT_ISOC_T2H_ADDBA_FIELD_SET(STATUS, msg_addr, value)
#define HTT_ISOC_T2H_ADDBA_STATUS_GET(msg_addr)	\
	HTT_ISOC_T2H_ADDBA_FIELD_GET(STATUS, msg_addr)

/*=== DELBA message ===*/

/**
 * @brief target -> host DELBA message definition
 *
 * @details
 * The following diagram shows the format of the rx DELBA message sent
 * from the target to the host:
 *
 * |31                      20|19  16|15     12|11    8|7               0|
 * |---------------------------------------------------------------------|
 * |          peer ID         |  TID |    reserved   |S|     msg type    |
 * |---------------------------------------------------------------------|
 *
 * The following field definitions describe the format of the ADDBA
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as an DELBA message
 *     Value: 0x4
 *   - TID
 *     Bits 19:16
 *     Purpose: Specifies which traffic identifier the DELBA is for.
 *     Value:
 *         TID specified by the received DELBA management message.
 *   - PEER_ID
 *     Bits 31:20
 *     Purpose: Identifies which peer sent the DELBA.
 *     Value:
 *         ID (hash value) used by the host for fast, direct lookup of
 *         host SW peer info, including rx reorder states.
 *   - STATUS
 *     Bit 8
 *     Purpose: status of the WMI DELBA request
 *     Value: 0 - SUCCESS, 1 - FAILURE
 */
typedef struct htt_isoc_t2h_delba_s {
	/* word 0 */
	A_UINT32 msg_type:8,    /* HTT_ISOC_T2H_MSG_TYPE_DELBA */
		 status:1, reserved0:7, tid:4, peer_id:12;
} htt_isoc_t2h_delba_t;

/* word 0 */
#define HTT_ISOC_T2H_DELBA_TID_OFFSET32            0
#define HTT_ISOC_T2H_DELBA_TID_M                   0x000f0000
#define HTT_ISOC_T2H_DELBA_TID_S                   16

#define HTT_ISOC_T2H_DELBA_PEER_ID_OFFSET32        0
#define HTT_ISOC_T2H_DELBA_PEER_ID_M               0xfff00000
#define HTT_ISOC_T2H_DELBA_PEER_ID_S               20

#define HTT_ISOC_T2H_DELBA_STATUS_OFFSET32         0
#define HTT_ISOC_T2H_DELBA_STATUS_M                0x00000100
#define HTT_ISOC_T2H_DELBA_STATUS_S                8

/* general field access macros */

#define HTT_ISOC_T2H_DELBA_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(					      \
		((A_UINT32 *) msg_addr),				  \
		HTT_ISOC_T2H_DELBA_ ## field ## _OFFSET32,	     \
		HTT_ISOC_T2H_DELBA_ ## field ## _M,		     \
		HTT_ISOC_T2H_DELBA_ ## field ## _S,		     \
		value)

#define HTT_ISOC_T2H_DELBA_FIELD_GET(field, msg_addr) \
	HTT_ISOC_T2H_FIELD_GET(				       \
		((A_UINT32 *) msg_addr),			   \
		HTT_ISOC_T2H_DELBA_ ## field ## _OFFSET32,    \
		HTT_ISOC_T2H_DELBA_ ## field ## _M,	      \
		HTT_ISOC_T2H_DELBA_ ## field ## _S)

/* access macros for specific fields */

A_COMPILE_TIME_ASSERT(HTT_ISOC_T2H_DELBA_TID_M_Size_Check,
	(HTT_ISOC_T2H_DELBA_TID_M >> HTT_ISOC_T2H_DELBA_TID_S) \
		< ((A_UINT8)~((A_UINT8)0)));
#define HTT_ISOC_T2H_DELBA_TID_SET(msg_addr, value) \
	HTT_ISOC_T2H_DELBA_FIELD_SET(TID, msg_addr, value)
#define HTT_ISOC_T2H_DELBA_TID_GET(msg_addr) \
	(A_UINT8)HTT_ISOC_T2H_DELBA_FIELD_GET(TID, msg_addr)

#define HTT_ISOC_T2H_DELBA_PEER_ID_SET(msg_addr, value)	\
	HTT_ISOC_T2H_DELBA_FIELD_SET(PEER_ID, msg_addr, value)
#define HTT_ISOC_T2H_DELBA_PEER_ID_GET(msg_addr) \
	HTT_ISOC_T2H_DELBA_FIELD_GET(PEER_ID, msg_addr)

#define HTT_ISOC_T2H_DELBA_STATUS_SET(msg_addr, value) \
	HTT_ISOC_T2H_DELBA_FIELD_SET(STATUS, msg_addr, value)
#define HTT_ISOC_T2H_DELBA_STATUS_GET(msg_addr)	\
	HTT_ISOC_T2H_DELBA_FIELD_GET(STATUS, msg_addr)

/*=== SEC_IND message ===*/

/**
 * @brief target -> host Security indication message definition
 *
 * @details
 * The following diagram shows the format of the SEC_IND message sent
 * from the target to the host.  This layout assumes the target operates
 * as little-endian.
 *
 * |31          25|24|23       18|17|16|15      11|10|9|8|7|6|            0|
 * |-----------------------------------------------------------------------|
 * |   is unicast    |  sec type       |     Peer id     |     msg type    |
 * |-----------------------------------------------------------------------|
 * |                    mic key1                                           |
 * |-----------------------------------------------------------------------|
 * |                    mic key2                                           |
 * |-----------------------------------------------------------------------|
 *
 *
 * The following field definitions describe the format of the peer info
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as SEC_IND message
 *     Value: 0x6
 *   - PEER_ID
 *     Bits 15:8
 *     Purpose: The ID that the target has allocated to refer to the peer
 *     Value: Peer ID
 *   - SEC_TYPE
 *     Bits 23:16
 *     Purpose: specify the security encryption type
 *     Value: htt_sec_type
 *   - is unicast
 *     Bits 31:24
 *     Purpose: specify unicast/bcast
 *     Value: 1-unicast/0-bcast
 * WORD 1:
 *   - MIC1
 *     Bits 31:0
 *     Purpose: Mickey1
 * WORD 2:
 *   - MIC2
 *     Bits 31:0
 *     Purpose: Mickey2
 */
typedef struct htt_isoc_t2h_sec_ind_s {
	/* word 0 */
	A_UINT32 msg_type:8,    /* HTT_ISOC_T2H_MSG_TYPE_SEC_IND */
		 peer_id:8, sec_type:8, is_unicast:8;
	/* word 1 */
	A_UINT32 mic_key1;
	/* word 2 */
	A_UINT32 mic_key2;
	/* word 3 */
	A_UINT32 status;
} htt_isoc_t2h_sec_ind_t;

/* word 0 */
#define HTT_ISOC_T2H_SEC_IND_PEER_ID_OFFSET32        0
#define HTT_ISOC_T2H_SEC_IND_PEER_ID_M               0x0000ff00
#define HTT_ISOC_T2H_SEC_IND_PEER_ID_S               8

#define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_OFFSET32       0
#define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_M              0x00ff0000
#define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_S              16

#define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_OFFSET32     0
#define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_M            0xff000000
#define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_S            24

/* word 1 */
#define HTT_ISOC_T2H_SEC_IND_MIC1_OFFSET32           1
#define HTT_ISOC_T2H_SEC_IND_MIC1_M                  0xffffffff
#define HTT_ISOC_T2H_SEC_IND_MIC1_S                  0

/* word 2 */
#define HTT_ISOC_T2H_SEC_IND_MIC2_OFFSET32           2
#define HTT_ISOC_T2H_SEC_IND_MIC2_M                  0xffffffff
#define HTT_ISOC_T2H_SEC_IND_MIC2_S                  0

/* general field access macros */
#define HTT_ISOC_T2H_SEC_IND_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(					     \
		((A_UINT32 *) msg_addr),				 \
		HTT_ISOC_T2H_SEC_IND_ ## field ## _OFFSET32,	       \
		HTT_ISOC_T2H_SEC_IND_ ## field ## _M,		       \
		HTT_ISOC_T2H_SEC_IND_ ## field ## _S,		       \
		value)

#define HTT_ISOC_T2H_SEC_IND_FIELD_GET(field, msg_addr)	\
	HTT_ISOC_T2H_FIELD_GET(				      \
		((A_UINT32 *) msg_addr),			  \
		HTT_ISOC_T2H_SEC_IND_ ## field ## _OFFSET32,	\
		HTT_ISOC_T2H_SEC_IND_ ## field ## _M,		\
		HTT_ISOC_T2H_SEC_IND_ ## field ## _S)

/* access macros for specific fields */
#define HTT_ISOC_T2H_SEC_IND_PEER_ID_SET(msg_addr, value) \
	HTT_ISOC_T2H_SEC_IND_FIELD_SET(PEER_ID, msg_addr, value)
#define HTT_ISOC_T2H_SEC_IND_PEER_ID_GET(msg_addr) \
	HTT_ISOC_T2H_SEC_IND_FIELD_GET(PEER_ID, msg_addr)

#define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_SET(msg_addr, value) \
	HTT_ISOC_T2H_SEC_IND_FIELD_SET(SEC_TYPE, msg_addr, value)
#define HTT_ISOC_T2H_SEC_IND_SEC_TYPE_GET(msg_addr) \
	HTT_ISOC_T2H_SEC_IND_FIELD_GET(SEC_TYPE, msg_addr)

#define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_SET(msg_addr, value) \
	HTT_ISOC_T2H_SEC_IND_FIELD_SET(IS_UNICAST, msg_addr, value)
#define HTT_ISOC_T2H_SEC_IND_IS_UNICAST_GET(msg_addr) \
	HTT_ISOC_T2H_SEC_IND_FIELD_GET(IS_UNICAST, msg_addr)

#define HTT_ISOC_T2H_SEC_IND_MIC1_SET(msg_addr, value) \
	HTT_ISOC_T2H_SEC_IND_FIELD_SET(MIC1, msg_addr, value)
#define HTT_ISOC_T2H_SEC_IND_MIC1_GET(msg_addr)	\
	HTT_ISOC_T2H_SEC_IND_FIELD_GET(MIC1, msg_addr)

#define HTT_ISOC_T2H_SEC_IND_MIC2_SET(msg_addr, value) \
	HTT_ISOC_T2H_SEC_IND_FIELD_SET(MIC2, msg_addr, value)
#define HTT_ISOC_T2H_SEC_IND_MIC2_GET(msg_addr)	\
	HTT_ISOC_T2H_SEC_IND_FIELD_GET(MIC2, msg_addr)

/*=== PEER_TX_READY message ===*/

/**
 * @brief target -> host peer tx ready message definition
 *
 * @details
 * The following diagram shows the format of the peer tx ready message sent
 * from the target to the host.  This layout assumes the target operates
 * as little-endian.
 *
 * |31                      19|18                       8|7               0|
 * |-----------------------------------------------------------------------|
 * |         reserved         |          peer ID         |     msg type    |
 * |-----------------------------------------------------------------------|
 *
 *
 * The following field definitions describe the format of the peer info
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as peer tx ready message
 *     Value: 0x7
 *   - PEER_ID
 *     Bits 18:8
 *     Purpose: The ID assigned to the peer by the PEER_INFO message
 */
typedef struct htt_isoc_t2h_peer_tx_ready_s {
	/* word 0 */
	A_UINT32 msg_type:8,    /* HTT_ISOC_T2H_MSG_TYPE_PEER_TX_READY */
		 peer_id:11, reserved0:13;
} htt_isoc_t2h_peer_tx_ready_t;

/* word 0 */
#define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_OFFSET32        0
#define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_M               0x0007ff00
#define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_S               8

/* general field access macros */

#define HTT_ISOC_T2H_PEER_TX_READY_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(					      \
		((A_UINT32 *) msg_addr),				  \
		HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _OFFSET32,	     \
		HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _M,		     \
		HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _S,		     \
		value)

#define HTT_ISOC_T2H_PEER_TX_READY_FIELD_GET(field, msg_addr) \
	HTT_ISOC_T2H_FIELD_GET(				       \
		((A_UINT32 *) msg_addr),			   \
		HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _OFFSET32,    \
		HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _M,	      \
		HTT_ISOC_T2H_PEER_TX_READY_ ## field ## _S)

/* access macros for specific fields */

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)));

#define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_SET(msg_addr, value) \
	HTT_ISOC_T2H_PEER_TX_READY_FIELD_SET(PEER_ID, msg_addr, value)
#define HTT_ISOC_T2H_PEER_TX_READY_PEER_ID_GET(msg_addr) \
	((A_UINT16)(HTT_ISOC_T2H_PEER_TX_READY_FIELD_GET(PEER_ID, msg_addr)))


/*=== RX_ERR message ===*/

/**
 * @brief target -> host rx error notification message definition
 *
 * @details
 * The following diagram shows the format of the rx err message sent
 * from the target to the host.  This layout assumes the target operates
 * as little-endian.
 *
 * |31                               16|15              8|7|6|5|4       0|
 * |---------------------------------------------------------------------|
 * |               peer ID             |   rx err type   |    msg type   |
 * |---------------------------------------------------------------------|
 * |               reserved            |   rx err count  |M| r | ext TID |
 * |---------------------------------------------------------------------|
 * M = multicast
 * r = reserved
 *
 * The following field definitions describe the format of the peer info
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as an rx err message
 *     Value: 0x8
 *   - RX_ERR_TYPE
 *     Bits 15:8
 *     Purpose: specifies which type of rx error is being reported
 *     Value: htt_rx_ind_mpdu_status enum
 *   - PEER_ID
 *     Bits 31:16
 *     Purpose: specify which peer sent the frame that resulted in an error
 * WORD 1:
 *   - EXT_TID
 *     Bits 4:0
 *     Purpose: specifies which traffic type had the rx error
 *     Value: 0-15 for a real TID value, 16 for non-QoS data, 31 for unknown
 *   - MCAST
 *     Bit 6
 *     Purpose: specify whether the rx error frame was unicast or multicast
 *     Value: 0 -> unicast, 1 -> multicast
 *   - L2_HDR_IS_80211
 *     Bit 7
 *     Purpose: specifies whether the included L2 header (if present) is in
 *         802.3 or 802.11 format
 *     Value: 0 -> 802.3, 1 -> 802.11
 *   - L2_HDR_BYTES
 *     Bits 15:8
 *     Purpose: Specify the size of the L2 header in this rx error report.
 *     Value:
 *         If no L2 header is included, this field shall be 0.
 *         If a 802.3 + LLC/SNAP header is included, this field shall be
 *         14 (ethernet header) + 8 (LLC/SNAP).
 *         If a 802.11 header is included, this field shall be 24 bytes for
 *         a basic header, or 26 bytes if a QoS control field is included,
 *         or 30 bytes if a 4th address is included, or 32 bytes if a 4th
 *         address and a QoS control field are included, etc.
 *         Though the L2 header included in the message needs to include
 *         padding up to a 4-byte boundary, this L2 header size field need
 *         not account for the padding following the L2 header.
 *   - SEC_HDR_BYTES
 *     Bits 23:16
 *     Purpose: Specify the size of the security encapsulation header in
 *         this rx error report.
 *     Value:
 *         If no security header is included, this field shall be 0.
 *         If a security header is included, this field depends on the
 *         security type, which can be inferred from the rx error type.
 *         For TKIP MIC errors, the security header could be any of:
 *             8  - if IV / KeyID and Extended IV are included
 *             16 - if MIC is also included
 *             20 - if ICV is also included
 *   - RX_ERR_CNT
 *     Bits 31:24
 *     Purpose: specifies how many rx errors are reported in this message
 *     Value:
 *         Rx error reports that include a L2 header and/or security header
 *         will set this field to 1, to indicate that the error notification
 *         is for a single frame.
 *         Rx error reports that don't include a L2 header or security header
 *         can use this field to send a single message to report multiple
 *         erroneous rx frames.
 */
typedef struct htt_isoc_t2h_rx_err_s {
	/* word 0 */
	A_UINT32 msg_type:8,    /* HTT_ISOC_T2H_MSG_TYPE_RX_ERR */
		 rx_err_type:8, peer_id:16;
	/* word 1 */
	A_UINT32
		ext_tid:5,
		reserved1:1,
		mcast:1,
		l2_hdr_is_80211:1, l2_hdr_bytes:8, sec_hdr_bytes:8, rx_err_cnt:8;
	/* words 2 - M-1: L2 header */
	/* words M - N: security header */
} htt_isoc_t2h_rx_err_t;

/* This needs to be exact bytes for structure htt_isoc_t2h_rx_err_t
 *  * Since it is shared between host and FW, sizeof may not be used.
 *  * */
#define HTT_ISOC_T2H_RX_ERR_BASE_BYTES                20

/* word 0 */
#define HTT_ISOC_T2H_RX_ERR_TYPE_OFFSET32             0
#define HTT_ISOC_T2H_RX_ERR_TYPE_M                    0x0000ff00
#define HTT_ISOC_T2H_RX_ERR_TYPE_ID_S                 8

#define HTT_ISOC_T2H_RX_ERR_PEER_ID_OFFSET32          0
#define HTT_ISOC_T2H_RX_ERR_PEER_ID_M                 0xffff0000
#define HTT_ISOC_T2H_RX_ERR_PEER_ID_S                 16

/* word 1 */
#define HTT_ISOC_T2H_RX_ERR_EXT_TID_OFFSET32          1
#define HTT_ISOC_T2H_RX_ERR_EXT_TID_M                 0x0000001f
#define HTT_ISOC_T2H_RX_ERR_EXT_TID_S                 0

#define HTT_ISOC_T2H_RX_ERR_MCAST_OFFSET32            1
#define HTT_ISOC_T2H_RX_ERR_MCAST_M                   0x00000040
#define HTT_ISOC_T2H_RX_ERR_MCAST_S                   6

#define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_OFFSET32  1
#define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_M         0x00000080
#define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_S         7

#define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_OFFSET32     1
#define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_M            0x0000ff00
#define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_S            8

#define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_OFFSET32    1
#define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_M           0x00ff0000
#define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_S           16

#define HTT_ISOC_T2H_RX_ERR_CNT_OFFSET32              1
#define HTT_ISOC_T2H_RX_ERR_CNT_M                     0xff000000
#define HTT_ISOC_T2H_RX_ERR_CNT_S                     24


/* general field access macros */

#define HTT_ISOC_T2H_RX_ERR_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(					      \
		((A_UINT32 *) msg_addr),				  \
		HTT_ISOC_T2H_RX_ERR_ ## field ## _OFFSET32,	      \
		HTT_ISOC_T2H_RX_ERR_ ## field ## _M,		      \
		HTT_ISOC_T2H_RX_ERR_ ## field ## _S,		      \
		value)

#define HTT_ISOC_T2H_RX_ERR_FIELD_GET(field, msg_addr) \
	HTT_ISOC_T2H_FIELD_GET(				       \
		((A_UINT32 *) msg_addr),			   \
		HTT_ISOC_T2H_RX_ERR_ ## field ## _OFFSET32,    \
		HTT_ISOC_T2H_RX_ERR_ ## field ## _M,	       \
		HTT_ISOC_T2H_RX_ERR_ ## field ## _S)

/* access macros for specific fields */

#define HTT_ISOC_T2H_RX_ERR_TYPE_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(TYPE, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_TYPE_GET(msg_addr) \
	HTT_ISOC_T2H_RX_ERR_FIELD_GET(TYPE, msg_addr)

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)));
#define HTT_ISOC_T2H_RX_ERR_PEER_ID_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(PEER_ID, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_PEER_ID_GET(msg_addr) \
	((A_UINT16)HTT_ISOC_T2H_RX_ERR_FIELD_GET(PEER_ID, msg_addr))

#define HTT_ISOC_T2H_RX_ERR_EXT_TID_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(EXT_TID, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_EXT_TID_GET(msg_addr) \
	HTT_ISOC_T2H_RX_ERR_FIELD_GET(EXT_TID, msg_addr)

#define HTT_ISOC_T2H_RX_ERR_MCAST_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(MCAST, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_MCAST_GET(msg_addr)	\
	HTT_ISOC_T2H_RX_ERR_FIELD_GET(MCAST, msg_addr)

#define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(L2_HDR_IS_80211, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_L2_HDR_IS_80211_GET(msg_addr) \
	HTT_ISOC_T2H_RX_ERR_FIELD_GET(L2_HDR_IS_80211, msg_addr)

#define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(L2_HDR_BYTES, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_L2_HDR_BYTES_GET(msg_addr) \
	HTT_ISOC_T2H_RX_ERR_FIELD_GET(L2_HDR_BYTES, msg_addr)

#define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(SEC_HDR_BYTES, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_SEC_HDR_BYTES_GET(msg_addr)	\
	HTT_ISOC_T2H_RX_ERR_FIELD_GET(SEC_HDR_BYTES, msg_addr)

#define HTT_ISOC_T2H_RX_ERR_CNT_SET(msg_addr, value) \
	HTT_ISOC_T2H_RX_ERR_FIELD_SET(CNT, msg_addr, value)
#define HTT_ISOC_T2H_RX_ERR_CNT_GET(msg_addr) \
	HTT_ISOC_T2H_RX_ERR_FIELD_GET(CNT, msg_addr)

/*=== TX OTA complete indication message ===*/

/**
 * @brief target -> tx complete indicate message
 *
 * @details
 * The following diagram shows the format of the tx complete indication message sent
 * from the target to the host.  This layout assumes the target operates
 * as little-endian.
 *
 * |31                      19|18                       8|7               0|
 * |-----------------------------------------------------------------------|
 * |         reserved         |          status          |     msg type    |
 * |-----------------------------------------------------------------------|
 *
 *
 * The following field definitions describe the format of the peer info
 * message sent from the target to the host.
 *
 * WORD 0:
 *   - MSG_TYPE
 *     Bits 7:0
 *     Purpose: identifies this as tx complete indication message
 *     Value: 0x7
 *   - status
 *     Bits 18:8
 *     Purpose: TX completion status
 */
typedef struct htt_isoc_t2h_tx_compl_s {
	/* word 0 */
	A_UINT32
	/* HTT_ISOC_T2H_MSG_TYPE_TX_COMPL_IND */
	qmsg_type:8,
	status:11,
	reserved0:13;
} htt_isoc_t2h_tx_compl_t;

/* word 0 */
#define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_OFFSET32        0
#define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_M               0x0007ff00
#define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_S               8


/* general field access macros */

#define HTT_ISOC_T2H_TX_COMPL_IND_FIELD_SET(field, msg_addr, value) \
	htt_isoc_t2h_field_set(                                       \
	((A_UINT32 *) msg_addr),                                  \
	HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _OFFSET32,           \
	HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _M,                  \
	HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _S,                  \
	value)

#define HTT_ISOC_T2H_TX_COMPL_IND_FIELD_GET(field, msg_addr) \
	HTT_ISOC_T2H_FIELD_GET(                                \
	((A_UINT32 *) msg_addr),                           \
	HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _OFFSET32,    \
	HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _M,           \
	HTT_ISOC_T2H_TX_COMPL_IND_ ## field ## _S)

/* access macros for specific fields */

#define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_SET(msg_addr, value) \
	HTT_ISOC_T2H_TX_COMPL_IND_FIELD_SET(STATUS, msg_addr, value)
#define HTT_ISOC_T2H_TX_COMPL_IND_STATUS_GET(msg_addr) \
	HTT_ISOC_T2H_TX_COMPL_IND_FIELD_GET(STATUS, msg_addr)

#define HTT_TX_COMPL_IND_STAT_OK          0
#define HTT_TX_COMPL_IND_STAT_DISCARD     1
#define HTT_TX_COMPL_IND_STAT_NO_ACK      2
#define HTT_TX_COMPL_IND_STAT_POSTPONE    3

/*=== NLO indication message ===*/

/**
* @brief target -> NLO indicate message
*
* @details
* The following diagram shows the format of the NLO indication message sent
* from the target to the host.  This layout assumes the target operates
* as little-endian.
*
* |31                                                  8|7               0|
* |-----------------------------------------------------------------------|
* |                      reserved                       |     msg type    |
* |-----------------------------------------------------------------------|
*
*
* The following field definitions describe the format of NLO MATCH indication
* message sent from the target to the host.
*
* WORD 0:
*   - MSG_TYPE
*     Bits 7:0
*     Purpose: identifies this as NLO indication message
*     Value: 0x9 - HTT_ISOC_T2H_MSG_TYPE_NLO_MATCH
*     Value: 0xA - HTT_ISOC_T2H_MSG_TYPE_NLO_SCAN_END
*/
typedef struct htt_isoc_t2h_nlo_ind_s {
	/* word 0 */
	A_UINT32
	msg_type:8,
	vdev_id:8,
	reserved0:16;
} htt_isoc_t2h_nlo_ind_t;

/* word 0 */
#define HTT_ISOC_T2H_NLO_IND_VDEVID_OFFSET32            0
#define HTT_ISOC_T2H_NLO_IND_VDEVID_M                   0x0000ff00
#define HTT_ISOC_T2H_NLO_IND_VDEVID_S                   8


/* general field access macros */

#define HTT_ISOC_T2H_NLO_IND_FIELD_SET(field, msg_addr, value)  \
	htt_isoc_t2h_field_set(                                     \
	((A_UINT32 *) msg_addr),                                \
	HTT_ISOC_T2H_NLO_IND_ ## field ## _OFFSET32,            \
	HTT_ISOC_T2H_NLO_IND_ ## field ## _M,                   \
	HTT_ISOC_T2H_NLO_IND_ ## field ## _S,                   \
	value)

#define HTT_ISOC_T2H_NLO_IND_FIELD_GET(field, msg_addr)     \
	HTT_ISOC_T2H_FIELD_GET(                                 \
	((A_UINT32 *) msg_addr),                            \
	HTT_ISOC_T2H_NLO_IND_ ## field ## _OFFSET32,        \
	HTT_ISOC_T2H_NLO_IND_ ## field ## _M,               \
	HTT_ISOC_T2H_NLO_IND_ ## field ## _S)

/* access macros for specific fields */

#define HTT_ISOC_T2H_NLO_IND_VDEVID_SET(msg_addr, value) \
	HTT_ISOC_T2H_NLO_IND_FIELD_SET(VDEVID, msg_addr, value)
#define HTT_ISOC_T2H_NLO_IND_VDEVID_GET(msg_addr) \
	HTT_ISOC_T2H_NLO_IND_FIELD_GET(VDEVID, msg_addr)


#endif /* _HTT_ISOC_H_ */
