/*
 * 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.
 */

/*
 * This file contains extensions of the WMI protocol specified in the
 * Wireless Module Interface (WMI).  It includes definitions of all
 * extended commands and events.  Extensions include useful commands
 * that are not directly related to wireless activities.  They may
 * be hardware-specific, and they might not be supported on all
 * implementations.
 *
 * Extended WMIX commands are encapsulated in a WMI message with
 * cmd=WMI_EXTENSION_CMD.
 */

#ifndef _WMIX_H_
#define _WMIX_H_

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Extended WMI commands are those that are needed during wireless
 * operation, but which are not really wireless commands.  This allows,
 * for instance, platform-specific commands.  Extended WMI commands are
 * embedded in a WMI command message with WMI_COMMAND_ID=WMI_EXTENSION_CMDID.
 * Extended WMI events are similarly embedded in a WMI event message with
 * WMI_EVENT_ID=WMI_EXTENSION_EVENTID.
 */
typedef struct {
    A_UINT32    commandId;
} POSTPACK WMIX_CMD_HDR;

typedef enum {
    WMIX_DSETOPEN_REPLY_CMDID           = 0x2001,
    WMIX_DSETDATA_REPLY_CMDID,
    WMIX_HB_CHALLENGE_RESP_CMDID,
    WMIX_DBGLOG_CFG_MODULE_CMDID,
    WMIX_PROF_CFG_CMDID,                 /* 0x200a */
    WMIX_PROF_ADDR_SET_CMDID,
    WMIX_PROF_START_CMDID,
    WMIX_PROF_STOP_CMDID,
    WMIX_PROF_COUNT_GET_CMDID,
} WMIX_COMMAND_ID;

typedef enum {
    WMIX_DSETOPENREQ_EVENTID            = 0x3001,
    WMIX_DSETCLOSE_EVENTID,
    WMIX_DSETDATAREQ_EVENTID,
    WMIX_HB_CHALLENGE_RESP_EVENTID,
    WMIX_DBGLOG_EVENTID,
    WMIX_PROF_COUNT_EVENTID,
    WMIX_PKTLOG_EVENTID,
} WMIX_EVENT_ID;

/*
 * =============DataSet support=================
 */

/*
 * WMIX_DSETOPENREQ_EVENTID
 * DataSet Open Request Event
 */
typedef struct {
    A_UINT32 dset_id;
    A_UINT32 targ_dset_handle;  /* echo'ed, not used by Host, */
    A_UINT32 targ_reply_fn;     /* echo'ed, not used by Host, */
    A_UINT32 targ_reply_arg;    /* echo'ed, not used by Host, */
} POSTPACK WMIX_DSETOPENREQ_EVENT;

/*
 * WMIX_DSETCLOSE_EVENTID
 * DataSet Close Event
 */
typedef struct {
    A_UINT32 access_cookie;
} POSTPACK WMIX_DSETCLOSE_EVENT;

/*
 * WMIX_DSETDATAREQ_EVENTID
 * DataSet Data Request Event
 */
typedef struct {
    A_UINT32 access_cookie;
    A_UINT32 offset;
    A_UINT32 length;
    A_UINT32 targ_buf;         /* echo'ed, not used by Host, */
    A_UINT32 targ_reply_fn;    /* echo'ed, not used by Host, */
    A_UINT32 targ_reply_arg;   /* echo'ed, not used by Host, */
} WMIX_DSETDATAREQ_EVENT;

typedef struct {
    A_UINT32              status;
    A_UINT32              targ_dset_handle;
    A_UINT32              targ_reply_fn;
    A_UINT32              targ_reply_arg;
    A_UINT32              access_cookie;
    A_UINT32              size;
    A_UINT32              version;
}  WMIX_DSETOPEN_REPLY_CMD;

typedef struct {
    A_UINT32              status;
    A_UINT32              targ_buf;
    A_UINT32              targ_reply_fn;
    A_UINT32              targ_reply_arg;
    A_UINT32              length;
    A_UINT8               buf[1];
}  WMIX_DSETDATA_REPLY_CMD;


/*
 * =============Error Detection support=================
 */

/*
 * WMIX_HB_CHALLENGE_RESP_CMDID
 * Heartbeat Challenge Response command
 */
typedef struct {
    A_UINT32              cookie;
    A_UINT32              source;
}  WMIX_HB_CHALLENGE_RESP_CMD;

/*
 * WMIX_HB_CHALLENGE_RESP_EVENTID
 * Heartbeat Challenge Response Event
 */
#define WMIX_HB_CHALLENGE_RESP_EVENT WMIX_HB_CHALLENGE_RESP_CMD

/*
 * =============Target Profiling support=================
 */

typedef struct {
    A_UINT32 period; /* Time (in 30.5us ticks) between samples */
    A_UINT32 nbins;
}  WMIX_PROF_CFG_CMD;

typedef struct {
    A_UINT32 addr;
}  WMIX_PROF_ADDR_SET_CMD;

/*
 * Target responds to Hosts's earlier WMIX_PROF_COUNT_GET_CMDID request
 * using a WMIX_PROF_COUNT_EVENT with
 *   addr set to the next address
 *   count set to the corresponding count
 */
typedef struct {
    A_UINT32              addr;
    A_UINT32              count;
}  WMIX_PROF_COUNT_EVENT;


#ifdef __cplusplus
}
#endif

#endif /* _WMIX_H_ */