/*
 * Copyright (c) 2014 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.
 */


/* This file contains shared definitions for the host/target endpoint ping test */

#ifndef EPPING_TEST_H
#define EPPING_TEST_H

#ifndef ATH_TARGET
#include "athstartpack.h"
#endif

    /* alignment to 4-bytes */
#define EPPING_ALIGNMENT_PAD  (((sizeof(HTC_FRAME_HDR) + 3) & (~0x3)) - sizeof(HTC_FRAME_HDR))

#ifndef A_OFFSETOF
#define A_OFFSETOF(type,field) (int)(&(((type *)NULL)->field))
#endif

#define EPPING_RSVD_FILL                  0xCC

#define HCI_RSVD_EXPECTED_PKT_TYPE_RECV_OFFSET  7

typedef PREPACK struct {
   A_UINT8     _HCIRsvd[8];           /* reserved for HCI packet header (GMBOX) testing */
   A_UINT8     StreamEcho_h;          /* stream no. to echo this packet on (filled by host) */
   A_UINT8     StreamEchoSent_t;      /* stream no. packet was echoed to (filled by target)
                                         When echoed: StreamEchoSent_t == StreamEcho_h */
   A_UINT8     StreamRecv_t;          /* stream no. that target received this packet on (filled by target) */
   A_UINT8     StreamNo_h;            /* stream number to send on (filled by host) */
   A_UINT8     Magic_h[4];            /* magic number to filter for this packet on the host*/
   A_UINT8     _rsvd[6];              /* reserved fields that must be set to a "reserved" value
                                         since this packet maps to a 14-byte ethernet frame we want
                                         to make sure ethertype field is set to something unknown */

   A_UINT8     _pad[2];               /* padding for alignment */
   A_UINT8     TimeStamp[8];          /* timestamp of packet (host or target) */
   A_UINT32    HostContext_h;         /* 4 byte host context, target echos this back */
   A_UINT32    SeqNo;                 /* sequence number (set by host or target) */
   A_UINT16    Cmd_h;                 /* ping command (filled by host) */
   A_UINT16    CmdFlags_h;            /* optional flags */
   A_UINT8     CmdBuffer_h[8];        /* buffer for command (host -> target) */
   A_UINT8     CmdBuffer_t[8];        /* buffer for command (target -> host) */
   A_UINT16    DataLength;            /* length of data */
   A_UINT16    DataCRC;               /* 16 bit CRC of data */
   A_UINT16    HeaderCRC;             /* header CRC (fields : StreamNo_h to end, minus HeaderCRC) */
} POSTPACK EPPING_HEADER;

#define EPPING_PING_MAGIC_0           0xAA
#define EPPING_PING_MAGIC_1           0x55
#define EPPING_PING_MAGIC_2           0xCE
#define EPPING_PING_MAGIC_3           0xEC

#define IS_EPPING_PACKET(pPkt)   (((pPkt)->Magic_h[0] == EPPING_PING_MAGIC_0) && \
                                  ((pPkt)->Magic_h[1] == EPPING_PING_MAGIC_1) && \
                                  ((pPkt)->Magic_h[2] == EPPING_PING_MAGIC_2) && \
                                  ((pPkt)->Magic_h[3] == EPPING_PING_MAGIC_3))

#define SET_EPPING_PACKET_MAGIC(pPkt) { (pPkt)->Magic_h[0] = EPPING_PING_MAGIC_0; \
                                        (pPkt)->Magic_h[1] = EPPING_PING_MAGIC_1; \
                                        (pPkt)->Magic_h[2] = EPPING_PING_MAGIC_2; \
                                        (pPkt)->Magic_h[3] = EPPING_PING_MAGIC_3;}

#define CMD_FLAGS_DATA_CRC            (1 << 0)  /* DataCRC field is valid */
#define CMD_FLAGS_DELAY_ECHO          (1 << 1)  /* delay the echo of the packet */
#define CMD_FLAGS_NO_DROP             (1 << 2)  /* do not drop at HTC layer no matter what the stream is */

#define IS_EPING_PACKET_NO_DROP(pPkt)  ((pPkt)->CmdFlags_h & CMD_FLAGS_NO_DROP)

#define EPPING_CMD_ECHO_PACKET          1   /* echo packet test */
#define EPPING_CMD_RESET_RECV_CNT       2   /* reset recv count */
#define EPPING_CMD_CAPTURE_RECV_CNT     3   /* fetch recv count, 4-byte count returned in CmdBuffer_t */
#define EPPING_CMD_NO_ECHO              4   /* non-echo packet test (tx-only) */
#define EPPING_CMD_CONT_RX_START        5   /* continous RX packets, parameters are in CmdBuffer_h */
#define EPPING_CMD_CONT_RX_STOP         6   /* stop continuous RX packet transmission */

    /* test command parameters may be no more than 8 bytes */
typedef PREPACK struct {
   A_UINT16  BurstCnt;       /* number of packets to burst together (for HTC 2.1 testing) */
   A_UINT16  PacketLength;   /* length of packet to generate including header */
   A_UINT16  Flags;          /* flags */

#define EPPING_CONT_RX_DATA_CRC     (1 << 0)  /* Add CRC to all data */
#define EPPING_CONT_RX_RANDOM_DATA  (1 << 1)  /* randomize the data pattern */
#define EPPING_CONT_RX_RANDOM_LEN   (1 << 2)  /* randomize the packet lengths */
#define EPPING_CONT_RX_NO_DATA_FILL (1 << 3)  /* target will not fill buffers */
   A_UINT16  Context;        /* flags */

} POSTPACK EPPING_CONT_RX_PARAMS;

#define EPPING_HDR_CRC_OFFSET    A_OFFSETOF(EPPING_HEADER,StreamNo_h)
#define EPPING_HDR_BYTES_CRC     (sizeof(EPPING_HEADER) - EPPING_HDR_CRC_OFFSET - (sizeof(A_UINT16)))

#define HCI_TRANSPORT_STREAM_NUM  16  /* this number is higher than the define WMM AC classes so we
                                         can use this to distinguish packets */

#ifndef ATH_TARGET
#include "athendpack.h"
#endif

#endif /* EPPING_TEST_H */
