/*
 * public_commands.h
 *
 * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.      
 * All rights reserved.                                                  
 *                                                                       
 * Redistribution and use in source and binary forms, with or without    
 * modification, are permitted provided that the following conditions    
 * are met:                                                              
 *                                                                       
 *  * Redistributions of source code must retain the above copyright     
 *    notice, this list of conditions and the following disclaimer.      
 *  * Redistributions in binary form must reproduce the above copyright  
 *    notice, this list of conditions and the following disclaimer in    
 *    the documentation and/or other materials provided with the         
 *    distribution.                                                      
 *  * Neither the name Texas Instruments nor the names of its            
 *    contributors may be used to endorse or promote products derived    
 *    from this software without specific prior written permission.      
 *                                                                       
 * 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 MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * 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 DAMAGE.
 */

/**********************************************************************************************************************

  FILENAME:       public_commands.h

  DESCRIPTION:    Command definitions shared with host



***********************************************************************************************************************/
#ifndef PUBLIC_COMMANDS_H
#define PUBLIC_COMMANDS_H


#include "public_types.h"
#include "public_radio.h"

typedef enum
{
    CMD_INTERROGATE     = 1,    /*use this to read information elements*/
    CMD_CONFIGURE       = 2,    /*use this to write information elements*/
    CMD_ENABLE_RX       = 3,
    CMD_ENABLE_TX       = 4,
    CMD_DISABLE_RX      = 5,
    CMD_DISABLE_TX      = 6,
    CMD_SCAN            = 8,
    CMD_STOP_SCAN       = 9,

    CMD_START_JOIN      = 11,
    CMD_SET_KEYS        = 12,
    CMD_READ_MEMORY     = 13,
    CMD_WRITE_MEMORY    = 14,

    CMD_SET_TEMPLATE    = 19,
    CMD_TEST            = 23,

    CMD_NOISE_HIST      = 28,
    
    CMD_LNA_CONTROL     = 32,
    CMD_SET_BCN_MODE    = 33,

    CMD_MEASUREMENT      = 34,
    CMD_STOP_MEASUREMENT = 35,
    CMD_DISCONNECT       = 36,
    CMD_SET_PS_MODE      = 37,

    CMD_CHANNEL_SWITCH   = 38,
    CMD_STOP_CHANNEL_SWICTH = 39,

    CMD_AP_DISCOVERY     = 40,
    CMD_STOP_AP_DISCOVERY = 41,

    CMD_SPS_SCAN = 42,
    CMD_STOP_SPS_SCAN = 43,
    
    CMD_HEALTH_CHECK     = 45,     
    CMD_DEBUG            = 46, 
    CMD_TRIGGER_SCAN_TO  = 47,

    CMD_CONNECTION_SCAN_CFG        = 48,
    CMD_CONNECTION_SCAN_SSID_CFG   = 49,
    CMD_START_PERIODIC_SCAN        = 50,
    CMD_STOP_PERIODIC_SCAN         = 51,
    CMD_SET_STA_STATE              = 52,

NUM_COMMANDS,
    MAX_COMMAND_ID = 0xFFFF
} Command_enum;

#ifdef HOST_COMPILE
typedef uint16 Command_e;
#else
typedef Command_enum Command_e;
#endif


#ifdef HOST_COMPILE

#define     CMD_MAILBOX_IDLE               0
#define     CMD_STATUS_SUCCESS             1
#define     CMD_STATUS_UNKNOWN_CMD         2
#define     CMD_STATUS_UNKNOWN_IE          3
#define     CMD_STATUS_REJECT_MEAS_SG_ACTIVE    11
#define     CMD_STATUS_RX_BUSY             13
#define     CMD_STATUS_INVALID_PARAM       14
#define     CMD_STATUS_TEMPLATE_TOO_LARGE  15 
#define     CMD_STATUS_OUT_OF_MEMORY       16 
#define     CMD_STATUS_STA_TABLE_FULL      17
#define     CMD_STATUS_RADIO_ERROR         18
#define     CMD_STATUS_WRONG_NESTING       19
#define     CMD_STATUS_TIMEOUT             21 /* Driver internal use.*/
#define     CMD_STATUS_FW_RESET            22 /* Driver internal use.*/
#define     MAX_COMMAND_STATUS             MAX_POSITIVE16

#else

typedef enum
{
    CMD_MAILBOX_IDLE              =  0,
    CMD_STATUS_SUCCESS            =  1,
    CMD_STATUS_UNKNOWN_CMD        =  2,
    CMD_STATUS_UNKNOWN_IE         =  3,
    CMD_STATUS_REJECT_MEAS_SG_ACTIVE =  11,
    CMD_STATUS_RX_BUSY            = 13,
    CMD_STATUS_INVALID_PARAM      = 14,
    CMD_STATUS_TEMPLATE_TOO_LARGE = 15, 
    CMD_STATUS_OUT_OF_MEMORY      = 16, 
    CMD_STATUS_STA_TABLE_FULL     = 17,
    CMD_STATUS_RADIO_ERROR        = 18,
    CMD_STATUS_WRONG_NESTING      = 19,
    CMD_STATUS_TIMEOUT            = 21, /* Driver internal use.*/
    CMD_STATUS_FW_RESET           = 22, /* Driver internal use.*/
    MAX_COMMAND_STATUS            = MAX_POSITIVE16
} CommandStatus_enum;

#endif

#ifdef HOST_COMPILE
typedef uint16 CommandStatus_e;
#else
typedef CommandStatus_enum CommandStatus_e;
#endif

#define MAX_CMD_PARAMS 610

#define DEBUG_INDICATOR      0x8000    

typedef struct
{
    Command_e cmdID;
    CommandStatus_e cmdStatus;
    uint8 parameters[MAX_CMD_PARAMS];
} Command_t;


/******************************************************************************

    ID:       CMD_INTERROGATE
    Desc:     This command requests an information element from the WiLink. The 
              interface for this command is somewhat different from other commands 
              since the interface is bi-directional and asymmetric. 
              The host structure consists of the Command ID, a Command Status 
              (returned by WiLink) place holder, and the Information Element Heading
              (ID and expected length).
              The response to that command is a buffer of the information element's 
              actual values returned by the WiLink just after the command is issued.
              The response to that command is a buffer of the information element's 
              actual values returned by the WiLink just after the command is issued.
    Params:   InfoElement_t - see below.
              
    
******************************************************************************/
/*
Description of InfoElement structure - defined in "public_infoele.h"
offset  length  source  description
======  ======  ======  ===========
0       2       host    Information Element ID - contains the ID of the requested 
                        information element (refer to InfoElement_enum in 
                        pblic_infoele.h). In response to this command, the WiLink 
                        writes the requested information element to the response area 
                        for the command mailbox.
2       4       wilink  Length - the length of the response (different for each IE
                        according to definitions in public_infoele.h).
4       Length  wilink  IE payload according to definition in public_infoele.h.
*/



/******************************************************************************

    ID:       CMD_CONFIGURE
    Desc:     This command configures an information element in the WiLink. 
    Params:   InfoElement_t - see below.

******************************************************************************/
/*
Description of InfoElement structure - defined in "public_infoele.h"
offset  length  source  description
======  ======  ======  ===========
0       2       host    Information Element ID - contains the ID of the requested 
                        information element (refer to InfoElement_enum in 
                        pblic_infoele.h). In response to this command, the WiLink 
                        writes the requested information element to the response area 
                        for the command mailbox.
2       4       host    Length - the length of the response (different for each IE
                        according to definitions in public_infoele.h).
4       Length  host    IE payload according to definition in public_infoele.h.
*/


/******************************************************************************

    ID:       CMD_ENABLE_RX
    Desc:     This command enables the normal reception of frames. 
    Params:   Channel Number - this field indicates the radio channel on which to
                               receive data. This parameter also sets the channel on
                               which to transmit. The last channel number used, 
                               regardless of the order in which the ENABLE_RX and 
                               ENABLE_TX commands are issued, is the channel number 
                               for both RX and TX. This command must be issued after 
                               the host has set all necessary configuration elements 
                               appropriately.
    
******************************************************************************/



/******************************************************************************

    ID:       CMD_ENABLE_TX
    Desc:     This command enables the normal transmission of frames.  
    Params:   Channel Number - this field indicates the radio channel on which to
                               transmit data. This parameter also sets the channel on
                               which to receive. The last channel number used, 
                               regardless of the order in which the ENABLE_RX and 
                               ENABLE_TX commands are issued, is the channel number 
                               for both RX and TX. This command must be issued after
                               the host has set all necessary configuration elements
                               appropriately.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_DISABLE_RX
    Desc:     This command disables the normal reception of packets over the 
              Baseband interface. 
    Params:   None
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_DISABLE_TX
    Desc:     This command disables the normal transmission of frames. 
    Params:   None.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_SCAN
    Desc:     This command instructs the WiLink to scan for BSS/IBSSs. The host 
              may perform either an active scan or a passive scan. During an active
              scan, the WiLink transmits a probe request on the specified channel(s) 
              and then listens for beacon/probe responses. During a passive scan, the 
              WiLink monitors the specified channel(s) for beacons.
              The WiLink sends SCAN_COMPLETE event to notify the host when it has 
              completed a scan.
    Params:   ScanParameters_t - see below
    
******************************************************************************/
/*
Offset  Length  Definition
0       8       RX filters for Scan (refer to ACXRxConfigStruct)
8       2       Scan options (Band select, Voice mode and Scan type = Active/Passive)
10      1       NumChannels 
11      1       Number of Probe requests (used for Active scan)
12      2       Probe request rate & modulation
14      1       AC trigger (for Voice mode only)
15      1       SSID length
16      32      SSID string (Null terminated)
48      2       Channel [0] ScanMinDuration
50      2       Channel [0] ScanMaxDuration 
52      6       Channel [0] BSSID (4 bytes LOW and 2 bytes HIGH)
58      1       Channel [0].bit0-3: Early Termination count. Bit 4-5: Condition
59      1       Channel [0] TX power level for Scan (0 means do not change - other values:1-5)
60      1       Channel [0] Channel  
61      3       Channel [0] Reserved
64-404  340     Optional Channel [1] - Channel [15] - same format as Channel [0] fields above.
*/

/* Defines for Rx "ConfigOptions".*/
/* Only bits 2-10 can be configured by the Driver".*/
#define CFG_RX_SERIAL           BIT_0    /* 0 = use parallel interface,         1 = use serial interface from ACX101- not valid.*/
#define CFG_RX_RAW              BIT_1    /* 1 = write all data from baseband to frame buffer including PHY header.*/
#define CFG_RX_FCS              BIT_2    /* 1 = write FCS to end of frame in memory, 0 = do not write FCS to memory.*/
#define CFG_RX_ALL_GOOD         BIT_3    /* promiscuous mode, receive all good frames.*/
#define CFG_UNI_FILTER_EN       BIT_4    /* local MAC address filter enable.*/
#define CFG_BSSID_FILTER_EN     BIT_5    /* BSSID filter enable.*/
#define CFG_MC_FILTER_EN        BIT_6    /* 0 = receive all multicast,          1 = use one or both multicast address filters.*/
#define CFG_MC_ADDR0_EN         BIT_7    /* 1 = receive frames from mc_addr0,   0 = do not use this filter.*/
#define CFG_MC_ADDR1_EN         BIT_8    /* 1 = receive frames from mc_addr1,   0 = do not use this filter .*/
#define CFG_BC_REJECT_EN        BIT_9    /* 0 = receive all broadcast,          1 = filter all broadcast.*/
#define CFG_SSID_FILTER_EN      BIT_10   /* SSID Filter Enable.*/
#define CFG_RX_INT_FCS_ERROR    BIT_11   /* 1 = give rx complete interrupt for FCS errors.*/
#define CFG_RX_INT_ENCRYPTED    BIT_12   /* 1 = only give rx header interrupt if frame is encrypted.*/
#define CFG_RX_WR_RX_STATUS     BIT_13   /* 0 = do not write three status words, 1 = write three receive status words to top of rx'd MPDU.*/
#define CFG_RX_FILTER_NULTI     BIT_14   /* 1 = filter multicast/broadcast frame if SA matchs local MAC addr->.*/
#define CFG_RX_RESERVE          BIT_15   /* reserve.*/
#define CFG_RX_TIMESTAMP_TSF    BIT_16   /* 1 = sample frame's' arrival time in 32bits TSF, 0 = write it in MAC time stamp.*/


/* Defines for Rx "FilterOptions".*/
/* The rx filter enables control what type of receive frames will be rejected or received by the rx hardware*/
/* 1 = frame is written to memory,*/
/* 0 = not written to memory, rejected.*/
#define CFG_RX_RSV_EN       BIT_0  /* reserved types and subtypes.*/
#define CFG_RX_RCTS_ACK     BIT_1  /* rts, cts, ack frames.*/
#define CFG_RX_PRSP_EN      BIT_2  /* probe response.*/
#define CFG_RX_PREQ_EN      BIT_3  /* probe request.*/
#define CFG_RX_MGMT_EN      BIT_4  /* type = management.*/
#define CFG_RX_FCS_ERROR    BIT_5  /* frames with FCS errors.*/
#define CFG_RX_DATA_EN      BIT_6  /* type = data.*/
#define CFG_RX_CTL_EN       BIT_7  /* type = control.*/
#define CFG_RX_CF_EN        BIT_8  /* contention free frames.*/
#define CFG_RX_BCN_EN       BIT_9  /* beacons.*/
#define CFG_RX_AUTH_EN      BIT_10 /* authentication, deauthentication.*/
#define CFG_RX_ASSOC_EN     BIT_11 /* association related frames (all 5 subtypes  assoc req/resp,*/


typedef struct
{
    uint32          ConfigOptions;
    uint32          FilterOptions;
} ACXRxConfigStruct;


/* ScanOptions bit mask field.*/
#define SCAN_ACTIVE         0
#define SCAN_PASSIVE        1   /* 1 = passive scan, 0 = active scan*/
/* #define SCAN_5GHZ_BAND      2  */  /* 1 = scan channel list in 5 Ghz band, 0 = scan channel list in 2.4 Ghz band*/ 
#define TRIGGERED_SCAN      2   /* 1 = Triggered scan, 0 = Normal scan*/
#define SCAN_PRIORITY_HIGH  4   /* 1 = High priority scan, 0 = Low priority scan*/
 
typedef uint8 TidTrigger_t;

/* General scan parameters.*/
typedef struct
{
    ACXRxConfigStruct  rxCfg;         /* Rx filter to be used for each channel scan. */
                                      /* The BSSID filter enable will be set (by the */
                                      /* scan process) to ON for a specific channel if*/
                                      /* the BSSID of this channel is a unicast address.*/
                                      /* Otherwise it will be set to OFF (Refer to */
                                      /* ACXRxConfig IE in public_infoele.h).*/

    uint16             scanOptions;   /* This bitwise field indicates the scan options. */
                                      /* Bits [4:15] are reserved. */
                                      /* Bits [0:3] are defined as follows: */
                                      /* Scan Type (bit 0) - When this bit is set, the */
                                      /*  WiLink performs a passive scan. When this bit*/
                                      /*  is cleared, the WiLink performs an active scan. */
                                      /* Band Select (bit 1) - When this bit is set, the*/
                                      /*  WiLink scans the specified channels in the */
                                      /*  5GHz band. When this bit is cleared, the */
                                      /*  WiLink scans the specified channels in the */
                                      /*  2.4GHz band. */
                                      /* Voice mode (bit 2) - When this bit is set, */
                                      /*  the request is for a voice scan. When this bit*/
                                      /*  is cleared, the request is for a normal scan. */
                                      /* Scan priority (bit 3) - When this bit is set, */
                                      /*  the request is for a high priority scan. When*/
                                      /*  this bit is cleared, the request is for a low*/
                                      /*  priority scan.*/
        
    uint8              numChannels;   /* Number of scan channels in the list (minimum is*/
                                      /* 1, maximum is 30).*/

    uint8              numOfProbRqst; /* This field indicates the number of probe */
                                      /* requests to send per channel, in active scan. */
    
    EHwRateBitFiled    txdRateSet;    /* This EHwRateBitFiled format field specifies the rate and */
                                      /* modulation to transmit the probe request during*/
	                                  /* an active scan. It is not used for passive scans.*/
   
    TidTrigger_t       tidTrigger;    /* used for TidTriggered scan only.*/

    uint8              ssidLength;    /* This field specifies the size of the SSID, */
                                      /* which can be up to 32 bytes long. If this field*/
                                      /* equals to zero, SSID filter is not applied. */
    
    uint8              padding1[2];    /* in order to align */ 


    uint32             ssidStr[8];    /* This field specifies the SSID packets from that*/
                                      /* are relevant for the Scan result. The WiLink*/
                                      /* uses this information to filter beacon, probe*/
                                      /* response frames (if the SSID length field of */
                                      /* this command structure is not zero) */

    RadioBand_e         band;         /* Band to scan */

    uint8               useSsidList;  /* Whether to use SSID list (configured seperately)
                                         when transmitting probe-requests */

    uint8               scanTag;      /* Scan results tag */

    uint8               padding2;     /* in order to align */ 

} BasicScanParameters_t;



#define SCAN_ET_COND_MASK  0x30
#define SCAN_ET_COUNT_MASK 0x0F

#define SCAN_MAX_NUM_OF_CHANNELS 24

/* Early Termination condition (bits 4-5) - This field can have one of the following */
/* values (note that bits 0-3 indicates Early Termination count): */
typedef enum 
{
    ET_COND_DISABLE = 0x00,          /* Disable - No early termination condition.*/

    ET_COND_BEACON  = 0x10,          /* Beacon only. When this value is selected, the */
                                     /* Early Termination count field specifies the */
                                     /* maximum number of beacons to collect before */
                                     /* ending a scan. */

    ET_COND_PROBE_RESP = 0x20,       /* Probe responses only. When this value is */
                                     /* selected, the Early Termination count field */
                                     /* specifies the maximum number of probe responses*/
                                     /* to collect before ending a scan. */

    ET_COND_BEACON_PROBE_RESP = 0x30,/* Beacon/probe response. When this value is */
                                     /* selected, the Early Termination count field */
                                     /* specifies the maximum number of beacons or probe*/
                                     /* responses to collect before ending a scan. */
                                     
    ET_COND_INVALID = 0xFF
} ETCondition_enum;

#ifdef HOST_COMPILE
typedef uint8 ETCondition_e;
#else
typedef ETCondition_enum ETCondition_e;
#endif


typedef uint8 ETCondCount_t;



#define PROCESS_SCAN_IS_HIGH(pScanParameters) ((pScanParameters)->basicScanParameters.scanOptions & SCAN_PRIORITY_HIGH)
#define PROCESS_SCAN_IS_LOW(pScanParameters) ((PROCESS_SCAN_IS_HIGH(pScanParameters)) == 0)


/* Per-Channel scan parameters.*/
typedef struct
{

    uint32        scanMinDuration;    /* For active scans, this field specifies the */
                                      /* minimum amount of time, in time units (TUs), */
                                      /* to wait for a frame on a channel. This */
                                      /* parameter is not used for passive scans. The*/
                                      /*  value can range from 0 to 65535 TUs */
                                      /* (67.1 seconds). */

    uint32        scanMaxDuration;    /* For active scans, this field specifies the */
                                      /* maximum amount of time, in time units (TUs), */
                                      /* to wait for a probe response on a channel.*/
                                      /* For passive scans, this field specifies the */
                                      /* amount of time, in time units (TUs), to listen*/
                                      /* on a channel. The value can range from 0 to */
                                      /* 65535 TUs (67.1 seconds). */
    

    uint32        bssIdL;             /* 32 LSBits of BSSID of the AP to scan for. */
                                      /* If scanning on this channel any BSSID, this */
                                      /* field shall be set to broadcast BSSID. */

    uint16        bssIdH;             /* 16 MSBits of BSSID of the AP to scan for.*/

    ETCondCount_t ETCondCount;        /* bit 0-3: Early Termination count - This field */
                                      /*          defines the maximum number of beacons*/
                                      /*          or probe responses or both (according*/
                                      /*          to condition) to collect before ending*/
                                      /*          a scan.*/
    
                                      /* Bit 4-5: Early Termination Condition (refer */
                                      /*          to ETCondition_enum).*/
                
    uint8         txPowerAttenuation; /* TX power level to be used per channel scanned. */
                                      /* If 0, leave normal TX power level for this */
                                      /* channel. Range: 0 - 20 [dB].*/
    
    Channel_e     channel;            /* Channel number to scan, valid range 0-255 */
                                      /* (1-14 for 802.11b). */

    Bool_e        dfsCandidate;       /* FW internal use only! */
    Bool_e        activityDetected;   /* FW internal use only! */

    uint8         padding[1];             /* for alignment to 32 bits boundry*/
} BasicScanChannelParameters_t;

/* The Scan command structure.*/
typedef struct
{
    BasicScanParameters_t basicScanParameters; /* refer to BasicScanParameters_t */
                                               /* definition*/

    BasicScanChannelParameters_t basicScanChannelParameters[SCAN_MAX_NUM_OF_CHANNELS];
} ScanParameters_t;

/*****************************************************************************

    ID:       CMD_TRIGGER_SCAN_TO
    Desc:     This Command will configure the enhanced Trigger Scan Timeout 
                information.
              To use legacy Trigger Scan, configure the parameter to 0
    Params:   None
    
******************************************************************************/
typedef struct 
{
    uint32  slicedScanTimeOut;          /* 0 - Split Scan Disable
                                           any other value will represent the timeout 
                                           for each channel "mini scan" in uSec */
}enhancedTriggerTO_t;



/*****************************************************************************

    ID:       CMD_STOP_SCAN
    Desc:     This command instructs the WiLink to terminate any scan in progress. 
              After processing this command, the WiLink returns to its previous state
              (the state before the scan was started) and generates the SCAN_COMPLETE
              information message. 
    Params:   None
    
******************************************************************************/



/******************************************************************************

    ID:       CMD_START_JOIN
    Desc:     This command instructs the WiLink to either join a BSS or IBSS, or 
              start an IBSS. When the device has joined the BSS or IBSS the Join 
              Complete event is raised to the host.  
    Params:   StartJoinRequest_t - see below.

******************************************************************************/

/* 
 * Join command  control bit mask field:
 */



/* Cyclic counter in range 1-7, advanced on every Join command to enable the FW distinguish 
     between connection sessions and drop obsolete Tx packets. */
#define JOIN_CMD_CTRL_TX_SESSION       (BIT_3 | BIT_2 | BIT_1)

/* When this bit is set,the firmware will flush all Tx frames in the pipe and will not transmit them. */
#define JOIN_CMD_CTRL_TX_FLUSH         BIT_7 

/* Offsets of the above fields */
#define JOIN_CMD_CTRL_OFFSET_TX_SESSION             1
#define JOIN_CMD_CTRL_OFFSET_TX_FLUSH                      7 


typedef enum
{
    BSS_TYPE_IBSS = 0,
    BSS_TYPE_STA_BSS = 2,
    BSS_TYPE_AP_BSS = 3,
    MAX_BSS_TYPE = 0xFF
} BssType_enum;

#ifdef HOST_COMPILE
typedef uint8 BSS_e;
#else
typedef BssType_enum BSS_e;
#endif

#define MAX_SSID_STR_LEN_BYTESX4 8

typedef struct
{
    uint32            bssIdL;        /* This field indicates the 32 LSBits of the MAC*/
                                     /* address of the BSS to join. */
                                     /* Note: To correctly generate beacon frames, the */
                                     /* byte order of the BSS ID field must be */
                                     /* reversed. for example, if the MAC address of */
                                     /* the AP is 00 7E 99 11 22 33, program the BSS */
                                     /* ID field as 33 22 11 99 7E 00.*/
        
    uint16            bssIdH;        /* This field indicates the 16 MSBits of the MAC*/
                                     /* address of the BSS to join. */

    uint16            beaconInterval;/* This field specifies the time between target */
                                     /* beacon transmission times (TBTTs), in time */
                                     /* units (TUs). Valid values are 1 to 1024.*/
    
    ACXRxConfigStruct rxFilter;      /* This filed is the Rx filter configuration for*/
                                     /* the device while connected to the BSS or IBSS.*/
                                     /* This setting is overridden in case of a */
                                     /* measurement or a scan activity and is reset */
                                     /* after these activities end.*/

    EHwRateBitFiled   basicRateSet;  /* For 802.11b, this field specifies the control*/
                                     /* response frame rate for the BSS or IBSS (that*/
                                     /* is, the BSSBasicRateSet parameter in the */
                                     /* 802.11 Specification). The WiLink uses this */
                                     /* field to determine the rate at which to */
                                     /* transmit control frame responses (such as ACK */
	                                 /* or CTS frames). */
    
    uint8             dtimInterval;  /* This field specifies the number of beacon */
                                     /* intervals between DTIM beacon frames. The host*/
                                     /* is only required to set this field when the */
                                     /* BSS Type is infrastructure BSS (STA) or AP. */
                                     /* For an independent BSS, the host should set */
                                     /* this field to 1.*/
    
    BSS_e             bssType;       /* bits 0-2: This bitwise field specifies the type */
                                     /*  of BSS to start or join (Refer to BssType_enum). */
                                     /* bit 4: Band - The radio band in which to join*/
                                     /*  or start.*/
                                     /*  0 - 2.4GHz band    */
                                     /*  1 - 5GHz band*/
                                     /* bits 3, 5-7: Reserved*/

    Channel_e         channelNumber; /* This field specifies the channel number of the*/
                                     /* BSS to join or start. Valid values are 1 to 14. */
                                     /* If the specified channel is not allowed in the*/
                                     /* regulatory domain, the command is rejected and*/
                                     /* the status code 0x0005 is returned in the */
                                     /* Command Status field.*/
    
    uint8             ssidLength;    /* This field specifies the size of the SSID, which*/
                                     /* can be up to 32 bytes long.*/
    
    uint32              ssidStr[MAX_SSID_STR_LEN_BYTESX4];
                                     /* This field specifies the SSID of the BSS to */
                                     /* start or join. The WiLink uses this information*/
                                     /* to filter beacon, probe response and probe */
                                     /* request frames (if configured to do so in bit 10*/
                                     /* in the Receive Configuration field of the */
                                     /* ACXRxConfig information element). */
                                     /* It also uses this information to determine if a*/
                                     /* probe response should be transmitted in */
                                     /* response to a received probe request.*/
    
    uint8             ctrl;          /* Join command control field (refer to */
                                     /* the JOIN_CMD_CTRL... specified above).*/

    uint8             reserved[3];
} StartJoinRequest_t;


/******************************************************************************

    ID:       CMD_SET_KEYS
    Desc:     The host issues this command to manage the WEP key cache in the WiLink. 
              The host can issue this command during the configuration or operation 
              phase.  
    Params:   SetKey_t - see below.

******************************************************************************/

#define NUM_ACCESS_CATEGORIES_COPY 4 

#define MAX_KEY_SIZE 32

typedef enum
{
    KEY_ADD_OR_REPLACE = 1,             /* Add or replace a key in the WEP cache*/
    KEY_REMOVE         = 2,             /* Remove a key from the WEP cache*/
    KEY_SET_ID         = 3,             /* Set Key ID*/
    MAX_KEY_ACTION     = MAX_POSITIVE16 /* force this enum to be uint16*/
} KeyAction_enum;

#ifdef HOST_COMPILE
typedef uint16 KeyAction_e;
#else
typedef KeyAction_enum KeyAction_e;
#endif


/*
Key Size+Key Data table (valid value)
KeyType_enum  Key Type                    Valid Key Size    Key Data Field Format
============  ========                    ==============    =====================
0x00          WEP default key             5, 13, 29         Key Size bytes of key data

0x01          WEP key mapping key         5, 13, 29         Key Size bytes of key data

0x04          AES Group Key               16                16 bytes of key data

0x05          AES Pairwise Key            16                16 bytes of key data

0x0A          TKIP and MIC Group Key      32                16 bytes of TKIP key data
                                                        8 bytes of Rx MIC key data
                                                        8 bytes of Tx MIC key data

0x0B          TKIP and MIC Pairwise Key   32                16 bytes of TKIP key data
                                                        8 bytes of Rx MIC key data
                                                        8 bytes of Tx MIC key data

0x0C          GEM and MIC Group Key      32                 16 bytes of GEM key data
                                                            16 bytes of MIC key data

0x0D          GEM and MIC Pairwise Key   32                 16 bytes of GEM key data
                                                            16 bytes of MIC key data
                                                            
*/


typedef enum
{
  CIPHER_SUITE_NONE = 0,
  CIPHER_SUITE_WEP  = 1,
  CIPHER_SUITE_TKIP = 2,
  CIPHER_SUITE_AES  = 3,
  CIPHER_SUITE_GEM  = 4,
  MAX_KEY_TYPE
} CipherSuite_enum;

#ifdef HOST_COMPILE
typedef uint8 CipherSuite_e;
#else
typedef CipherSuite_enum CipherSuite_e;
#endif

typedef enum
{
    NO_KEY            =  0,
    KEY_SIZE_WEP_64   =  5,
    KEY_SIZE_WEP_128  = 13,
    KEY_SIZE_WEP_256  = 29,
    KEY_SIZE_TKIP     = MAX_KEY_SIZE
} KeySize_enum;                      /* WEP keysizes reflect 3 bytes appended from IV.*/

#ifdef HOST_COMPILE
typedef uint8 KeySize_e;
#else
typedef KeySize_enum KeySize_e;
#endif


typedef struct
{
    uint8 addr[MAC_ADDR_SIZE]; /* This field specifies the MAC address of the station to*/
                               /* add or remove from the WEP key cache. This field is */
                               /* ignored if a WEP default key is being added or removed.*/
    
    KeyAction_e action;        /* This field specifies the action to be performed.*/
                               /* Refer to KeyAction_enum.*/

    uint16      reserved;
    KeySize_e   keySize;       /* This field indicates the size of the key in bytes */
                               /* being added. Valid values are listed in the Valid Key */
                               /* Size column in the above "Key Size+Key Data table". */

    CipherSuite_e   type;          /* This field indicates the type of key being added.*/
                               /* Valid values are listed in the Value column in the*/
                               /* KeyType_enum.*/

    uint8       ssidProfile;   /* This field indicates the SSID profile for which the */
                               /* key is set.*/
    uint8       id;            /* Key ID - For TKIP and AES key types, this field */
                               /* indicates the value that should be inserted into the*/
                               /* KeyID field of frames transmitted using this key */
                               /* entry. For WEP default key types, this field indicates*/
                               /* the ID of the key to add or remove. */
                               /* For WEP key mapping key types, this field is ignored.*/
                               /* Valid values for this field are 0 to 3.*/
    
    uint8       reserved2[6];  
    uint8       key[MAX_KEY_SIZE];
                               /* This field holds the security key data to add to the*/
                               /* STA table. The format of this field varies depending*/
                               /* on the type field. The format of this field for each*/
                               /* key type is described in the Key Data Field Format */
                               /* column in the "Key Size+Key Data table", above.*/

    uint16      AcSeqNum16[NUM_ACCESS_CATEGORIES_COPY]; 
                               /* This field indicates the lower part of the PN\IV */
                               /* sequence number that is used, for the four Access*/
                               /* Categories.*/

    uint32      AcSeqNum32[NUM_ACCESS_CATEGORIES_COPY]; 
                               /* This field indicates the higher part of the PN\IV */
                               /* sequence number that is used, for four Access */
                               /* Categories.*/
    
} SetKey_t;


/******************************************************************************

    ID:       CMD_READ_MEMORY
    Desc:     The host issues this command to read the WiLink device 
              memory/registers. 
    Params:   ReadWriteCommand_t - see below.
    Note:     The Base Band address has special handling (16 bits registers and
              addresses). For more information, see the hardware specification.

******************************************************************************/
/******************************************************************************

    ID:       CMD_WRITE_MEMORY
    Desc:     The host issues this command to write the WiLink device memory/registers. 
    Params:   ReadWriteCommand_t - see below.
    Note:     The Base Band address has special handling (16 bits registers and
              addresses). For more information, see the hardware specification.

******************************************************************************/

#define MAX_READ_SIZE 256

typedef struct
{
    uint32 addr;                 /* The address of the memory to read from or write to.*/
    uint32 size;                 /* The amount of data in bytes to read from or write */
                                 /* to the WiLink device.*/
    uint8  value[MAX_READ_SIZE]; /* The actual value read from or written to the Wilink.*/
                                 /* The source of this field is the Host in WRITE */
                                 /* command or the Wilink in READ command.*/
} ReadWriteCommand_t;


/******************************************************************************

    ID:       CMD_BEACON
    Desc:     This command specifies the contents of the beacon template stored in 
              the WiLink. 
    Params:   PktTemplate_t - see below.

******************************************************************************/

/******************************************************************************

    ID:       CMD_PROBE_RESP
    Desc:     This command specifies the contents of the probe response template
              stored in the WiLink.  
    Params:   PktTemplate_t - see below.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_NULL_DATA
    Desc:     This command specifies the contents of the Null data template
              stored in the WiLink. 
    Params:   PktTemplate_t - see below.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_PROBE_REQ
    Desc:     This command specifies the contents of the probe request template
              stored in the WiLink.  
    Params:   PktTemplate_t - see below.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_PS_POLL
    Desc:     This command specifies the contents of the PS-poll template
              stored in the WiLink.  
    Params:   PktTemplate_t - see below.
    
******************************************************************************/


/******************************************************************************

    ID:       CMD_QOS_NULL_DATA
    Desc:     This command specifies the contents of the QOS-Null template
              stored in the WiLink.  
    Params:   PktTemplate_t - see below.
    
******************************************************************************/
/* Template command data structure.*/
typedef enum
{
    TEMPLATE_NULL_DATA = 0,
    TEMPLATE_BEACON,        
    CFG_TEMPLATE_PROBE_REQ_2_4,
    CFG_TEMPLATE_PROBE_REQ_5,
    TEMPLATE_PROBE_RESPONSE,
    TEMPLATE_QOS_NULL_DATA,
    TEMPLATE_PS_POLL,
    TEMPLATE_KLV,
	TEMPLATE_DISCONNECT, 
    TEMPLATE_PROBE_REQ_2_4, /*for firmware internal use only*/
    TEMPLATE_PROBE_REQ_5, /*for firmware internal use only*/
	TEMPLATE_BAR, /*for firmware internal use only*/
    TEMPLATE_CTS, /* For CTS-to-self (FastCTS) mechanism for BT/WLAN coexistence (SoftGemini). */

    MAX_NUM_OF_TEMPLATES = 0xff
} TemplateType_enum;

#ifdef HOST_COMPILE
typedef uint8 TemplateType_e;
#else
typedef TemplateType_enum TemplateType_e;
#endif

#define MAX_TEMPLATES_SIZE 252  /* according to max size of FW memblock */
#define RATE_MASK_UNSPECIFIED   0    /* Let the FW select the rates mask internally */

/* 
aflag definition:
bit field       description
=========       ===========
0               Truncate - If set, then attempts to send a frame stop when the total 
                valid per-rate attempts have been exhausted; 
                otherwise transmissions will continue at the lowest available rate 
                until the appropriate one of the Short Retry Limit, Long Retry Limit, 
                dot11MaxTransmitMsduLifetime, or MAX TX Life Time (in ACXTIDConfig), 
                if supported and supplied, is exhausted.
1               Preamble Override - Indicates if the preamble type should be used in TX. 
2               Preamble Type - The type of the preamble to be used by the policy. 
                0 - long preamble, 
                1 - short preamble. 
3-7             Reserved
*/

/* definition of single rate policy*/
typedef struct 
{

    uint32              enabledRates;  				  /* A Bit Mask which indicates which Rates are enabled */
                                                      /* The rates bitmap is defined in EHwBitRate. */
                                                      /* If set to RATE_MASK_UNSPECIFIED, the FW sets it internally */

    uint8               shortRetryLimit;              /* The dot11ShortRetryLimit used */
                                                      /* for Tx retries.*/

    uint8               longRetryLimit;               /* The dot11LongRetryLimit used */
                                                      /* for Tx retries.  */
    
    uint8               aflags;                       /* Flags controlling attributes */
                                                      /* of the transmission. */
                                                      /* see above description for the */
                                                      /* structure of this field.*/

    uint8               reserved;
}txAttrClass_t;
     
/* Template command data structure.*/
typedef struct 
{
    uint16 len;
    TemplateType_e templateType;
    uint8 index;    /* relevant only for KLV_TEMPLATE type */
    txAttrClass_t templateTxAttribute;
    uint8  templateStart[MAX_TEMPLATES_SIZE]; 
} PktTemplate_t;


/******************************************************************************

    ID:       CMD_NOISE_HIST
    Desc:     This command starts/stops the noise histogram measurements.
    Params:   NoiseHistRequest_t - see below.

******************************************************************************/
#define NOISE_HIST_LEN 8

typedef enum 
{
    NOISE_HIST_STOP,
    NOISE_HIST_START,
    NOISE_HIST_INVALID = MAX_POSITIVE16 /* Force to be 16 bits enum*/
} NoiseHistMode_enum;

#ifdef HOST_COMPILE
typedef uint16 NoiseHistMode_e;
#else
typedef NoiseHistMode_enum NoiseHistMode_e;
#endif

typedef struct
{
    NoiseHistMode_e mode;             /* Start or stop the FW engine. */
                                      /* Possible values are 1 (Start) and 0 (Stop).*/

    uint16 sampleIntervalUSec;        /* The time interval in usec between measurements.*/
                                      /* Valid values are between 100us (default) and */
                                      /* 2ms (with 100us jumps). This parameter is */
                                      /* relevant only when Mode is Start (1).*/
        
    uint8  thresholds[NOISE_HIST_LEN];/* An array of eight 8 bit thresholds. The FW */
                                      /* takes noise measurements, once every */
                                      /* SampleIntervalUSec interval. If the measured */
                                      /* noise level is between the threshold[X] and */
                                      /* threshold[X 1], then the FW increments the */
                                      /* noise histogram counter[X]. */
                                      /* The counters are read via the */
                                      /* ACXNoiseHistogramResults IE. This parameter is */
                                      /* relevant only when Mode is Start (1).*/
} NoiseHistRequest_t;


/******************************************************************************

    ID:       CMD_LNA_CONTROL
    Desc:     This command controls the LNA state. 
    Params:   LNAControl_t - see below.

******************************************************************************/

typedef enum
{
    LNA_MODE_MANUAL,    /* 0: The LNA is set to manual mode and is turned off.*/
    LNA_MODE_AUTO,      /* 1: The LNA is set to automatic mode.*/
    LNA_MODE_INVALID = 0xFF
} LnaMode_enum;

#ifdef HOST_COMPILE
typedef uint8 LnaMode_e;
#else
typedef LnaMode_enum LnaMode_e;
#endif

typedef struct
{
    LnaMode_e LNAControlField; /* refer to LnaMode_enum*/
    uint8     padding[3];      /* for alignment to 32 bits boundry*/
} LNAControl_t;


/******************************************************************************

    ID:       CMD_MEASUREMENT
    Desc:     This command instructs the WiLink device to begin a basic channel 
              load measurement on the specified channel. When the measurement 
              process actually starts running the WilLink device will raise the 
              Measurement Started event. When the measurement process completes as
              a result of the end of the measurement duration or a STOP_MEASUREMENT
              command, the WilLink device will raise a Measurement Complete event. 
    Params:   MeasurementParameters_t - see below.

******************************************************************************/
typedef struct 
{
    ACXRxConfigStruct rxFilter; /* This field is the Rx filter configuration for the */
                                /* device while the measurement process is running. */
                                /* When the process ends the previous Rx filter */
                                /* configuration is reset. The filter configuration is*/
                                /* composed of two 32 bit registers. When they are set*/
                                /* to 0xFFFFFFFF the Rx filter configuration is not*/
                                /* changed.*/
    
    uint32 duration;            /* Specifies the measurement process duration in */
                                /* microseconds. The value of 0 means infinite duration*/
                                /* in which only a STOP_MEASUREMENT command can*/
                                /* stop the measurement process.*/
    
    Channel_e channel;          /* Channel number on which the measurement is performed,*/
                                /* valid range 0-255 (1-14 for 802.11b).*/
    
    RadioBand_e band;           /* Specifies the band to which the channel belongs. */
                                /* 0 - 2.4GHz */
                                /* 1 - 5GHz , */
                                /* 0xFF - Current band.*/

    uint8 scanTag;              /* results tag */

    uint8 padding[1];           /* for alignment to 32 bits boundry*/
} MeasurementParameters_t;

/******************************************************************************

    ID:       CMD_STOP_MEASUREMENT
    Desc:     This command instructs the WiLink to terminate any measurement in 
              progress. After processing this command, the WiLink returns to its 
              previous state (the state before the measurement was started) and 
              generates the Measurment Complete event. 
    Params:   None.

******************************************************************************/

/******************************************************************************

    ID:       CMD_DISCONNECT
    Desc:     This command instructs the WiLink device to stop all BSS or IBSS activity.
              The device will cancel all of its TSF dependent events and activities. 
              Power Save dependent activities are an exception to this, therefore 
              the host must exit Power Save mode by issuing the SET_PS_MODE command 
              before calling this command. When this command is complete the Disconnect
              Complete event is raised to the host and the WiLink device is allowed 
              to enter the configured low power state. 
    Params:   DisconnectParameters_t - see below.
    
******************************************************************************/

typedef enum
{
    DISCONNECT_IMMEDIATE,    /* Disconnect without sending any frame */
    DISCONNECT_DE_AUTH,      /* Send deauthentication frame upon disconnecting */
    DISCONNECT_DIS_ASSOC     /* Send disassociation frame upon disconnecting */
} DisconnectType_enum;

#ifdef HOST_COMPILE
typedef uint8 DisconnectType_e;
#else
typedef DisconnectType_enum DisconnectType_e;
#endif



typedef struct
{
    ACXRxConfigStruct rxFilter;
    uint16 disconnectReason;
    DisconnectType_e   disconnectType; 
    uint8 padding[1];  /* for alignment to 32 bits boundry */
} DisconnectParameters_t;




/******************************************************************************

    ID:       CMD_SET_PS_MODE
    Desc:     This command turns ON/OFF Power save protocol on the WiLink. 
              After HW configuration, FW sends Null data packet to the AP with Power 
              Management bit set accordingly to the field "Mode" of this command 
              structure. After processing this command, the FW generates the 
              PS_COMPLETE event.
    Params:   PSModeParameters_t - see below.

******************************************************************************/

typedef enum
{
    STATION_ACTIVE_MODE,
    STATION_POWER_SAVE_MODE
} StationPSMode_enum;

#ifdef HOST_COMPILE
typedef uint8 StationPowerSaveMode_e;
#else
typedef StationPSMode_enum StationPowerSaveMode_e;
#endif


typedef struct
{
    StationPowerSaveMode_e mode;         /* This field specifies the future Power save*/
                                         /* protocol mode of the system. */
                                         /* When set, Power save protocol is enabled. */
                                         /* When cleared, Power save protocol is */
                                         /* disabled (refer to StationPSMode_enum).*/
    
    uint8                  needToSendNullData;
    uint8 numberOfRetries;               /* This field specifies the maximum allowed */
                                         /* number of retries of the Null data packet */
                                         /* that FW will send after switching the */
                                         /* Power Save Protocol mode.*/

    uint8 hangOverPeriod;                /* This field specifies the hangover period, */
                                         /* which is the time in TUs during which the */
                                         /* WiLink remains awake after sending an MPDU */
                                         /* with the Power Save bit set, indicating that*/
                                         /* the station is to go into Power Save mode. */
                                         /* Setting bit 0 does not affect the hangover */
                                         /* period.*/
    
    EHwRateBitFiled rateToTransmitNullData; /* This EHwBitRate format field specifies the rate and */
                                         /* modulation to transmit the Null data packet*/
	                                     /* to the AP. */
    
} PSModeParameters_t;

/******************************************************************************

    ID:       CMD_CHANNEL_SWITCH
    Desc:     This command instructs the WiLink to switch serving channel at the given
              time. Once the channel switch is performed, the Channel Switch Complete
              event is raised to the host.  
    Params:   ChannelSwitchParameters_t - see below.

******************************************************************************/
typedef struct
{
    Channel_e channel;  /* The new serving channel.*/
    uint8 switchTime;   /* Relative time of the serving channel switch in TBTT units.*/
    Bool_e txSuspend;   /* 1: Suspend TX till switch time; */
                        /* 0: Do not suspend TX*/
    Bool_e flush;       /* 1: Flush TX at switch time; */
                        /* 0: Do not flush*/
    
} ChannelSwitchParameters_t;

/******************************************************************************

    ID:       CMD_STOP_CHANNEL_SWICTH
    Desc:     This command instructs the WiLink device to cancel performing a 
              pending channel switch event command. 
    Params:   None.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_AP_DISCOVERY
    Desc:     This command instructs the WiLink device to perform an AP discovery 
              measurement on a single channel. This command can only be issued after 
              a measurement process has been started by the WiLink device as a result
              of a previous Measurement command. The Measurement command specifies the 
              channel on which the AP discovery is performed. Once the "AP discovery" 
              measurement is completed either by a STOP_AP_DISCOVERY command or when 
              the duration has expired, it will send an "AP discovery complete event" 
              to the host.  
    Params:   ApDiscoveryParameters_t - see below.

******************************************************************************/


typedef struct
{
    ACXRxConfigStruct rxFilter; /* This field is the Rx filter configuration for the */
                                /* device while the AP Discovery process is running. */
                                /* When the process ends the previous Rx filter */
                                /* configuration is reset. The filter configuration is*/
                                /* composed of two 32 bit registers. When they are set */
                                /* to 0xFFFFFFFF the Rx filter configuration is not */
                                /* changed.*/
    
    uint32 scanDuration;        /* This field specifies the amount of time, in time*/
                                /* units (TUs), to perform the AP discovery. The value*/
                                /* can range from 0 to 65535 TUs (67.1 seconds). */
    
    uint16 scanOptions;         /* This field specifies whether the AP discovery is */
                                /* performed by an active scan or a passive scan. */
                                /* 0 - ACTIVE, 1 - PASSIVE.*/
    
    uint8  numOfProbRqst;       /* This field indicates the number of probe requests to*/
                                /* send per channel, when active scan is specified. */
                                /* Note: for XCC measurement this value should be set */
                                /*       to 1.*/
    
    uint8 txPowerAttenuation;   /* TX power level to be used for sending probe requests*/
                                /* when active scan is specified. */
                                /* If 0, leave normal TX power level for this channel. */

    EHwRateBitFiled txdRateSet; /* This EHwBitRate format field specifies the rate and modulation*/
                                /* to transmit the probe request when an active scan is*/
	                            /* specified. */

} ApDiscoveryParameters_t;

/******************************************************************************

    ID:       CMD_STOP_AP_DISCOVERY
    Desc:     This command instructs the WiLink to terminate the AP Discovery 
              measurement in progress. After processing this command, the WiLink 
              returns to its previous state  and generates the AP Discovery Complete
              Event. 
    Params:   None.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_SPS_SCAN
    Desc:     This command instructs the WiLink to perform a scheduled passive 
              scan for BSS/IBSSs. The WiLink monitors the specified channel(s) 
              for beacons. The WiLink sends Scheduled Scan Complete event to notify
              the host when it has completed a scan. 
    Params:   InfoElement_t - see below.

******************************************************************************/
/* Scheduled - General scan parameters.*/
typedef struct
{
    ACXRxConfigStruct rxCfg;         /* Rx filter to be used for each channel scan. */
                                     /* The BSSID filter enable will be set (by the scan*/
                                     /* process) to ON for a specific channel if the*/
                                     /* BSSID of this channel is a unicast address. */
                                     /* Otherwise it will be set to OFF (Refer to */
                                     /* ACXRxConfigStruct).*/
    
    uint32            scanCmdTime_h; /* This filed is the latest 32 MSBits of TSF known*/
                                     /* at the time the SPS command was issued. When the*/
                                     /* scan process is about to begin, this value is */
                                     /* used to determine if the AP has performed a */
                                     /* recovery by comparing this value to the current*/
                                     /* TSF. (An AP that has performed a recovery should*/
                                     /* have a lower TSF then the one that was saved).*/
    
    uint32            scanCmdTime_l; /* This filed is the latest 32 LSBits of TSF known*/
                                     /* at the time the SPS command was issued. */

    uint16            scanOptions;   /* This bitwise field indicates the scan options. */
                                     /* 0 - ACTIVE, 1 - PASSIVE.*/
    
    uint8             numChannels;   /* Number of scan channels in the list (minimum */
                                     /* (minimumis 1, maximum is 30).*/
    
    RadioBand_e       band;          /* Band to scan */
    uint8             scanTag;       /* results tag */
} ScheduledGeneralParameters_t;


/* Scheduled - Per-Channel scan parameters.*/
typedef struct
{
    uint32 scanStartTime;      /* Duration in microseconds of the scan on this channel */
                               /* (Scan could be aborted before this duration in case of*/
                               /* early termination condition met on the channel). */
    
    uint32 scanMaxDuration;    /* Lower 4 bytes of TSF time in microseconds when the */
                               /* scan should start listening on the desired channel. */

    uint32 bssIdL;             /* 32 LSBits of BSSID of the AP to scan for. If scanning */
                               /* on this  channel any BSSID, this field shall be set */
                               /* to broadcast BSSID. */
    
    uint16 bssIdH;             /* 16 MSBits of BSSID of the AP to scan for. */

    ETCondCount_t ETCondCount; /* bit 0-3: Early Termination count - This field */
                               /*          defines the maximum number of beacons*/
                               /*          or probe responses or both (according*/
                               /*          to condition) to collect before ending*/
                               /*          a scan.*/
    
                               /* Bit 4-5: Early Termination Condition (refer */
                               /*          to ETCondition_enum).*/
    Channel_e     channel;     /* Channel number to scan, valid range 0-255 */
                               /* (1-14 for 802.11b).*/
} ScheduledChannelParameters_t;


/* The Scheduled Scan command structure.*/
typedef struct
{
    ScheduledGeneralParameters_t scheduledGeneralParameters;
    ScheduledChannelParameters_t scheduledChannelParameters[SCAN_MAX_NUM_OF_CHANNELS];
} ScheduledScanParameters_t;

/******************************************************************************

    ID:       CMD_STOP_SPS_SCAN
    Desc:     This command instructs the WiLink to terminate a currently running 
              SPS or a pending SPS.. After processing this command, the WiLink 
              returns to its previous state and generates the Scheduled Scan 
              Complete Event. 
    Params:   None.

******************************************************************************/

/******************************************************************************

    ID:       CMD_HEALTH_CHECK
    Desc:     This command instructs the WiLink to raise a MAC status event 
              which contains the current FCS Error counter. 
    Params:   None.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_DEBUG
    Desc:      
    Params:   debugCommnad_t - see below.

******************************************************************************/
#define MAX_DEBUG_PARAMETERS 10

typedef struct
{
    uint32  id;
    uint32  params[MAX_DEBUG_PARAMETERS];
} debugCommnad_t;


/******************************************************************************

    ID:       CMD_CONNECTION_SCAN_CFG
    Desc:     This command configures the periodic connection scan feature 
    Params:   ConnectionScanParameters_t followed by active and passive channel
              lists (variable size structure)
    
******************************************************************************/

typedef enum
{
    BSS_INDEPENDENT                     = 0,
    BSS_INFRASTRUCTURE                  = 1,
    BSS_ANY                             = 2,
    BSS_MAX = 0xFF
} ScanBssType_enum;

#ifdef HOST_COMPILE
typedef uint8 ScanBssType_e;
#else
typedef ScanBssType_enum ScanBssType_e;
#endif

typedef enum
{
    SCAN_SSID_FILTER_TYPE_ANY = 0,
    SCAN_SSID_FILTER_TYPE_SPECIFIC = 1,
    SCAN_SSID_FILTER_TYPE_LIST = 2,
    SCAN_SSID_FILTER_TYPE_LIST_FILTER_DISABLED = 3,
    MAX_SCAN_SSID_FILTER_TYPE = 0xFF
} ScanSsidFilterType_enum;

#ifdef HOST_COMPILE
typedef uint8 ScanSsidFilterType_e;
#else
typedef ScanSsidFilterType_enum ScanSsidFilterType_e;
#endif

#define CONN_SCAN_MAX_CHANNELS_BG  14
#define CONN_SCAN_MAX_CHANNELS_J    4
#define CONN_SCAN_MAX_CHANNELS_A   23
#define CONN_SCAN_MAX_CHANNELS_ALL_BANDS        ((CONN_SCAN_MAX_CHANNELS_BG) + (CONN_SCAN_MAX_CHANNELS_A) + (CONN_SCAN_MAX_CHANNELS_J))
#define CONN_SCAN_MAX_NUM_OF_CYCLES_INTERVALS   (16)        /* Maximum number of configured inter-cycle intervals */

#define CONN_SCAN_MAX_BAND                      (3)         /* Maximum number of bands in scan configuration */

#define CONN_SCAN_DFS_CANDIDATE_CHANNEL     BIT_0
#define CONN_SCAN_DFS_ENABLED_CHANNEL       BIT_1

typedef struct
{
    uint16       scanMinDuration;     /* Min duration (in ms)*/
    uint16       scanMaxDuration;     /* Max duration (in ms)*/
    uint16       passiveScanDuration; /* Duration to use for passive scans (in ms)*/
    uint8        channel;             /* channel number (channel_e) */
    uint8        txPowerLevelDbm;    /* TX power level in dbm */
    uint8        channelFlags;        /* BIT 0: DFS channel */
                                      /* BIT 1: DFS enabled (to be included in active scan) */
    uint8        padding[3];
} ConnScanChannelInfo_t;

typedef struct
{
    uint32                  cycleIntervals[CONN_SCAN_MAX_NUM_OF_CYCLES_INTERVALS];      /* Intervals between each scan cycle */
    int8                    rssiThreshold;          /* RSSI threshold */
    int8                    snrThreshold;           /* SNR threshold */
    uint8                   maxNumOfCycles;         /* number of cycles to run */
    uint8                   reportThreshold;        /* Report after N results are received */
    uint8                   terminateOnReport;      /* Terminate after report */
    uint8                   resultsTag;             /* Tag for filtered scan results */
    ScanBssType_e           bssType;                /* BSS type to filter (0 - Infra, 1 - IBSS, 2 - Any) */
    ScanSsidFilterType_e    ssidFilterType;         /* SSID filter Type (0 - Any, 1 - specified in command, 2 - use SSID list, 3 - use SSID list no filter) */
    uint8                   ssidLength;             /* SSID Length (if ssidType is specified in command) */
    uint8                   ssid[32];               /* SSID (if ssidType is specified in command) */
    uint8                   numProbe;               /* Number of probe requests to transmit per (hidden) SSID per channel */

    uint8                   numOfPassive[CONN_SCAN_MAX_BAND];
    uint8                   numOfActive[CONN_SCAN_MAX_BAND];
    uint8                   numOfDfs;
    uint8                   padding[ 3 ];
    ConnScanChannelInfo_t   channelList[CONN_SCAN_MAX_CHANNELS_ALL_BANDS];
} ConnScanParameters_t;

/******************************************************************************

    ID:       CMD_CONNECTION_SCAN_SSID_CFG
    Desc:     This command configures the SSID filter list to be used in the
              periodic connection scan
    Params:   None.
    
******************************************************************************/

#define CONN_SCAN_MAX_NUMBER_OF_SSID_ENTRIES        (8)

typedef enum
{
    SCAN_SSID_TYPE_PUBLIC = 0,
    SCAN_SSID_TYPE_HIDDEN = 1,
    MAX_SCAN_SSID_TYPE = 0xFF
} ScanSsidType_enum;

#ifdef HOST_COMPILE
typedef uint8 ScanSsidType_e;
#else
typedef ScanSsidType_enum ScanSsidType_e;
#endif

typedef struct
{
    ScanSsidType_e      ssidType;
    uint8               ssidLength; 
    uint8               ssid[32];
} ConnScanSSID_t;


typedef struct
{
    uint8               numOfSSIDEntries;
    ConnScanSSID_t      SSIDList[CONN_SCAN_MAX_NUMBER_OF_SSID_ENTRIES];
} ConnScanSSIDList_t;


/******************************************************************************

    ID:       CMD_START_PERIODIC_SCAN
    Desc:     This command instructs the WiLink to start a periodic scan
              process (either connection-scan or discovery)
    Params:   None.
    
******************************************************************************/

typedef struct
{
    uint8   scanTag;
    uint8   uReserved[3];
} PeriodicScanTag;

/******************************************************************************

    ID:       CMD_STOP_PERIODIC_SCAN
    Desc:     This command instructs the WiLink to stop a periodic scan
              process (either connection-scan or discovery)
    Params:   None.
    
******************************************************************************/

/******************************************************************************

    ID:       CMD_SET_STATUS
    Desc:     This command instructs the station state
    Params:   None.
    
******************************************************************************/

#define STA_STATE_CONNECTED 1

typedef struct
{
    uint8   staState;
    uint8   pad[3];
} SetStaState_t; 

/* PLT public definitions*/
#define TEST_CONTINUOUS 0x04       /* transmit frames contimuously */


/*This typedef corresponds to the Fig 1 Frame Format for PER test given in PER test doc.*/
#define PER_MODE_TX 1
#define PER_MODE_RX 2
#define INFRA   0x2         /* BSS is in Infrastructure mode */
#define LOCAL_MEM_LAST      0x02000000
#define PBCC_MODULATION_MASK 0x80
#define OFDM_MODULATION_MASK 0x40
#define BAND_SELECT_5GHZ     0x10
#define CTL_PREAMBLE         0x01



#endif /* PUBLIC_COMMANDS_H*/
