/*
 * Copyright (c) 2012 Qualcomm Atheros, Inc.
 * Copyright (c) 2006-2012 Wilocity .
 *
 * 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 contains the definitions of the WMI protocol specified in the
 * Wireless Module Interface (WMI) for the Wilocity
 * MARLON 60 Gigabit wireless solution.
 * It includes definitions of all the commands and events.
 * Commands are messages from the host to the WM.
 * Events are messages from the WM to the host.
 */

#ifndef __WILOCITY_WMI_H__
#define __WILOCITY_WMI_H__

/* General */

#define WMI_MAC_LEN		(6)
#define WMI_PROX_RANGE_NUM	(3)

/* List of Commands */
enum wmi_command_id {
	WMI_CONNECT_CMDID		= 0x0001,
	WMI_DISCONNECT_CMDID		= 0x0003,
	WMI_START_SCAN_CMDID		= 0x0007,
	WMI_SET_BSS_FILTER_CMDID	= 0x0009,
	WMI_SET_PROBED_SSID_CMDID	= 0x000a,
	WMI_SET_LISTEN_INT_CMDID	= 0x000b,
	WMI_BCON_CTRL_CMDID		= 0x000f,
	WMI_ADD_CIPHER_KEY_CMDID	= 0x0016,
	WMI_DELETE_CIPHER_KEY_CMDID	= 0x0017,
	WMI_SET_APPIE_CMDID		= 0x003f,
	WMI_GET_APPIE_CMDID		= 0x0040,
	WMI_SET_WSC_STATUS_CMDID	= 0x0041,
	WMI_PXMT_RANGE_CFG_CMDID	= 0x0042,
	WMI_PXMT_SNR2_RANGE_CFG_CMDID	= 0x0043,
	WMI_FAST_MEM_ACC_MODE_CMDID	= 0x0300,
	WMI_MEM_READ_CMDID		= 0x0800,
	WMI_MEM_WR_CMDID		= 0x0801,
	WMI_ECHO_CMDID			= 0x0803,
	WMI_DEEP_ECHO_CMDID		= 0x0804,
	WMI_CONFIG_MAC_CMDID		= 0x0805,
	WMI_CONFIG_PHY_DEBUG_CMDID	= 0x0806,
	WMI_ADD_STATION_CMDID		= 0x0807,
	WMI_ADD_DEBUG_TX_PCKT_CMDID	= 0x0808,
	WMI_PHY_GET_STATISTICS_CMDID	= 0x0809,
	WMI_FS_TUNE_CMDID		= 0x080a,
	WMI_CORR_MEASURE_CMDID		= 0x080b,
	WMI_TEMP_SENSE_CMDID		= 0x080e,
	WMI_DC_CALIB_CMDID		= 0x080f,
	WMI_SEND_TONE_CMDID		= 0x0810,
	WMI_IQ_TX_CALIB_CMDID		= 0x0811,
	WMI_IQ_RX_CALIB_CMDID		= 0x0812,
	WMI_SET_UCODE_IDLE_CMDID	= 0x0813,
	WMI_SET_WORK_MODE_CMDID		= 0x0815,
	WMI_LO_LEAKAGE_CALIB_CMDID	= 0x0816,
	WMI_MARLON_R_ACTIVATE_CMDID	= 0x0817,
	WMI_MARLON_R_READ_CMDID		= 0x0818,
	WMI_MARLON_R_WRITE_CMDID	= 0x0819,
	WMI_MARLON_R_TXRX_SEL_CMDID	= 0x081a,
	MAC_IO_STATIC_PARAMS_CMDID	= 0x081b,
	MAC_IO_DYNAMIC_PARAMS_CMDID	= 0x081c,
	WMI_SILENT_RSSI_CALIB_CMDID	= 0x081d,
	WMI_CFG_RX_CHAIN_CMDID		= 0x0820,
	WMI_VRING_CFG_CMDID		= 0x0821,
	WMI_RX_ON_CMDID			= 0x0822,
	WMI_VRING_BA_EN_CMDID		= 0x0823,
	WMI_VRING_BA_DIS_CMDID		= 0x0824,
	WMI_RCP_ADDBA_RESP_CMDID	= 0x0825,
	WMI_RCP_DELBA_CMDID		= 0x0826,
	WMI_SET_SSID_CMDID		= 0x0827,
	WMI_GET_SSID_CMDID		= 0x0828,
	WMI_SET_PCP_CHANNEL_CMDID	= 0x0829,
	WMI_GET_PCP_CHANNEL_CMDID	= 0x082a,
	WMI_SW_TX_REQ_CMDID		= 0x082b,
	WMI_RX_OFF_CMDID		= 0x082c,
	WMI_READ_MAC_RXQ_CMDID		= 0x0830,
	WMI_READ_MAC_TXQ_CMDID		= 0x0831,
	WMI_WRITE_MAC_RXQ_CMDID		= 0x0832,
	WMI_WRITE_MAC_TXQ_CMDID		= 0x0833,
	WMI_WRITE_MAC_XQ_FIELD_CMDID	= 0x0834,
	WMI_MLME_PUSH_CMDID		= 0x0835,
	WMI_BEAMFORMING_MGMT_CMDID	= 0x0836,
	WMI_BF_TXSS_MGMT_CMDID		= 0x0837,
	WMI_BF_SM_MGMT_CMDID		= 0x0838,
	WMI_BF_RXSS_MGMT_CMDID		= 0x0839,
	WMI_SET_SECTORS_CMDID		= 0x0849,
	WMI_MAINTAIN_PAUSE_CMDID	= 0x0850,
	WMI_MAINTAIN_RESUME_CMDID	= 0x0851,
	WMI_RS_MGMT_CMDID		= 0x0852,
	WMI_RF_MGMT_CMDID		= 0x0853,
	/* Performance monitoring commands */
	WMI_BF_CTRL_CMDID		= 0x0862,
	WMI_NOTIFY_REQ_CMDID		= 0x0863,
	WMI_GET_STATUS_CMDID		= 0x0864,
	WMI_UNIT_TEST_CMDID		= 0x0900,
	WMI_HICCUP_CMDID		= 0x0901,
	WMI_FLASH_READ_CMDID		= 0x0902,
	WMI_FLASH_WRITE_CMDID		= 0x0903,
	WMI_SECURITY_UNIT_TEST_CMDID	= 0x0904,

	WMI_SET_MAC_ADDRESS_CMDID	= 0xf003,
	WMI_ABORT_SCAN_CMDID		= 0xf007,
	WMI_SET_PMK_CMDID		= 0xf028,

	WMI_SET_PROMISCUOUS_MODE_CMDID	= 0xf041,
	WMI_GET_PMK_CMDID		= 0xf048,
	WMI_SET_PASSPHRASE_CMDID	= 0xf049,
	WMI_SEND_ASSOC_RES_CMDID	= 0xf04a,
	WMI_SET_ASSOC_REQ_RELAY_CMDID	= 0xf04b,
	WMI_EAPOL_TX_CMDID		= 0xf04c,
	WMI_MAC_ADDR_REQ_CMDID		= 0xf04d,
	WMI_FW_VER_CMDID		= 0xf04e,
};

/*
 * Commands data structures
 */

/*
 * Frame Types
 */
enum wmi_mgmt_frame_type {
	WMI_FRAME_BEACON	= 0,
	WMI_FRAME_PROBE_REQ	= 1,
	WMI_FRAME_PROBE_RESP	= 2,
	WMI_FRAME_ASSOC_REQ	= 3,
	WMI_FRAME_ASSOC_RESP	= 4,
	WMI_NUM_MGMT_FRAME,
};

/*
 * WMI_CONNECT_CMDID
 */
enum wmi_network_type {
	WMI_NETTYPE_INFRA		= 0x01,
	WMI_NETTYPE_ADHOC		= 0x02,
	WMI_NETTYPE_ADHOC_CREATOR	= 0x04,
	WMI_NETTYPE_AP			= 0x10,
	WMI_NETTYPE_P2P			= 0x20,
	WMI_NETTYPE_WBE			= 0x40, /* PCIE over 60g */
};

enum wmi_dot11_auth_mode {
	WMI_AUTH11_OPEN			= 0x01,
	WMI_AUTH11_SHARED		= 0x02,
	WMI_AUTH11_LEAP			= 0x04,
	WMI_AUTH11_WSC			= 0x08,
};

enum wmi_auth_mode {
	WMI_AUTH_NONE			= 0x01,
	WMI_AUTH_WPA			= 0x02,
	WMI_AUTH_WPA2			= 0x04,
	WMI_AUTH_WPA_PSK		= 0x08,
	WMI_AUTH_WPA2_PSK		= 0x10,
	WMI_AUTH_WPA_CCKM		= 0x20,
	WMI_AUTH_WPA2_CCKM		= 0x40,
};

enum wmi_crypto_type {
	WMI_CRYPT_NONE			= 0x01,
	WMI_CRYPT_WEP			= 0x02,
	WMI_CRYPT_TKIP			= 0x04,
	WMI_CRYPT_AES			= 0x08,
	WMI_CRYPT_AES_GCMP		= 0x20,
};


enum wmi_connect_ctrl_flag_bits {
	WMI_CONNECT_ASSOC_POLICY_USER		= 0x0001,
	WMI_CONNECT_SEND_REASSOC		= 0x0002,
	WMI_CONNECT_IGNORE_WPAx_GROUP_CIPHER	= 0x0004,
	WMI_CONNECT_PROFILE_MATCH_DONE		= 0x0008,
	WMI_CONNECT_IGNORE_AAC_BEACON		= 0x0010,
	WMI_CONNECT_CSA_FOLLOW_BSS		= 0x0020,
	WMI_CONNECT_DO_WPA_OFFLOAD		= 0x0040,
	WMI_CONNECT_DO_NOT_DEAUTH		= 0x0080,
};

#define WMI_MAX_SSID_LEN    (32)

struct wmi_connect_cmd {
	u8 network_type;
	u8 dot11_auth_mode;
	u8 auth_mode;
	u8 pairwise_crypto_type;
	u8 pairwise_crypto_len;
	u8 group_crypto_type;
	u8 group_crypto_len;
	u8 ssid_len;
	u8 ssid[WMI_MAX_SSID_LEN];
	u8 channel;
	u8 reserved0;
	u8 bssid[WMI_MAC_LEN];
	__le32 ctrl_flags;
	u8 dst_mac[WMI_MAC_LEN];
	u8 reserved1[2];
} __packed;


/*
 * WMI_RECONNECT_CMDID
 */
struct wmi_reconnect_cmd {
	u8 channel;			/* hint */
	u8 reserved;
	u8 bssid[WMI_MAC_LEN];		/* mandatory if set */
} __packed;


/*
 * WMI_SET_PMK_CMDID
 */

#define WMI_MIN_KEY_INDEX	(0)
#define WMI_MAX_KEY_INDEX	(3)
#define WMI_MAX_KEY_LEN		(32)
#define WMI_PASSPHRASE_LEN	(64)
#define WMI_PMK_LEN		(32)

struct  wmi_set_pmk_cmd {
	u8 pmk[WMI_PMK_LEN];
} __packed;


/*
 * WMI_SET_PASSPHRASE_CMDID
 */
struct wmi_set_passphrase_cmd {
	u8 ssid[WMI_MAX_SSID_LEN];
	u8 passphrase[WMI_PASSPHRASE_LEN];
	u8 ssid_len;
	u8 passphrase_len;
} __packed;

/*
 * WMI_ADD_CIPHER_KEY_CMDID
 */
enum wmi_key_usage {
	WMI_KEY_USE_PAIRWISE	= 0,
	WMI_KEY_USE_GROUP	= 1,
	WMI_KEY_USE_TX		= 2,  /* default Tx Key - Static WEP only */
};

struct wmi_add_cipher_key_cmd {
	u8 key_index;
	u8 key_type;
	u8 key_usage;		/* enum wmi_key_usage */
	u8 key_len;
	u8 key_rsc[8];		/* key replay sequence counter */
	u8 key[WMI_MAX_KEY_LEN];
	u8 key_op_ctrl;		/* Additional Key Control information */
	u8 mac[WMI_MAC_LEN];
} __packed;

/*
 * WMI_DELETE_CIPHER_KEY_CMDID
 */
struct wmi_delete_cipher_key_cmd {
	u8 key_index;
	u8 mac[WMI_MAC_LEN];
} __packed;


/*
 * WMI_START_SCAN_CMDID
 *
 * Start L1 scan operation
 *
 * Returned events:
 * - WMI_RX_MGMT_PACKET_EVENTID - for every probe resp.
 * - WMI_SCAN_COMPLETE_EVENTID
 */
enum wmi_scan_type {
	WMI_LONG_SCAN		= 0,
	WMI_SHORT_SCAN		= 1,
};

struct wmi_start_scan_cmd {
	u8 reserved[8];
	__le32 home_dwell_time;	/* Max duration in the home channel(ms) */
	__le32 force_scan_interval;	/* Time interval between scans (ms)*/
	u8 scan_type;		/* wmi_scan_type */
	u8 num_channels;		/* how many channels follow */
	struct {
		u8 channel;
		u8 reserved;
	} channel_list[0];	/* channels ID's */
				/* 0 - 58320 MHz */
				/* 1 - 60480 MHz */
				/* 2 - 62640 MHz */
} __packed;

/*
 * WMI_SET_PROBED_SSID_CMDID
 */
#define MAX_PROBED_SSID_INDEX   (15)

enum wmi_ssid_flag {
	WMI_SSID_FLAG_DISABLE	= 0,	/* disables entry */
	WMI_SSID_FLAG_SPECIFIC	= 1,	/* probes specified ssid */
	WMI_SSID_FLAG_ANY	= 2,	/* probes for any ssid */
};

struct wmi_probed_ssid_cmd {
	u8 entry_index;			/* 0 to MAX_PROBED_SSID_INDEX */
	u8 flag;			/* enum wmi_ssid_flag */
	u8 ssid_len;
	u8 ssid[WMI_MAX_SSID_LEN];
} __packed;

/*
 * WMI_SET_APPIE_CMDID
 * Add Application specified IE to a management frame
 */
struct wmi_set_appie_cmd {
	u8 mgmt_frm_type;	/* enum wmi_mgmt_frame_type */
	u8 reserved;
	__le16 ie_len;	/* Length of the IE to be added to MGMT frame */
	u8 ie_info[0];
} __packed;

#define WMI_MAX_IE_LEN (1024)

struct wmi_pxmt_range_cfg_cmd {
	u8 dst_mac[WMI_MAC_LEN];
	__le16 range;
} __packed;

struct wmi_pxmt_snr2_range_cfg_cmd {
	s8 snr2range_arr[WMI_PROX_RANGE_NUM-1];
} __packed;

/*
 * WMI_RF_MGMT_CMDID
 */
enum wmi_rf_mgmt_type {
	WMI_RF_MGMT_W_DISABLE	= 0,
	WMI_RF_MGMT_W_ENABLE	= 1,
	WMI_RF_MGMT_GET_STATUS	= 2,
};

struct wmi_rf_mgmt_cmd {
	__le32 rf_mgmt_type;
} __packed;

/*
 * WMI_SET_SSID_CMDID
 */
struct wmi_set_ssid_cmd {
	__le32 ssid_len;
	u8 ssid[WMI_MAX_SSID_LEN];
} __packed;

/*
 * WMI_SET_PCP_CHANNEL_CMDID
 */
struct wmi_set_pcp_channel_cmd {
	u8 channel;
	u8 reserved[3];
} __packed;

/*
 * WMI_BCON_CTRL_CMDID
 */
struct wmi_bcon_ctrl_cmd {
	__le16 bcon_interval;
	__le16 frag_num;
	__le64 ss_mask;
	u8 network_type;
	u8 reserved;
	u8 disable_sec_offload;
	u8 disable_sec;
} __packed;

/*
 * WMI_SW_TX_REQ_CMDID
 */
struct wmi_sw_tx_req_cmd {
	u8 dst_mac[WMI_MAC_LEN];
	__le16 len;
	u8 payload[0];
} __packed;

/*
 * WMI_VRING_CFG_CMDID
 */

struct wmi_sw_ring_cfg {
	__le64 ring_mem_base;
	__le16 ring_size;
	__le16 max_mpdu_size;
} __packed;

struct wmi_vring_cfg_schd {
	__le16 priority;
	__le16 timeslot_us;
} __packed;

enum wmi_vring_cfg_encap_trans_type {
	WMI_VRING_ENC_TYPE_802_3		= 0,
	WMI_VRING_ENC_TYPE_NATIVE_WIFI		= 1,
};

enum wmi_vring_cfg_ds_cfg {
	WMI_VRING_DS_PBSS			= 0,
	WMI_VRING_DS_STATION			= 1,
	WMI_VRING_DS_AP				= 2,
	WMI_VRING_DS_ADDR4			= 3,
};

enum wmi_vring_cfg_nwifi_ds_trans_type {
	WMI_NWIFI_TX_TRANS_MODE_NO		= 0,
	WMI_NWIFI_TX_TRANS_MODE_AP2PBSS		= 1,
	WMI_NWIFI_TX_TRANS_MODE_STA2PBSS	= 2,
};

enum wmi_vring_cfg_schd_params_priority {
	WMI_SCH_PRIO_REGULAR			= 0,
	WMI_SCH_PRIO_HIGH			= 1,
};

struct wmi_vring_cfg {
	struct wmi_sw_ring_cfg tx_sw_ring;
	u8 ringid;				/* 0-23 vrings */

	#define CIDXTID_CID_POS (0)
	#define CIDXTID_CID_LEN (4)
	#define CIDXTID_CID_MSK (0xF)
	#define CIDXTID_TID_POS (4)
	#define CIDXTID_TID_LEN (4)
	#define CIDXTID_TID_MSK (0xF0)
	u8 cidxtid;

	u8 encap_trans_type;
	u8 ds_cfg;				/* 802.3 DS cfg */
	u8 nwifi_ds_trans_type;

	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_POS (0)
	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_LEN (1)
	#define VRING_CFG_MAC_CTRL_LIFETIME_EN_MSK (0x1)
	#define VRING_CFG_MAC_CTRL_AGGR_EN_POS (1)
	#define VRING_CFG_MAC_CTRL_AGGR_EN_LEN (1)
	#define VRING_CFG_MAC_CTRL_AGGR_EN_MSK (0x2)
	u8 mac_ctrl;

	#define VRING_CFG_TO_RESOLUTION_VALUE_POS (0)
	#define VRING_CFG_TO_RESOLUTION_VALUE_LEN (6)
	#define VRING_CFG_TO_RESOLUTION_VALUE_MSK (0x3F)
	u8 to_resolution;
	u8 agg_max_wsize;
	struct wmi_vring_cfg_schd schd_params;
} __packed;

enum wmi_vring_cfg_cmd_action {
	WMI_VRING_CMD_ADD			= 0,
	WMI_VRING_CMD_MODIFY			= 1,
	WMI_VRING_CMD_DELETE			= 2,
};

struct wmi_vring_cfg_cmd {
	__le32 action;
	struct wmi_vring_cfg vring_cfg;
} __packed;

/*
 * WMI_VRING_BA_EN_CMDID
 */
struct wmi_vring_ba_en_cmd {
	u8 ringid;
	u8 agg_max_wsize;
	__le16 ba_timeout;
} __packed;

/*
 * WMI_VRING_BA_DIS_CMDID
 */
struct wmi_vring_ba_dis_cmd {
	u8 ringid;
	u8 reserved;
	__le16 reason;
} __packed;

/*
 * WMI_NOTIFY_REQ_CMDID
 */
struct wmi_notify_req_cmd {
	u8 cid;
	u8 reserved[3];
	__le32 interval_usec;
} __packed;

/*
 * WMI_CFG_RX_CHAIN_CMDID
 */
enum wmi_sniffer_cfg_mode {
	WMI_SNIFFER_OFF				= 0,
	WMI_SNIFFER_ON				= 1,
};

enum wmi_sniffer_cfg_phy_info_mode {
	WMI_SNIFFER_PHY_INFO_DISABLED		= 0,
	WMI_SNIFFER_PHY_INFO_ENABLED		= 1,
};

enum wmi_sniffer_cfg_phy_support {
	WMI_SNIFFER_CP				= 0,
	WMI_SNIFFER_DP				= 1,
	WMI_SNIFFER_BOTH_PHYS			= 2,
};

struct wmi_sniffer_cfg {
	__le32 mode;		/* enum wmi_sniffer_cfg_mode */
	__le32 phy_info_mode;	/* enum wmi_sniffer_cfg_phy_info_mode */
	__le32 phy_support;	/* enum wmi_sniffer_cfg_phy_support */
	u8 channel;
	u8 reserved[3];
} __packed;

enum wmi_cfg_rx_chain_cmd_action {
	WMI_RX_CHAIN_ADD			= 0,
	WMI_RX_CHAIN_DEL			= 1,
};

enum wmi_cfg_rx_chain_cmd_decap_trans_type {
	WMI_DECAP_TYPE_802_3			= 0,
	WMI_DECAP_TYPE_NATIVE_WIFI		= 1,
};

enum wmi_cfg_rx_chain_cmd_nwifi_ds_trans_type {
	WMI_NWIFI_RX_TRANS_MODE_NO		= 0,
	WMI_NWIFI_RX_TRANS_MODE_PBSS2AP		= 1,
	WMI_NWIFI_RX_TRANS_MODE_PBSS2STA	= 2,
};

struct wmi_cfg_rx_chain_cmd {
	__le32 action;
	struct wmi_sw_ring_cfg rx_sw_ring;
	u8 mid;
	u8 decap_trans_type;

	#define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_POS (0)
	#define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_LEN (1)
	#define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_MSK (0x1)
	u8 l2_802_3_offload_ctrl;

	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_POS (0)
	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_LEN (1)
	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_MSK (0x1)
	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_POS (1)
	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_LEN (1)
	#define L2_NWIFI_OFFLOAD_CTRL_REMOVE_PN_MSK (0x2)
	u8 l2_nwifi_offload_ctrl;

	u8 vlan_id;
	u8 nwifi_ds_trans_type;

	#define L3_L4_CTRL_IPV4_CHECKSUM_EN_POS (0)
	#define L3_L4_CTRL_IPV4_CHECKSUM_EN_LEN (1)
	#define L3_L4_CTRL_IPV4_CHECKSUM_EN_MSK (0x1)
	#define L3_L4_CTRL_TCPIP_CHECKSUM_EN_POS (1)
	#define L3_L4_CTRL_TCPIP_CHECKSUM_EN_LEN (1)
	#define L3_L4_CTRL_TCPIP_CHECKSUM_EN_MSK (0x2)
	u8 l3_l4_ctrl;

	#define RING_CTRL_OVERRIDE_PREFETCH_THRSH_POS (0)
	#define RING_CTRL_OVERRIDE_PREFETCH_THRSH_LEN (1)
	#define RING_CTRL_OVERRIDE_PREFETCH_THRSH_MSK (0x1)
	#define RING_CTRL_OVERRIDE_WB_THRSH_POS (1)
	#define RING_CTRL_OVERRIDE_WB_THRSH_LEN (1)
	#define RING_CTRL_OVERRIDE_WB_THRSH_MSK (0x2)
	#define RING_CTRL_OVERRIDE_ITR_THRSH_POS (2)
	#define RING_CTRL_OVERRIDE_ITR_THRSH_LEN (1)
	#define RING_CTRL_OVERRIDE_ITR_THRSH_MSK (0x4)
	#define RING_CTRL_OVERRIDE_HOST_THRSH_POS (3)
	#define RING_CTRL_OVERRIDE_HOST_THRSH_LEN (1)
	#define RING_CTRL_OVERRIDE_HOST_THRSH_MSK (0x8)
	u8 ring_ctrl;

	__le16 prefetch_thrsh;
	__le16 wb_thrsh;
	__le32 itr_value;
	__le16 host_thrsh;
	u8 reserved[2];
	struct wmi_sniffer_cfg sniffer_cfg;
} __packed;

/*
 * WMI_RCP_ADDBA_RESP_CMDID
 */
struct wmi_rcp_addba_resp_cmd {

	#define CIDXTID_CID_POS (0)
	#define CIDXTID_CID_LEN (4)
	#define CIDXTID_CID_MSK (0xF)
	#define CIDXTID_TID_POS (4)
	#define CIDXTID_TID_LEN (4)
	#define CIDXTID_TID_MSK (0xF0)
	u8 cidxtid;

	u8 dialog_token;
	__le16 status_code;
	__le16 ba_param_set;	/* ieee80211_ba_parameterset field to send */
	__le16 ba_timeout;
} __packed;

/*
 * WMI_RCP_DELBA_CMDID
 */
struct wmi_rcp_delba_cmd {

	#define CIDXTID_CID_POS (0)
	#define CIDXTID_CID_LEN (4)
	#define CIDXTID_CID_MSK (0xF)
	#define CIDXTID_TID_POS (4)
	#define CIDXTID_TID_LEN (4)
	#define CIDXTID_TID_MSK (0xF0)
	u8 cidxtid;

	u8 reserved;
	__le16 reason;
} __packed;

/*
 * WMI_RCP_ADDBA_REQ_CMDID
 */
struct wmi_rcp_addba_req_cmd {

	#define CIDXTID_CID_POS (0)
	#define CIDXTID_CID_LEN (4)
	#define CIDXTID_CID_MSK (0xF)
	#define CIDXTID_TID_POS (4)
	#define CIDXTID_TID_LEN (4)
	#define CIDXTID_TID_MSK (0xF0)
	u8 cidxtid;

	u8 dialog_token;
	/* ieee80211_ba_parameterset field as it received */
	__le16 ba_param_set;
	__le16 ba_timeout;
	/* ieee80211_ba_seqstrl field as it received */
	__le16 ba_seq_ctrl;
} __packed;

/*
 * WMI_SET_MAC_ADDRESS_CMDID
 */
struct wmi_set_mac_address_cmd {
	u8 mac[WMI_MAC_LEN];
	u8 reserved[2];
} __packed;


/*
* WMI_EAPOL_TX_CMDID
*/
struct wmi_eapol_tx_cmd {
	u8 dst_mac[WMI_MAC_LEN];
	__le16 eapol_len;
	u8 eapol[0];
} __packed;

/*
 * WMI_ECHO_CMDID
 *
 * Check FW is alive
 *
 * WMI_DEEP_ECHO_CMDID
 *
 * Check FW and ucode are alive
 *
 * Returned event: WMI_ECHO_RSP_EVENTID
 * same event for both commands
 */
struct wmi_echo_cmd {
	__le32 value;
} __packed;

/*
 * WMI Events
 */

/*
 * List of Events (target to host)
 */
enum wmi_event_id {
	WMI_IMM_RSP_EVENTID			= 0x0000,
	WMI_READY_EVENTID			= 0x1001,
	WMI_CONNECT_EVENTID			= 0x1002,
	WMI_DISCONNECT_EVENTID			= 0x1003,
	WMI_SCAN_COMPLETE_EVENTID		= 0x100a,
	WMI_REPORT_STATISTICS_EVENTID		= 0x100b,
	WMI_RD_MEM_RSP_EVENTID			= 0x1800,
	WMI_FW_READY_EVENTID			= 0x1801,
	WMI_EXIT_FAST_MEM_ACC_MODE_EVENTID	= 0x0200,
	WMI_ECHO_RSP_EVENTID			= 0x1803,
	WMI_CONFIG_MAC_DONE_EVENTID		= 0x1805,
	WMI_CONFIG_PHY_DEBUG_DONE_EVENTID	= 0x1806,
	WMI_ADD_STATION_DONE_EVENTID		= 0x1807,
	WMI_ADD_DEBUG_TX_PCKT_DONE_EVENTID	= 0x1808,
	WMI_PHY_GET_STATISTICS_EVENTID		= 0x1809,
	WMI_FS_TUNE_DONE_EVENTID		= 0x180a,
	WMI_CORR_MEASURE_DONE_EVENTID		= 0x180b,
	WMI_TEMP_SENSE_DONE_EVENTID		= 0x180e,
	WMI_DC_CALIB_DONE_EVENTID		= 0x180f,
	WMI_IQ_TX_CALIB_DONE_EVENTID		= 0x1811,
	WMI_IQ_RX_CALIB_DONE_EVENTID		= 0x1812,
	WMI_SET_WORK_MODE_DONE_EVENTID		= 0x1815,
	WMI_LO_LEAKAGE_CALIB_DONE_EVENTID	= 0x1816,
	WMI_MARLON_R_ACTIVATE_DONE_EVENTID	= 0x1817,
	WMI_MARLON_R_READ_DONE_EVENTID		= 0x1818,
	WMI_MARLON_R_WRITE_DONE_EVENTID		= 0x1819,
	WMI_MARLON_R_TXRX_SEL_DONE_EVENTID	= 0x181a,
	WMI_SILENT_RSSI_CALIB_DONE_EVENTID	= 0x181d,

	WMI_CFG_RX_CHAIN_DONE_EVENTID		= 0x1820,
	WMI_VRING_CFG_DONE_EVENTID		= 0x1821,
	WMI_RX_ON_DONE_EVENTID			= 0x1822,
	WMI_BA_STATUS_EVENTID			= 0x1823,
	WMI_RCP_ADDBA_REQ_EVENTID		= 0x1824,
	WMI_ADDBA_RESP_SENT_EVENTID		= 0x1825,
	WMI_DELBA_EVENTID			= 0x1826,
	WMI_GET_SSID_EVENTID			= 0x1828,
	WMI_GET_PCP_CHANNEL_EVENTID		= 0x182a,
	WMI_SW_TX_COMPLETE_EVENTID		= 0x182b,
	WMI_RX_OFF_DONE_EVENTID			= 0x182c,

	WMI_READ_MAC_RXQ_EVENTID		= 0x1830,
	WMI_READ_MAC_TXQ_EVENTID		= 0x1831,
	WMI_WRITE_MAC_RXQ_EVENTID		= 0x1832,
	WMI_WRITE_MAC_TXQ_EVENTID		= 0x1833,
	WMI_WRITE_MAC_XQ_FIELD_EVENTID		= 0x1834,

	WMI_BEAFORMING_MGMT_DONE_EVENTID	= 0x1836,
	WMI_BF_TXSS_MGMT_DONE_EVENTID		= 0x1837,
	WMI_BF_RXSS_MGMT_DONE_EVENTID		= 0x1839,
	WMI_RS_MGMT_DONE_EVENTID		= 0x1852,
	WMI_RF_MGMT_STATUS_EVENTID		= 0x1853,
	WMI_BF_SM_MGMT_DONE_EVENTID		= 0x1838,
	WMI_RX_MGMT_PACKET_EVENTID		= 0x1840,

	/* Performance monitoring events */
	WMI_DATA_PORT_OPEN_EVENTID		= 0x1860,
	WMI_WBE_LINKDOWN_EVENTID		= 0x1861,

	WMI_BF_CTRL_DONE_EVENTID		= 0x1862,
	WMI_NOTIFY_REQ_DONE_EVENTID		= 0x1863,
	WMI_GET_STATUS_DONE_EVENTID		= 0x1864,

	WMI_UNIT_TEST_EVENTID			= 0x1900,
	WMI_FLASH_READ_DONE_EVENTID		= 0x1902,
	WMI_FLASH_WRITE_DONE_EVENTID		= 0x1903,

	WMI_SET_CHANNEL_EVENTID			= 0x9000,
	WMI_ASSOC_REQ_EVENTID			= 0x9001,
	WMI_EAPOL_RX_EVENTID			= 0x9002,
	WMI_MAC_ADDR_RESP_EVENTID		= 0x9003,
	WMI_FW_VER_EVENTID			= 0x9004,
};

/*
 * Events data structures
 */

/*
 * WMI_RF_MGMT_STATUS_EVENTID
 */
enum wmi_rf_status {
	WMI_RF_ENABLED			= 0,
	WMI_RF_DISABLED_HW		= 1,
	WMI_RF_DISABLED_SW		= 2,
	WMI_RF_DISABLED_HW_SW		= 3,
};

struct wmi_rf_mgmt_status_event {
	__le32 rf_status;
} __packed;

/*
 * WMI_GET_STATUS_DONE_EVENTID
 */
struct wmi_get_status_done_event {
	__le32 is_associated;
	u8 cid;
	u8 reserved0[3];
	u8 bssid[WMI_MAC_LEN];
	u8 channel;
	u8 reserved1;
	u8 network_type;
	u8 reserved2[3];
	__le32 ssid_len;
	u8 ssid[WMI_MAX_SSID_LEN];
	__le32 rf_status;
	__le32 is_secured;
} __packed;

/*
 * WMI_FW_VER_EVENTID
 */
struct wmi_fw_ver_event {
	u8 major;
	u8 minor;
	__le16 subminor;
	__le16 build;
} __packed;

/*
* WMI_MAC_ADDR_RESP_EVENTID
*/
struct wmi_mac_addr_resp_event {
	u8 mac[WMI_MAC_LEN];
	u8 auth_mode;
	u8 crypt_mode;
	__le32 offload_mode;
} __packed;

/*
* WMI_EAPOL_RX_EVENTID
*/
struct wmi_eapol_rx_event {
	u8 src_mac[WMI_MAC_LEN];
	__le16 eapol_len;
	u8 eapol[0];
} __packed;

/*
* WMI_READY_EVENTID
*/
enum wmi_phy_capability {
	WMI_11A_CAPABILITY		= 1,
	WMI_11G_CAPABILITY		= 2,
	WMI_11AG_CAPABILITY		= 3,
	WMI_11NA_CAPABILITY		= 4,
	WMI_11NG_CAPABILITY		= 5,
	WMI_11NAG_CAPABILITY		= 6,
	WMI_11AD_CAPABILITY		= 7,
	WMI_11N_CAPABILITY_OFFSET = WMI_11NA_CAPABILITY - WMI_11A_CAPABILITY,
};

struct wmi_ready_event {
	__le32 sw_version;
	__le32 abi_version;
	u8 mac[WMI_MAC_LEN];
	u8 phy_capability;		/* enum wmi_phy_capability */
	u8 reserved;
} __packed;

/*
 * WMI_NOTIFY_REQ_DONE_EVENTID
 */
struct wmi_notify_req_done_event {
	__le32 status;
	__le64 tsf;
	__le32 snr_val;
	__le32 tx_tpt;
	__le32 tx_goodput;
	__le32 rx_goodput;
	__le16 bf_mcs;
	__le16 my_rx_sector;
	__le16 my_tx_sector;
	__le16 other_rx_sector;
	__le16 other_tx_sector;
	__le16 range;
} __packed;

/*
 * WMI_CONNECT_EVENTID
 */
struct wmi_connect_event {
	u8 channel;
	u8 reserved0;
	u8 bssid[WMI_MAC_LEN];
	__le16 listen_interval;
	__le16 beacon_interval;
	u8 network_type;
	u8 reserved1[3];
	u8 beacon_ie_len;
	u8 assoc_req_len;
	u8 assoc_resp_len;
	u8 cid;
	u8 reserved2[3];
	u8 assoc_info[0];
} __packed;

/*
 * WMI_DISCONNECT_EVENTID
 */
enum wmi_disconnect_reason {
	WMI_DIS_REASON_NO_NETWORK_AVAIL		= 1,
	WMI_DIS_REASON_LOST_LINK		= 2, /* bmiss */
	WMI_DIS_REASON_DISCONNECT_CMD		= 3,
	WMI_DIS_REASON_BSS_DISCONNECTED		= 4,
	WMI_DIS_REASON_AUTH_FAILED		= 5,
	WMI_DIS_REASON_ASSOC_FAILED		= 6,
	WMI_DIS_REASON_NO_RESOURCES_AVAIL	= 7,
	WMI_DIS_REASON_CSERV_DISCONNECT		= 8,
	WMI_DIS_REASON_INVALID_PROFILE		= 10,
	WMI_DIS_REASON_DOT11H_CHANNEL_SWITCH	= 11,
	WMI_DIS_REASON_PROFILE_MISMATCH		= 12,
	WMI_DIS_REASON_CONNECTION_EVICTED	= 13,
	WMI_DIS_REASON_IBSS_MERGE		= 14,
};

struct wmi_disconnect_event {
	__le16 protocol_reason_status;	/* reason code, see 802.11 spec. */
	u8 bssid[WMI_MAC_LEN];		/* set if known */
	u8 disconnect_reason;		/* see wmi_disconnect_reason_e */
	u8 assoc_resp_len;
	u8 assoc_info[0];
} __packed;

/*
 * WMI_SCAN_COMPLETE_EVENTID
 */
struct wmi_scan_complete_event {
	__le32 status;
} __packed;

/*
 * WMI_BA_STATUS_EVENTID
 */
enum wmi_vring_ba_status {
	WMI_BA_AGREED			= 0,
	WMI_BA_NON_AGREED		= 1,
};

struct wmi_vring_ba_status_event {
	__le16 status;
	u8 reserved[2];
	u8 ringid;
	u8 agg_wsize;
	__le16 ba_timeout;
} __packed;

/*
 * WMI_DELBA_EVENTID
 */
struct wmi_delba_event {

	#define CIDXTID_CID_POS (0)
	#define CIDXTID_CID_LEN (4)
	#define CIDXTID_CID_MSK (0xF)
	#define CIDXTID_TID_POS (4)
	#define CIDXTID_TID_LEN (4)
	#define CIDXTID_TID_MSK (0xF0)
	u8 cidxtid;

	u8 from_initiator;
	__le16 reason;
} __packed;

/*
 * WMI_VRING_CFG_DONE_EVENTID
 */
enum wmi_vring_cfg_done_event_status {
	WMI_VRING_CFG_SUCCESS		= 0,
	WMI_VRING_CFG_FAILURE		= 1,
};

struct wmi_vring_cfg_done_event {
	u8 ringid;
	u8 status;
	u8 reserved[2];
	__le32 tx_vring_tail_ptr;
} __packed;

/*
 * WMI_ADDBA_RESP_SENT_EVENTID
 */
enum wmi_rcp_addba_resp_sent_event_status {
	WMI_ADDBA_SUCCESS		= 0,
	WMI_ADDBA_FAIL			= 1,
};

struct wmi_rcp_addba_resp_sent_event {

	#define CIDXTID_CID_POS (0)
	#define CIDXTID_CID_LEN (4)
	#define CIDXTID_CID_MSK (0xF)
	#define CIDXTID_TID_POS (4)
	#define CIDXTID_TID_LEN (4)
	#define CIDXTID_TID_MSK (0xF0)
	u8 cidxtid;

	u8 reserved;
	__le16 status;
} __packed;

/*
 * WMI_RCP_ADDBA_REQ_EVENTID
 */
struct wmi_rcp_addba_req_event {

	#define CIDXTID_CID_POS (0)
	#define CIDXTID_CID_LEN (4)
	#define CIDXTID_CID_MSK (0xF)
	#define CIDXTID_TID_POS (4)
	#define CIDXTID_TID_LEN (4)
	#define CIDXTID_TID_MSK (0xF0)
	u8 cidxtid;

	u8 dialog_token;
	__le16 ba_param_set;	/* ieee80211_ba_parameterset as it received */
	__le16 ba_timeout;
	__le16 ba_seq_ctrl;	/* ieee80211_ba_seqstrl field as it received */
} __packed;

/*
 * WMI_CFG_RX_CHAIN_DONE_EVENTID
 */
enum wmi_cfg_rx_chain_done_event_status {
	WMI_CFG_RX_CHAIN_SUCCESS	= 1,
};

struct wmi_cfg_rx_chain_done_event {
	__le32 rx_ring_tail_ptr;	/* Rx V-Ring Tail pointer */
	__le32 status;
} __packed;

/*
 * WMI_WBE_LINKDOWN_EVENTID
 */
enum wmi_wbe_link_down_event_reason {
	WMI_WBE_REASON_USER_REQUEST	= 0,
	WMI_WBE_REASON_RX_DISASSOC	= 1,
	WMI_WBE_REASON_BAD_PHY_LINK	= 2,
};

struct wmi_wbe_link_down_event {
	u8 cid;
	u8 reserved[3];
	__le32 reason;
} __packed;

/*
 * WMI_DATA_PORT_OPEN_EVENTID
 */
struct wmi_data_port_open_event {
	u8 cid;
	u8 reserved[3];
} __packed;

/*
 * WMI_GET_PCP_CHANNEL_EVENTID
 */
struct wmi_get_pcp_channel_event {
	u8 channel;
	u8 reserved[3];
} __packed;

/*
 * WMI_SW_TX_COMPLETE_EVENTID
 */
enum wmi_sw_tx_status {
	WMI_TX_SW_STATUS_SUCCESS		= 0,
	WMI_TX_SW_STATUS_FAILED_NO_RESOURCES	= 1,
	WMI_TX_SW_STATUS_FAILED_TX		= 2,
};

struct wmi_sw_tx_complete_event {
	u8 status;	/* enum wmi_sw_tx_status */
	u8 reserved[3];
} __packed;

/*
 * WMI_GET_SSID_EVENTID
 */
struct wmi_get_ssid_event {
	__le32 ssid_len;
	u8 ssid[WMI_MAX_SSID_LEN];
} __packed;

/*
 * WMI_RX_MGMT_PACKET_EVENTID
 */
struct wmi_rx_mgmt_info {
	u8 mcs;
	s8 snr;
	__le16 range;
	__le16 stype;
	__le16 status;
	__le32 len;
	u8 qid;
	u8 mid;
	u8 cid;
	u8 channel;	/* From Radio MNGR */
} __packed;

struct wmi_rx_mgmt_packet_event {
	struct wmi_rx_mgmt_info info;
	u8 payload[0];
} __packed;

/*
 * WMI_ECHO_RSP_EVENTID
 */
struct wmi_echo_event {
	__le32 echoed_value;
} __packed;

#endif /* __WILOCITY_WMI_H__ */
