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

/*---------------------------------------------------------------*/
/**/
/*  TI IPC header file*/
/**/
/*  Author :    Texas Instruments*/
/**/
/*  Filename: TI_IPC_Api.h*/
/**/
/*  Version  :1.0*/
/**/
/*  Last update date : 15/03/2004*/
/**/
/*---------------------------------------------------------------*/

#ifndef _TI_IPC_API_H
#define _TI_IPC_API_H

#include "tidef.h"


#define MAX_REGISTERED_MODULES 5
#define MAX_EVENT_DATA_SIZE 128
#define MAX_SEND_EVENTS 4

#ifdef  __cplusplus
extern "C" {
#endif

/*******************Defines*********************/

/* WARNING! DON'T CHANGE THE ORDER OF EVENTS! */
/* OS EVENTS MUST COME FIRST!*/

enum
{
    IPC_EVENT_ASSOCIATED = 0,
    IPC_EVENT_DISASSOCIATED,
    IPC_EVENT_LINK_SPEED,
    IPC_EVENT_AUTH_SUCC,
    IPC_EVENT_SCAN_REPORT,
    IPC_EVENT_SCAN_COMPLETE,
    IPC_EVENT_SCAN_STOPPED,
    IPC_EVENT_CCKM_START,
    IPC_EVENT_MEDIA_SPECIFIC,
    IPC_EVENT_MAX_OS_EVENT = IPC_EVENT_MEDIA_SPECIFIC,
    IPC_EVENT_EAPOL,
    IPC_EVENT_BOUND,
    IPC_EVENT_UNBOUND,
    IPC_EVENT_PREAUTH_EAPOL,
    IPC_EVENT_RESERVED2,
    IPC_EVENT_LOW_RSSI,
    IPC_EVENT_TSPEC_STATUS,
    IPC_EVENT_TSPEC_RATE_STATUS,
    IPC_EVENT_MEDIUM_TIME_CROSS,
    IPC_EVENT_ROAMING_COMPLETE,
    IPC_EVENT_EAP_AUTH_FAILURE,
    IPC_EVENT_WPA2_PREAUTHENTICATION,
    IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED,
    IPC_EVENT_SCAN_FAILED,
    IPC_EVENT_WPS_SESSION_OVERLAP,
    IPC_EVENT_RSSI_SNR_TRIGGER_0,
    IPC_EVENT_RSSI_SNR_TRIGGER_1,
	IPC_EVENT_LOGGER,
    IPC_EVENT_NOT_ASSOCIATED,
    IPC_EVENT_BSS_LOSS,
    IPC_EVENT_REASSOCIATION_RESP,
    IPC_EVENT_IMMEDIATE_SCAN_REPORT,
    IPC_EVENT_CONTINUOUS_SCAN_REPORT,
    IPC_EVENT_RSSI_SNR_TRIGGER,
    IPC_EVENT_AP_DISCONNECT,
    IPC_EVENT_TX_RETRY_FALIURE,
    IPC_EVENT_RE_AUTH_STARTED,
    IPC_EVENT_RE_AUTH_COMPLETED,
    IPC_EVENT_RE_AUTH_TERMINATED,
    IPC_EVENT_TIMEOUT,
    IPC_EVENT_GWSI,
    IPC_EVENT_MAX
};

enum
{
    DELIVERY_PUSH =0,
    DELIVERY_GET_DATA
};

enum
{
    SCAN_STATUS_COMPLETE = 0,
    SCAN_STATUS_STOPPED = 1,
    SCAN_STATUS_FAILED = 2
};

/************************* IOCTLs Functions *******************************/

TI_HANDLE   IPC_Init(void);

TI_INT32     IPC_DeInit(void);

TI_HANDLE   IPC_DeviceOpen(void* AdapterName); /* get hDevice Handle*/

TI_INT32     IPC_DeviceClose(TI_HANDLE hDevice);

TI_INT32     IPC_DeviceIoControl(TI_HANDLE   hDevice,
                            TI_UINT32    IoControlCode, 
                            void*     pInBuffer,
                            TI_UINT32    InBufferSize,
                            void*     pOutBuffer,
                            TI_UINT32    pOutBufferSize,
                            TI_UINT32*   pBytesReturned);

/************************* Events Functions *******************************/

typedef struct _IPC_EV_DATA * PIPC_EV_DATA;  

typedef TI_INT32 (*TI_EVENT_CALLBACK) (PIPC_EV_DATA  pData);

typedef struct _IPC_EVENT_PARAMS
{
    TI_UINT32            uEventType;
    TI_HANDLE           uEventID;
    TI_UINT32            uProcessID;
    TI_UINT32            uDeliveryType;
    TI_HANDLE           hUserParam;            /* Handle to back reference*/
    TI_EVENT_CALLBACK   pfEventCallback;
}IPC_EVENT_PARAMS;

/* EvParams are assumed to be the first field. Any addtions shoild be made 
    afterwards
 */
typedef struct _IPC_EV_DATA
{
    IPC_EVENT_PARAMS    EvParams;
    TI_UINT32            uBufferSize;
    TI_UINT8             uBuffer[MAX_EVENT_DATA_SIZE];
}IPC_EV_DATA;


/*this function will also enable event and pass all the parameters about it*/
/* returns unique ID of registered event, to be passed later for unregister*/
TI_INT32 IPC_RegisterEvent(TI_HANDLE             hDevice,    /* Driver Handle*/
                          IPC_EVENT_PARAMS*     pEvParams);  /* size of the structure + size of the params*/

TI_INT32 IPC_UnRegisterEvent(TI_HANDLE   hDevice,
                            IPC_EVENT_PARAMS*   pEvParams); /* returned by IPC_RegisterEvent*/

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

#ifdef  __cplusplus
}
#endif

#endif /*_IPC_UTIL_H*/

