/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting
 * Copyright (c) 2007-2009 Marvell Semiconductor, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
 *    redistribution must be conditioned upon including a substantially
 *    similar Disclaimer requirement for further binary redistribution.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGES.
 */

/*
 * Definitions for the Marvell Wireless LAN controller Hardware Access Layer.
 */

#ifndef _MWL_REG_H
#define	_MWL_REG_H

#ifdef __cplusplus
extern "C" {
#endif

#define	MWL_MBSS_SUPPORT		/* enable multi-bss support */

/*
 * Host/Firmware Interface definitions.
 */

/*
 * Define total number of TX queues in the shared memory.
 * This count includes the EDCA queues, Block Ack queues, and HCCA queues
 * In addition to this, there could be a management packet queue some
 * time in the future
 */
#define	NUM_EDCA_QUEUES		4
#define	NUM_HCCA_QUEUES		0
#define	NUM_BA_QUEUES		0
#define	NUM_MGMT_QUEUES		0
#define	NUM_ACK_EVENT_QUEUE	1
#define	TOTAL_TX_QUEUES		\
	(NUM_EDCA_QUEUES +	\
	NUM_HCCA_QUEUES +	\
	NUM_BA_QUEUES +		\
	NUM_MGMT_QUEUES +	\
	NUM_ACK_EVENT_QUEUE)
#define	MAX_TXWCB_QUEUES	TOTAL_TX_QUEUES - NUM_ACK_EVENT_QUEUE
#define	MAX_RXWCB_QUEUES	1

/*
 * Firmware download support.
 */
#define	FW_DOWNLOAD_BLOCK_SIZE	256
#define	FW_CHECK_USECS		(5*1000) /* 5ms */
#define	FW_MAX_NUM_CHECKS	200

#define	MWL_ANT_INFO_SUPPORT /* per-antenna data in rx descriptor */

#define	MACREG_REG_TSF_LOW	0xa600 /* TSF lo */
#define	MACREG_REG_TSF_HIGH	0xa604 /* TSF hi */
#define	MACREG_REG_CHIP_REV	0xa814 /* chip rev */

/*
 * Map to 0x80000000 (Bus control) on BAR0
 */
/* From host to ARM */
#define	MACREG_REG_H2A_INTERRUPT_EVENTS		0x00000C18
#define	MACREG_REG_H2A_INTERRUPT_CAUSE		0x00000C1C
#define	MACREG_REG_H2A_INTERRUPT_MASK		0x00000C20
#define	MACREG_REG_H2A_INTERRUPT_CLEAR_SEL	0x00000C24
#define	MACREG_REG_H2A_INTERRUPT_STATUS_MASK	0x00000C28
/* From ARM to host */
#define	MACREG_REG_A2H_INTERRUPT_EVENTS		0x00000C2C
#define	MACREG_REG_A2H_INTERRUPT_CAUSE		0x00000C30
#define	MACREG_REG_A2H_INTERRUPT_MASK		0x00000C34
#define	MACREG_REG_A2H_INTERRUPT_CLEAR_SEL	0x00000C38
#define	MACREG_REG_A2H_INTERRUPT_STATUS_MASK	0x00000C3C


/* Map to 0x80000000 on BAR1 */
#define	MACREG_REG_GEN_PTR		0x00000C10
#define	MACREG_REG_INT_CODE		0x00000C14
#define	MACREG_REG_SCRATCH		0x00000C40
#define	MACREG_REG_FW_PRESENT		0x0000BFFC

#define	MACREG_REG_PROMISCUOUS		0xA300
/* Bit definitio for MACREG_REG_A2H_INTERRUPT_CAUSE (A2HRIC) */
#define	MACREG_A2HRIC_BIT_TX_DONE	0x00000001 /* bit 0 */
#define	MACREG_A2HRIC_BIT_RX_RDY	0x00000002 /* bit 1 */
#define	MACREG_A2HRIC_BIT_OPC_DONE	0x00000004 /* bit 2 */
#define	MACREG_A2HRIC_BIT_MAC_EVENT	0x00000008 /* bit 3 */
#define	MACREG_A2HRIC_BIT_RX_PROBLEM	0x00000010 /* bit 4 */

#define	MACREG_A2HRIC_BIT_RADIO_OFF	0x00000020 /* bit 5 */
#define	MACREG_A2HRIC_BIT_RADIO_ON	0x00000040 /* bit 6 */

#define	MACREG_A2HRIC_BIT_RADAR_DETECT	0x00000080 /* bit 7 */

#define	MACREG_A2HRIC_BIT_ICV_ERROR	0x00000100 /* bit 8 */
#define	MACREG_A2HRIC_BIT_MIC_ERROR	0x00000200 /* bit 9 */
#define	MACREG_A2HRIC_BIT_QUEUE_EMPTY	0x00004000
#define	MACREG_A2HRIC_BIT_QUEUE_FULL	0x00000800
#define	MACREG_A2HRIC_BIT_CHAN_SWITCH	0x00001000
#define	MACREG_A2HRIC_BIT_TX_WATCHDOG	0x00002000
#define	MACREG_A2HRIC_BIT_BA_WATCHDOG	0x00000400
#define	MACREQ_A2HRIC_BIT_TX_ACK	0x00008000
#define	ISR_SRC_BITS	((MACREG_A2HRIC_BIT_RX_RDY)	| \
			(MACREG_A2HRIC_BIT_TX_DONE)	| \
			(MACREG_A2HRIC_BIT_OPC_DONE)	| \
			(MACREG_A2HRIC_BIT_MAC_EVENT)	| \
			(MACREG_A2HRIC_BIT_MIC_ERROR)	| \
			(MACREG_A2HRIC_BIT_ICV_ERROR)	| \
			(MACREG_A2HRIC_BIT_RADAR_DETECT)| \
			(MACREG_A2HRIC_BIT_CHAN_SWITCH)	| \
			(MACREG_A2HRIC_BIT_TX_WATCHDOG)	| \
			(MACREG_A2HRIC_BIT_QUEUE_EMPTY)	| \
			(MACREG_A2HRIC_BIT_BA_WATCHDOG)	| \
			(MACREQ_A2HRIC_BIT_TX_ACK))

#define	MACREG_A2HRIC_BIT_MASK	ISR_SRC_BITS

/* Bit definitio for MACREG_REG_H2A_INTERRUPT_CAUSE (H2ARIC) */
#define	MACREG_H2ARIC_BIT_PPA_READY	0x00000001 /* bit 0 */
#define	MACREG_H2ARIC_BIT_DOOR_BELL	0x00000002 /* bit 1 */
#define	ISR_RESET			(1<<15)

/* INT code register event definition */
#define	MACREG_INT_CODE_CMD_FINISHED	0x00000005

/*
 * Define OpMode for SoftAP/Station mode
 */

/*
 * The following mode signature has to be written to PCI scratch register#0
 * right after successfully downloading the last block of firmware and
 * before waiting for firmware ready signature
 */
#define	HostCmd_STA_MODE		0x5A
#define	HostCmd_SOFTAP_MODE		0xA5

#define	HostCmd_STA_FWRDY_SIGNATURE	0xF0F1F2F4
#define	HostCmd_SOFTAP_FWRDY_SIGNATURE	0xF1F2F4A5

#define	HostCmd_CMD_CODE_DNLD			0x0001
#define	HostCmd_CMD_GET_HW_SPEC			0x0003
#define	HostCmd_CMD_SET_HW_SPEC			0x0004
#define	HostCmd_CMD_MAC_MULTICAST_ADR		0x0010
#define	HostCmd_CMD_802_11_GET_STAT		0x0014
#define	HostCmd_CMD_MAC_REG_ACCESS		0x0019
#define	HostCmd_CMD_BBP_REG_ACCESS		0x001a
#define	HostCmd_CMD_RF_REG_ACCESS		0x001b
#define	HostCmd_CMD_802_11_RADIO_CONTROL	0x001c
#define	HostCmd_CMD_802_11_RF_TX_POWER		0x001e
#define	HostCmd_CMD_802_11_RF_ANTENNA		0x0020
#define	HostCmd_CMD_SET_BEACON			0x0100
#define	HostCmd_CMD_SET_AID			0x010d
#define	HostCmd_CMD_SET_RF_CHANNEL		0x010a
#define	HostCmd_CMD_SET_INFRA_MODE		0x010e
#define	HostCmd_CMD_SET_G_PROTECT_FLAG		0x010f
#define	HostCmd_CMD_802_11_RTS_THSD		0x0113
#define	HostCmd_CMD_802_11_SET_SLOT		0x0114

#define	HostCmd_CMD_802_11H_DETECT_RADAR	0x0120
#define	HostCmd_CMD_SET_WMM_MODE		0x0123
#define	HostCmd_CMD_HT_GUARD_INTERVAL		0x0124
#define	HostCmd_CMD_SET_FIXED_RATE		0x0126
#define	HostCmd_CMD_SET_LINKADAPT_CS_MODE	0x0129
#define	HostCmd_CMD_SET_MAC_ADDR		0x0202
#define	HostCmd_CMD_SET_RATE_ADAPT_MODE		0x0203
#define	HostCmd_CMD_GET_WATCHDOG_BITMAP		0x0205

/* SoftAP command code */
#define	HostCmd_CMD_BSS_START			0x1100
#define	HostCmd_CMD_SET_NEW_STN			0x1111
#define	HostCmd_CMD_SET_KEEP_ALIVE		0x1112
#define	HostCmd_CMD_SET_APMODE			0x1114
#define	HostCmd_CMD_SET_SWITCH_CHANNEL		0x1121

/*
 * @HWENCR@
 * Command to update firmware encryption keys.
 */
#define	HostCmd_CMD_UPDATE_ENCRYPTION		0x1122
/*
 * @11E-BA@
 * Command to create/destroy block ACK
 */
#define	HostCmd_CMD_BASTREAM			0x1125
#define	HostCmd_CMD_SET_RIFS			0x1126
#define	HostCmd_CMD_SET_N_PROTECT_FLAG		0x1131
#define	HostCmd_CMD_SET_N_PROTECT_OPMODE	0x1132
#define	HostCmd_CMD_SET_OPTIMIZATION_LEVEL	0x1133
#define	HostCmd_CMD_GET_CALTABLE		0x1134
#define	HostCmd_CMD_SET_MIMOPSHT		0x1135
#define	HostCmd_CMD_GET_BEACON			0x1138
#define	HostCmd_CMD_SET_REGION_CODE		0x1139
#define	HostCmd_CMD_SET_POWERSAVESTATION	0x1140
#define	HostCmd_CMD_SET_TIM			0x1141
#define	HostCmd_CMD_GET_TIM			0x1142
#define	HostCmd_CMD_GET_SEQNO			0x1143
#define	HostCmd_CMD_DWDS_ENABLE			0x1144
#define	HostCmd_CMD_AMPDU_RETRY_RATEDROP_MODE	0x1145
#define	HostCmd_CMD_CFEND_ENABLE		0x1146

/*
 * Define general result code for each command
 */
/* RESULT OK */
#define	HostCmd_RESULT_OK		0x0000
/* Genenral error */
#define	HostCmd_RESULT_ERROR		0x0001
/* Command is not valid */
#define	HostCmd_RESULT_NOT_SUPPORT	0x0002
/* Command is pending (will be processed) */
#define	HostCmd_RESULT_PENDING		0x0003
/* System is busy (command ignored) */
#define	HostCmd_RESULT_BUSY		0x0004
/* Data buffer is not big enough */
#define	HostCmd_RESULT_PARTIAL_DATA	0x0005

#define	HostCmd_CMD_SET_EDCA_PARAMS	0x0115

/*
 * Definition of action or option for each command
 */

/*
 * Define general purpose action
 */
#define	HostCmd_ACT_GEN_READ	0x0000
#define	HostCmd_ACT_GEN_WRITE	0x0001
#define	HostCmd_ACT_GEN_GET	0x0000
#define	HostCmd_ACT_GEN_SET	0x0001
#define	HostCmd_ACT_GEN_OFF	0x0000
#define	HostCmd_ACT_GEN_ON	0x0001

#define	HostCmd_ACT_DIFF_CHANNEL	0x0002
#define	HostCmd_ACT_GEN_SET_LIST	0x0002

/* Define action or option for HostCmd_FW_USE_FIXED_RATE */
#define	HostCmd_ACT_USE_FIXED_RATE	0x0001
#define	HostCmd_ACT_NOT_USE_FIXED_RATE	0x0002

/* Define action or option for HostCmd_CMD_802_11_SET_WEP */
#define	HostCmd_ACT_ADD		0x0002
#define	HostCmd_ACT_REMOVE	0x0004
#define	HostCmd_ACT_USE_DEFAULT	0x0008

/*
 * PUBLIC DEFINITIONS
 */
#define	RATE_INDEX_MAX_ARRAY	14
#define	WOW_MAX_STATION		32


#pragma pack(1)

struct mwl_ant_info {
	uint8_t		rssi_a;	/* RSSI for antenna A */
	uint8_t		rssi_b;	/* RSSI for antenna B */
	uint8_t		rssi_c;	/* RSSI for antenna C */
	uint8_t		rsvd1;	/* Reserved */
	uint8_t		nf_a;	/* Noise floor for antenna A */
	uint8_t		nf_b;	/* Noise floor for antenna B */
	uint8_t		nf_c;	/* Noise floor for antenna C */
	uint8_t		rsvd2;	/* Reserved */
	uint8_t		nf;	/* Noise floor */
	uint8_t		rsvd3[3]; /* Reserved - To make word aligned */
};

/*
 * Hardware tx/rx descriptors.
 *
 * NB: tx descriptor size must match f/w expected size
 * because f/w prefetch's the next descriptor linearly
 * and doesn't chase the next pointer.
 */
struct mwl_txdesc {
	uint32_t	Status;
#define	EAGLE_TXD_STATUS_IDLE		0x00000000
#define	EAGLE_TXD_STATUS_USED		0x00000001
#define	EAGLE_TXD_STATUS_OK		0x00000001
#define	EAGLE_TXD_STATUS_OK_RETRY	0x00000002
#define	EAGLE_TXD_STATUS_OK_MORE_RETRY	0x00000004
#define	EAGLE_TXD_STATUS_MULTICAST_TX	0x00000008
#define	EAGLE_TXD_STATUS_BROADCAST_TX	0x00000010
#define	EAGLE_TXD_STATUS_FAILED_LINK_ERROR		0x00000020
#define	EAGLE_TXD_STATUS_FAILED_EXCEED_LIMIT		0x00000040
#define	EAGLE_TXD_STATUS_FAILED_XRETRY	EAGLE_TXD_STATUS_FAILED_EXCEED_LIMIT
#define	EAGLE_TXD_STATUS_FAILED_AGING	0x00000080
#define	EAGLE_TXD_STATUS_FW_OWNED	0x80000000
	uint8_t		DataRate;
	uint8_t		TxPriority;
	uint16_t	QosCtrl;
	uint32_t	PktPtr;
	uint16_t	PktLen;
	uint8_t		DestAddr[6];
	uint32_t	pPhysNext;
	uint32_t	SapPktInfo;
#define	EAGLE_TXD_MODE_BONLY	1
#define	EAGLE_TXD_MODE_GONLY	2
#define	EAGLE_TXD_MODE_BG	3
#define	EAGLE_TXD_MODE_NONLY	4
#define	EAGLE_TXD_MODE_BN	5
#define	EAGLE_TXD_MODE_GN	6
#define	EAGLE_TXD_MODE_BGN	7
#define	EAGLE_TXD_MODE_AONLY	8
#define	EAGLE_TXD_MODE_AG	10
#define	EAGLE_TXD_MODE_AN	12
	uint16_t	Format;
#define	EAGLE_TXD_FORMAT	0x0001	/* frame format/rate */
#define	EAGLE_TXD_FORMAT_LEGACY	0x0000	/* legacy rate frame */
#define	EAGLE_TXD_FORMAT_HT	0x0001	/* HT rate frame */
#define	EAGLE_TXD_GI		0x0002	/* guard interval */
#define	EAGLE_TXD_GI_SHORT	0x0002	/* short guard interval */
#define	EAGLE_TXD_GI_LONG	0x0000	/* long guard interval */
#define	EAGLE_TXD_CHW		0x0004	/* channel width */
#define	EAGLE_TXD_CHW_20	0x0000	/* 20MHz channel width */
#define	EAGLE_TXD_CHW_40	0x0004	/* 40MHz channel width */
#define	EAGLE_TXD_RATE		0x01f8	/* tx rate (legacy)/ MCS */
#define	EAGLE_TXD_RATE_S	3
#define	EAGLE_TXD_ADV		0x0600	/* advanced coding */
#define	EAGLE_TXD_ADV_S		9
#define	EAGLE_TXD_ADV_NONE	0x0000
#define	EAGLE_TXD_ADV_LDPC	0x0200
#define	EAGLE_TXD_ADV_RS	0x0400
/* NB: 3 is reserved */
#define	EAGLE_TXD_ANTENNA	0x1800	/* antenna select */
#define	EAGLE_TXD_ANTENNA_S	11
#define	EAGLE_TXD_EXTCHAN	0x6000	/* extension channel */
#define	EAGLE_TXD_EXTCHAN_S	13
#define	EAGLE_TXD_EXTCHAN_HI	0x0000	/* above */
#define	EAGLE_TXD_EXTCHAN_LO	0x2000	/* below */
#define	EAGLE_TXD_PREAMBLE	0x8000
#define	EAGLE_TXD_PREAMBLE_SHORT 0x8000	/* short preamble */
#define	EAGLE_TXD_PREAMBLE_LONG 0x0000	/* long preamble */
	uint16_t	pad;		/* align to 4-byte boundary */
#define	EAGLE_TXD_FIXED_RATE	0x0100	/* get tx rate from Format */
#define	EAGLE_TXD_DONT_AGGR	0x0200	/* don't aggregate frame */
	uint32_t	ack_wcb_addr;
};

struct mwl_rxdesc {
	/* control element */
	uint8_t		RxControl;
#define	EAGLE_RXD_CTRL_DRIVER_OWN	0x00
#define	EAGLE_RXD_CTRL_OS_OWN		0x04
#define	EAGLE_RXD_CTRL_DMA_OWN		0x80
	/* received signal strengt indication */
	uint8_t		RSSI;
	/* status field w/ USED bit */
	uint8_t		Status;
#define	EAGLE_RXD_STATUS_IDLE		0x00
#define	EAGLE_RXD_STATUS_OK		0x01
#define	EAGLE_RXD_STATUS_MULTICAST_RX	0x02
#define	EAGLE_RXD_STATUS_BROADCAST_RX	0x04
#define	EAGLE_RXD_STATUS_FRAGMENT_RX	0x08
#define	EAGLE_RXD_STATUS_GENERAL_DECRYPT_ERR	0xff
#define	EAGLE_RXD_STATUS_DECRYPT_ERR_MASK	0x80
#define	EAGLE_RXD_STATUS_TKIP_MIC_DECRYPT_ERR	0x02
#define	EAGLE_RXD_STATUS_WEP_ICV_DECRYPT_ERR	0x04
#define	EAGLE_RXD_STATUS_TKIP_ICV_DECRYPT_ERR	0x08
	/* channel # pkt received on */
	uint8_t		Channel;
	/* total length of received data */
	uint16_t	PktLen;
	/* not used */
	uint8_t		SQ2;
	/* received data rate */
	uint8_t		Rate;
	/* physical address of payload data */
	uint32_t	pPhysBuffData;
	/* physical address of next RX desc */
	uint32_t	pPhysNext;
	/* received QosCtrl field variable */
	uint16_t	QosCtrl;
	/* like name states */
	uint16_t	HtSig2;
#ifdef MWL_ANT_INFO_SUPPORT
	/* antenna info */
	struct mwl_ant_info ai;
#endif
};
#pragma pack()



// =============================================================================
//			HOST COMMAND DEFINITIONS
// =============================================================================

//
// Definition of data structure for each command
//
// Define general data structure
#pragma pack(1)
typedef struct {
	uint16_t	Cmd;
	uint16_t	Length;
#ifdef MWL_MBSS_SUPPORT
	uint8_t		SeqNum;
	uint8_t		MacId;
#else
	uint16_t	SeqNum;
#endif
	uint16_t	Result;
} FWCmdHdr;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint8_t		annex;
	uint8_t		index;
	uint8_t		len;
	uint8_t		Reserverd;
#define	CAL_TBL_SIZE	160
	uint8_t	calTbl[CAL_TBL_SIZE];
} HostCmd_FW_GET_CALTABLE;

typedef struct {
	FWCmdHdr	CmdHdr;
	/* version of the HW */
	uint8_t		Version;
	/* host interface */
	uint8_t		HostIf;
	/* Max. number of WCB FW can handle */
	uint16_t	NumOfWCB;
	/* MaxNbr of MC addresses FW can handle */
	uint16_t	NumOfMCastAddr;
	/* MAC address programmed in HW */
	uint8_t		PermanentAddr[6];
	uint16_t	RegionCode;
	/* Number of antenna used */
	uint16_t	NumberOfAntenna;
	/* 4 byte of FW release number */
	uint32_t	FWReleaseNumber;
	uint32_t	WcbBase0;
	uint32_t	RxPdWrPtr;
	uint32_t	RxPdRdPtr;
	uint32_t	ulFwAwakeCookie;
	uint32_t	WcbBase1[3];
} HostCmd_DS_GET_HW_SPEC;

typedef struct {
	FWCmdHdr	CmdHdr;
	/* HW revision */
	uint8_t		Version;
	/* Host interface */
	uint8_t		HostIf;
	/* Max. number of Multicast address FW can handle */
	uint16_t	NumOfMCastAdr;
	/* MAC address */
	uint8_t		PermanentAddr[6];
	/* Region Code */
	uint16_t	RegionCode;
	/* 4 byte of FW release number */
	uint32_t	FWReleaseNumber;
	/* Firmware awake cookie */
	uint32_t	ulFwAwakeCookie;
	/* Device capabilities (see above) */
	uint32_t	DeviceCaps;
	/* Rx shared memory queue */
	uint32_t	RxPdWrPtr;
	/* TX queues in WcbBase array */
	uint32_t	NumTxQueues;
	/* TX WCB Rings */
	uint32_t	WcbBase[MAX_TXWCB_QUEUES];
	uint32_t	Flags;
#define	SET_HW_SPEC_DISABLEMBSS		0x08
#define	SET_HW_SPEC_HOSTFORM_BEACON	0x10
#define	SET_HW_SPEC_HOSTFORM_PROBERESP	0x20
#define	SET_HW_SPEC_HOST_POWERSAVE	0x40
#define	SET_HW_SPEC_HOSTENCRDECR_MGMT	0x80
	uint32_t	TxWcbNumPerQueue;
	uint32_t	TotalRxWcb;
}HostCmd_DS_SET_HW_SPEC;

// used for stand alone bssid sets/clears
typedef struct {
	FWCmdHdr	CmdHdr;
#ifdef MWL_MBSS_SUPPORT
	uint16_t	MacType;
#define	WL_MAC_TYPE_PRIMARY_CLIENT	0
#define	WL_MAC_TYPE_SECONDARY_CLIENT	1
#define	WL_MAC_TYPE_PRIMARY_AP		2
#define	WL_MAC_TYPE_SECONDARY_AP	3
#endif
	uint8_t		MacAddr[6];
} HostCmd_DS_SET_MAC,
	HostCmd_FW_SET_BSSID,
	HostCmd_FW_SET_MAC;

typedef struct {
	uint32_t	LegacyRateBitMap;
	uint32_t	HTRateBitMap;
	uint16_t	CapInfo;
	uint16_t	HTCapabilitiesInfo;
	uint8_t		MacHTParamInfo;
	uint8_t		Rev;
	struct {
		uint8_t		ControlChan;
		uint8_t		AddChan;
		uint16_t	OpMode;
		uint16_t	stbc;
	} AddHtInfo;
} PeerInfo_t;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	AID;
	uint8_t		MacAddr[6];
	uint16_t	StnId;
	uint16_t	Action;
	uint16_t	Reserved;
	PeerInfo_t	PeerInfo;
	uint8_t		Qosinfo;
	uint8_t		isQosSta;
	uint32_t	FwStaPtr;
} HostCmd_FW_SET_NEW_STN;

/* Define data structure for HostCmd_CMD_802_11_RF_ANTENNA */
typedef struct _HostCmd_DS_802_11_RF_ANTENNA {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;
	/* Number of antennas or 0xffff(diversity) */
	uint16_t	AntennaMode;
} HostCmd_DS_802_11_RF_ANTENNA;

/* Define data structure for HostCmd_CMD_802_11_RADIO_CONTROL */
typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;
	/*
	 *  @bit0: 1/0, on/off
	 *  @bit1: 1/0, long/short
	 *  @bit2: 1/0,auto/fix
	 */
	uint16_t	Control;
	uint16_t	RadioOn;
} HostCmd_DS_802_11_RADIO_CONTROL;

/* for HostCmd_CMD_SET_WMM_MODE */
typedef struct {
	FWCmdHdr	CmdHdr;
	/* 0->unset, 1->set */
	uint16_t	Action;
} HostCmd_FW_SetWMMMode;

/* bits 0-5 specify frequency band */
#define	FREQ_BAND_2DOT4GHZ	0x0001
#define	FREQ_BAND_4DOT9GHZ	0x0002	/* XXX not implemented */
#define	FREQ_BAND_5GHZ		0x0004
#define	FREQ_BAND_5DOT2GHZ	0x0008	/* XXX not implemented */
/* bits 6-10 specify channel width */
#define	CH_AUTO_WIDTH		0x0000	/* XXX not used? */
#define	CH_10_MHz_WIDTH		0x0040
#define	CH_20_MHz_WIDTH		0x0080
#define	CH_40_MHz_WIDTH		0x0100
/* bits 11-12 specify extension channel */
#define	EXT_CH_NONE		0x0000	/* no extension channel */
#define	EXT_CH_ABOVE_CTRL_CH	0x0800	/* extension channel above */
#define	EXT_CH_AUTO		0x1000	/* XXX not used? */
#define	EXT_CH_BELOW_CTRL_CH	0x1800	/* extension channel below */
/* bits 13-31 are reserved */

#define	FIXED_RATE_WITH_AUTO_RATE_DROP		0
#define	FIXED_RATE_WITHOUT_AUTORATE_DROP	1

#define	LEGACY_RATE_TYPE			0
#define	HT_RATE_TYPE				1

#define	RETRY_COUNT_VALID			0
#define	RETRY_COUNT_INVALID			1

// Define data structure for HostCmd_CMD_802_11_RF_CHANNEL
typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;
	uint8_t		CurrentChannel;	/* channel # */
	uint32_t	ChannelFlags;	/* see below */
} HostCmd_FW_SET_RF_CHANNEL;

#define	TX_POWER_LEVEL_TOTAL	8

/* Define data structure for HostCmd_CMD_802_11_RF_TX_POWER */
typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;
	uint16_t	SupportTxPowerLevel;
	uint16_t	CurrentTxPowerLevel;
	uint16_t	Reserved;
	uint16_t	PowerLevelList[TX_POWER_LEVEL_TOTAL];
} HostCmd_DS_802_11_RF_TX_POWER;

typedef struct {
	/*
	 * lower rate after the retry count
	 * 0: legacy, 1: HT
	 */
	uint32_t	FixRateType;
	/*
	 *  0: retry count is not valid
	 *  1: use retry count specified
	 */
	uint32_t	RetryCountValid;
} FIX_RATE_FLAG;

typedef  struct {
	FIX_RATE_FLAG	FixRateTypeFlags;
	/* legacy rate(not index) or an MCS code */
	uint32_t	FixedRate;
	uint32_t	RetryCount;
} FIXED_RATE_ENTRY;

typedef  struct {
	FWCmdHdr	CmdHdr;
	/*
	 * HostCmd_ACT_GEN_GET			0x0000
	 * HostCmd_ACT_GEN_SET 			0x0001
	 * HostCmd_ACT_NOT_USE_FIXED_RATE	0x0002
	 */
	uint32_t	Action;
	/* use fixed rate specified but firmware can drop */
	uint32_t	AllowRateDrop;
	uint32_t	EntryCount;
	FIXED_RATE_ENTRY FixedRateTable[4];
	uint8_t		MulticastRate;
	uint8_t		MultiRateTxType;
	uint8_t		ManagementRate;
} HostCmd_FW_USE_FIXED_RATE;

/* Define data structure for HostCmd_CMD_SET_RATE_ADAPT_MODE */
typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;
	uint16_t	RateAdaptMode;
} HostCmd_DS_SET_RATE_ADAPT_MODE;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint8_t	OptLevel;
} HostCmd_FW_SET_OPTIMIZATION_LEVEL;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	regionCode;
} HostCmd_SET_REGIONCODE_INFO;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;	/* 0: Get. 1:Set */
	uint32_t	Option;	/* 0: default. 1:Aggressive */
	uint32_t	Threshold;	/* Range 0-200, default 8 */
} HostCmd_FW_AMPDU_RETRY_RATEDROP_MODE;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint32_t	Enable;	/* 0 -- Disable. or 1 -- Enable */
} HostCmd_CFEND_ENABLE;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint32_t	Enable;	/* FALSE: Disable or TRUE: Enable */
} HostCmd_DS_BSS_START;

typedef struct {
	FWCmdHdr	CmdHdr;
} HostCmd_FW_SET_INFRA_MODE;

/* used for AID sets/clears */
typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	AssocID;
	uint8_t		MacAddr[6]; /* AP's Mac Address(BSSID) */
	uint32_t	GProtection;
	uint8_t		ApRates[RATE_INDEX_MAX_ARRAY];
} HostCmd_FW_SET_AID;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;
	uint16_t	Threshold;
} HostCmd_DS_802_11_RTS_THSD;

/* Define data structure for HostCmd_CMD_SET_LINKADAPT_CS_MODE */
typedef struct {
	FWCmdHdr	CmdHdr;
	uint16_t	Action;
	uint16_t	CSMode;
} HostCmd_DS_SET_LINKADAPT_CS_MODE;

typedef struct {
	FWCmdHdr	CmdHdr;
	uint32_t	ActionType; /* ENCR_ACTION_TYPE */
	uint32_t	DataLength; /* size of the data buffer attached */
#ifdef MWL_MBSS_SUPPORT
	uint8_t	macaddr[6];
#endif
	uint8_t	ActionData[1];
} HostCmd_FW_UPDATE_ENCRYPTION;

/*
 * @HWENCR@
 * Hardware Encryption related data structures and constant definitions.
 * Note that all related changes are marked with the @HWENCR@ tag.
 */

#define	MAX_ENCR_KEY_LENGTH	16	/* max 128 bits - depends on type */
#define	MIC_KEY_LENGTH		8	/* size of Tx/Rx MIC key - 8 bytes */

#define	ENCR_KEY_TYPE_ID_WEP	0x00	/* Key type is WEP */
#define	ENCR_KEY_TYPE_ID_TKIP	0x01	/* Key type is TKIP */
#define	ENCR_KEY_TYPE_ID_AES	0x02	/* Key type is AES-CCMP	*/

/*
 * flags used in structure - same as driver EKF_XXX flags
 */
/* indicate key is in use */
#define	ENCR_KEY_FLAG_INUSE		0x00000001
/* Group key for RX only */
#define	ENCR_KEY_FLAG_RXGROUPKEY	0x00000002
/* Group key for TX */
#define	ENCR_KEY_FLAG_TXGROUPKEY	0x00000004
/* pairwise */
#define	ENCR_KEY_FLAG_PAIRWISE		0x00000008
/* only used for RX */
#define	ENCR_KEY_FLAG_RXONLY		0x00000010
/*
 * These flags are new additions - for hardware encryption commands only
 */
/* Key is for Authenticator */
#define	ENCR_KEY_FLAG_AUTHENTICATOR	0x00000020
/* Sequence counters valid */
#define	ENCR_KEY_FLAG_TSC_VALID		0x00000040
/* Tx key for WEP */
#define	ENCR_KEY_FLAG_WEP_TXKEY		0x01000000
/* Tx/Rx MIC keys are valid */
#define	ENCR_KEY_FLAG_MICKEY_VALID	0x02000000

/*
 * Key material definitions (for WEP, TKIP, & AES-CCMP)
 */

/*
 * WEP Key material definition
 * ----------------------------
 * WEPKey	--> An array of 'MAX_ENCR_KEY_LENGTH' bytes.
 * Note that we do not support 152bit WEP keys
 */
typedef struct {
	/* WEP key material (max 128bit) */
	uint8_t	KeyMaterial[MAX_ENCR_KEY_LENGTH];
} WEP_TYPE_KEY;

/*
 * TKIP Key material definition
 * ----------------------------
 * This structure defines TKIP key material. Note that
 * the TxMicKey and RxMicKey may or may not be valid.
 */
/*
 * TKIP Sequence counter - 24 bits
 * Incremented on each fragment MPDU
 */
typedef struct {
	uint16_t	low;
	uint32_t	high;
} ENCR_TKIPSEQCNT;

/*
 * TKIP Key material. Key type (group or pairwise key) is
 * determined by flags in KEY_PARAM_SET structure
 */
typedef struct {
	uint8_t		KeyMaterial[MAX_ENCR_KEY_LENGTH];
	uint8_t		TkipTxMicKey[MIC_KEY_LENGTH];
	uint8_t		TkipRxMicKey[MIC_KEY_LENGTH];
	ENCR_TKIPSEQCNT	TkipRsc;
	ENCR_TKIPSEQCNT	TkipTsc;
} TKIP_TYPE_KEY;

/*
 * AES-CCMP Key material definition
 * --------------------------------
 * This structure defines AES-CCMP key material.
 */
typedef struct {
	/* AES Key material */
	uint8_t	KeyMaterial[MAX_ENCR_KEY_LENGTH];
} AES_TYPE_KEY;

/*
 * UPDATE_ENCRYPTION command action type.
 */
typedef enum {
	/* request to enable/disable HW encryption */
	EncrActionEnableHWEncryption,
	/* request to set encryption key */
	EncrActionTypeSetKey,
	/* request to remove one or more keys */
	EncrActionTypeRemoveKey,
	EncrActionTypeSetGroupKey
} ENCR_ACTION_TYPE;

/*
 * Encryption key definition.
 * --------------------------
 * This structure provides all required/essential
 * information about the key being set/removed.
 */
typedef struct {
	uint16_t	Length;		/* Total length of this structure */
	uint16_t	KeyTypeId;	/* Key type - WEP, TKIP or AES-CCMP */
	uint32_t	KeyInfo;	/* key flags */
	uint32_t	KeyIndex; 	/* For WEP only - actual key index */
	uint16_t	KeyLen;		/* Size of the key */
	union {				/* Key material (variable size array) */
		WEP_TYPE_KEY	WepKey;
		TKIP_TYPE_KEY	TkipKey;
		AES_TYPE_KEY	AesKey;
	} Key;
#ifdef MWL_MBSS_SUPPORT
	uint8_t	Macaddr[6];
#endif
} KEY_PARAM_SET;


typedef struct {
	FWCmdHdr	CmdHdr;
	uint32_t	ActionType;	/* ENCR_ACTION_TYPE */
	uint32_t	DataLength;	/* size of the data buffer attached */
	KEY_PARAM_SET	KeyParam;
#ifndef MWL_MBSS_SUPPORT
	uint8_t		Macaddr[8];
#endif
} HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY;
#pragma pack()

#ifdef __cplusplus
}
#endif

#endif /* _MWL_REG_H */