/******************************************************************************
 *
 *  Copyright (C) 2010-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This is the private interface file for the NFA HCI.
 *
 ******************************************************************************/
#ifndef NFA_HCI_INT_H
#define NFA_HCI_INT_H

#include "nfa_hci_api.h"

extern BOOLEAN HCI_LOOPBACK_DEBUG;

/*****************************************************************************
**  Constants and data types
*****************************************************************************/


#define NFA_HCI_HOST_ID_UICC0           0x02
#define NFA_HCI_HOST_ID_UICC1           0x03
#define NFA_HCI_LAST_HOST_SPECIFIC_GATE 0xEF

#define NFA_HCI_SESSION_ID_LEN          8           /* HCI Session ID length */
#define NFA_MAX_PIPES_IN_GENERIC_GATE   0x0F        /* Maximum pipes that can be created on a generic pipe  */

#define NFA_HCI_VERSION_SW              0x090000    /* HCI SW Version number                       */
#define NFA_HCI_VERSION_HW              0x000000    /* HCI HW Version number                       */
#define NFA_HCI_VENDOR_NAME             "HCI"       /* Vendor Name                                 */
#define NFA_HCI_MODEL_ID                00          /* Model ID                                    */
#define NFA_HCI_VERSION                 90          /* HCI Version                                 */

/* NFA HCI states */
#define NFA_HCI_STATE_DISABLED          0x00     /* HCI is disabled  */
#define NFA_HCI_STATE_STARTUP           0x01     /* HCI performing Initialization sequence */
#define NFA_HCI_STATE_WAIT_NETWK_ENABLE 0x02     /* HCI is waiting for initialization of other host in the network */
#define NFA_HCI_STATE_IDLE              0x03     /* HCI is waiting to handle api commands  */
#define NFA_HCI_STATE_WAIT_RSP          0x04     /* HCI is performing api command request  */
#define NFA_HCI_STATE_REMOVE_GATE       0x05     /* Removing all pipes prior to removing the gate */
#define NFA_HCI_STATE_APP_DEREGISTER    0x06     /* Removing all pipes and gates prior to deregistering the app */
#define NFA_HCI_STATE_RESTORE           0x07     /* HCI restore */

typedef UINT8 tNFA_HCI_STATE;

/* NFA HCI PIPE states */
#define NFA_HCI_PIPE_CLOSED             0x00     /* Pipe is closed */
#define NFA_HCI_PIPE_OPENED             0x01     /* Pipe is opened */

#define NFA_HCI_INVALID_INX             0xFF


typedef UINT8 tNFA_HCI_COMMAND;
typedef UINT8 tNFA_HCI_RESPONSE;


/* NFA HCI Internal events */
enum
{
    NFA_HCI_API_REGISTER_APP_EVT = NFA_SYS_EVT_START (NFA_ID_HCI),/* Register APP with HCI */
    NFA_HCI_API_DEREGISTER_APP_EVT,                               /* Deregister an app from HCI */
    NFA_HCI_API_GET_APP_GATE_PIPE_EVT,                            /* Get the list of gate and pipe associated to the application */
    NFA_HCI_API_ALLOC_GATE_EVT,                                   /* Allocate a dyanmic gate for the application */
    NFA_HCI_API_DEALLOC_GATE_EVT,                                 /* Deallocate a previously allocated gate to the application */
    NFA_HCI_API_GET_HOST_LIST_EVT,                                /* Get the list of Host in the network */
    NFA_HCI_API_GET_REGISTRY_EVT,                                 /* Get a registry entry from a host */
    NFA_HCI_API_SET_REGISTRY_EVT,                                 /* Set a registry entry on a host */
    NFA_HCI_API_CREATE_PIPE_EVT,                                  /* Create a pipe between two gates */
    NFA_HCI_API_OPEN_PIPE_EVT,                                    /* Open a pipe */
    NFA_HCI_API_CLOSE_PIPE_EVT,                                   /* Close a pipe */
    NFA_HCI_API_DELETE_PIPE_EVT,                                  /* Delete a pipe */
    NFA_HCI_API_ADD_STATIC_PIPE_EVT,                              /* Add a static pipe */
    NFA_HCI_API_SEND_CMD_EVT,                                     /* Send command via pipe */
    NFA_HCI_API_SEND_RSP_EVT,                                     /* Application Response to a command */
    NFA_HCI_API_SEND_EVENT_EVT,                                   /* Send event via pipe */

    NFA_HCI_RSP_NV_READ_EVT,                                      /* Non volatile read complete event */
    NFA_HCI_RSP_NV_WRITE_EVT,                                     /* Non volatile write complete event */
    NFA_HCI_RSP_TIMEOUT_EVT,
    NFA_HCI_CHECK_QUEUE_EVT
};

#define NFA_HCI_FIRST_API_EVENT     NFA_HCI_API_REGISTER_APP_EVT
#define NFA_HCI_LAST_API_EVENT      NFA_HCI_API_SEND_EVENT_EVT

typedef UINT16 tNFA_HCI_INT_EVT;

/* Internal event structures.
**
** Note, every internal structure starts with a BT_HDR and an app handle
*/

/* data type for NFA_HCI_API_REGISTER_APP_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    char                app_name[NFA_MAX_HCI_APP_NAME_LEN + 1];
    tNFA_HCI_CBACK      *p_cback;
    BOOLEAN             b_send_conn_evts;
} tNFA_HCI_API_REGISTER_APP;

/* data type for NFA_HCI_API_DEREGISTER_APP_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    char                app_name[NFA_MAX_HCI_APP_NAME_LEN + 1];
} tNFA_HCI_API_DEREGISTER_APP;

/* data type for NFA_HCI_API_GET_APP_GATE_PIPE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
} tNFA_HCI_API_GET_APP_GATE_PIPE;

/* data type for NFA_HCI_API_ALLOC_GATE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
} tNFA_HCI_API_ALLOC_GATE;


/* data type for NFA_HCI_API_DEALLOC_GATE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    UINT8               gate;
} tNFA_HCI_API_DEALLOC_GATE;

/* data type for NFA_HCI_API_GET_HOST_LIST_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    tNFA_STATUS         status;
} tNFA_HCI_API_GET_HOST_LIST;

/* data type for NFA_HCI_API_GET_REGISTRY_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    UINT8               pipe;
    UINT8               reg_inx;
} tNFA_HCI_API_GET_REGISTRY;

/* data type for NFA_HCI_API_SET_REGISTRY_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    UINT8               pipe;
    UINT8               reg_inx;
    UINT8               size;
    UINT8               data[NFA_MAX_HCI_CMD_LEN];
} tNFA_HCI_API_SET_REGISTRY;

/* data type for NFA_HCI_API_CREATE_PIPE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    tNFA_STATUS         status;
    UINT8               source_gate;
    UINT8               dest_host;
    UINT8               dest_gate;
} tNFA_HCI_API_CREATE_PIPE_EVT;

/* data type for NFA_HCI_API_OPEN_PIPE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    tNFA_STATUS         status;
    UINT8               pipe;
} tNFA_HCI_API_OPEN_PIPE_EVT;

/* data type for NFA_HCI_API_CLOSE_PIPE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    tNFA_STATUS         status;
    UINT8               pipe;
} tNFA_HCI_API_CLOSE_PIPE_EVT;

/* data type for NFA_HCI_API_DELETE_PIPE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    tNFA_STATUS         status;
    UINT8               pipe;
} tNFA_HCI_API_DELETE_PIPE_EVT;

/* data type for NFA_HCI_API_ADD_STATIC_PIPE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    tNFA_STATUS         status;
    UINT8               host;
    UINT8               gate;
    UINT8               pipe;
} tNFA_HCI_API_ADD_STATIC_PIPE_EVT;

/* data type for NFA_HCI_API_SEND_EVENT_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    UINT8               pipe;
    UINT8               evt_code;
    UINT16              evt_len;
    UINT8               *p_evt_buf;
    UINT16              rsp_len;
    UINT8               *p_rsp_buf;
    UINT16              rsp_timeout;
} tNFA_HCI_API_SEND_EVENT_EVT;

/* data type for NFA_HCI_API_SEND_CMD_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    UINT8               pipe;
    UINT8               cmd_code;
    UINT16              cmd_len;
    UINT8               data[NFA_MAX_HCI_CMD_LEN];
} tNFA_HCI_API_SEND_CMD_EVT;

/* data type for NFA_HCI_RSP_NV_READ_EVT */
typedef struct
{
    BT_HDR              hdr;
    UINT8               block;
    UINT16              size;
    tNFA_STATUS         status;
} tNFA_HCI_RSP_NV_READ_EVT;

/* data type for NFA_HCI_RSP_NV_WRITE_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_STATUS         status;
} tNFA_HCI_RSP_NV_WRITE_EVT;

/* data type for NFA_HCI_API_SEND_RSP_EVT */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
    UINT8               pipe;
    UINT8               response;
    UINT8               size;
    UINT8               data[NFA_MAX_HCI_RSP_LEN];
} tNFA_HCI_API_SEND_RSP_EVT;

/* common data type for internal events */
typedef struct
{
    BT_HDR              hdr;
    tNFA_HANDLE         hci_handle;
} tNFA_HCI_COMM_DATA;

/* union of all event data types */
typedef union
{
    BT_HDR                              hdr;
    tNFA_HCI_COMM_DATA                  comm;

    /* API events */
    tNFA_HCI_API_REGISTER_APP           app_info;                       /* Register/Deregister an application */
    tNFA_HCI_API_GET_APP_GATE_PIPE      get_gate_pipe_list;             /* Get the list of gates and pipes created for the application */
    tNFA_HCI_API_ALLOC_GATE             gate_info;                      /* Allocate a dynamic gate to the application */
    tNFA_HCI_API_DEALLOC_GATE           gate_dealloc;                   /* Deallocate the gate allocated to the application */
    tNFA_HCI_API_CREATE_PIPE_EVT        create_pipe;                    /* Create a pipe */
    tNFA_HCI_API_OPEN_PIPE_EVT          open_pipe;                      /* Open a pipe */
    tNFA_HCI_API_CLOSE_PIPE_EVT         close_pipe;                     /* Close a pipe */
    tNFA_HCI_API_DELETE_PIPE_EVT        delete_pipe;                    /* Delete a pipe */
    tNFA_HCI_API_ADD_STATIC_PIPE_EVT    add_static_pipe;                /* Add a static pipe */
    tNFA_HCI_API_GET_HOST_LIST          get_host_list;                  /* Get the list of Host in the network */
    tNFA_HCI_API_GET_REGISTRY           get_registry;                   /* Get a registry entry on a host */
    tNFA_HCI_API_SET_REGISTRY           set_registry;                   /* Set a registry entry on a host */
    tNFA_HCI_API_SEND_CMD_EVT           send_cmd;                       /* Send a event on a pipe to a host */
    tNFA_HCI_API_SEND_RSP_EVT           send_rsp;                       /* Response to a command sent on a pipe to a host */
    tNFA_HCI_API_SEND_EVENT_EVT         send_evt;                       /* Send a command on a pipe to a host */

    /* Internal events */
    tNFA_HCI_RSP_NV_READ_EVT            nv_read;
    tNFA_HCI_RSP_NV_WRITE_EVT           nv_write;
} tNFA_HCI_EVENT_DATA;

/*****************************************************************************
**  control block
*****************************************************************************/

/* Dynamic pipe control block */
typedef struct
{
    UINT8                   pipe_id;                /* Pipe ID */
    tNFA_HCI_PIPE_STATE     pipe_state;             /* State of the Pipe */
    UINT8                   local_gate;             /* local gate id */
    UINT8                   dest_host;              /* Peer host to which this pipe is connected */
    UINT8                   dest_gate;              /* Peer gate to which this pipe is connected */
} tNFA_HCI_DYN_PIPE;

/* Dynamic gate control block */
typedef struct
{
    UINT8                   gate_id;                /* local gate id */
    tNFA_HANDLE             gate_owner;             /* NFA-HCI handle assigned to the application which owns the gate */
    UINT32                  pipe_inx_mask;          /* Bit 0 == pipe inx 0, etc */
} tNFA_HCI_DYN_GATE;

/* Admin gate control block */
typedef struct
{
    tNFA_HCI_PIPE_STATE pipe01_state;                       /* State of Pipe '01' */
    UINT8               session_id[NFA_HCI_SESSION_ID_LEN]; /* Session ID of the host network */
} tNFA_ADMIN_GATE_INFO;

/* Link management gate control block */
typedef struct
{
    tNFA_HCI_PIPE_STATE pipe00_state;               /* State of Pipe '00' */
    UINT16              rec_errors;                 /* Receive errors */
} tNFA_LINK_MGMT_GATE_INFO;

/* Identity management gate control block */
typedef struct
{
    UINT32              pipe_inx_mask;                  /* Bit 0 == pipe inx 0, etc */
    UINT16              version_sw;                     /* Software version number */
    UINT16              version_hw;                     /* Hardware version number */
    UINT8               vendor_name[20];                /* Vendor name */
    UINT8               model_id;                       /* Model ID */
    UINT8               hci_version;                    /* HCI Version */
} tNFA_ID_MGMT_GATE_INFO;

/* Internal flags */
#define NFA_HCI_FL_DISABLING        0x01                /* sub system is being disabled */
#define NFA_HCI_FL_NV_CHANGED       0x02                /* NV Ram changed */


/* NFA HCI control block */
typedef struct
{
    tNFA_HCI_STATE                  hci_state;                          /* state of the HCI */
    UINT8                           num_nfcee;
    UINT8                           inactive_host[NFA_HCI_MAX_HOST_IN_NETWORK]; /* Inactive host in the host network */
    UINT8                           reset_host[NFA_HCI_MAX_HOST_IN_NETWORK]; /* List of host reseting */
    BOOLEAN                         b_low_power_mode;                   /* Host controller in low power mode */
    BOOLEAN                         b_hci_netwk_reset;                  /* Command sent to reset HCI Network */
    BOOLEAN                         w4_hci_netwk_init;                  /* Wait for other host in network to initialize */
    TIMER_LIST_ENT                  timer;                              /* Timer to avoid indefinitely waiting for response */
    UINT8                           conn_id;                            /* Connection ID */
    UINT8                           buff_size;                          /* Connection buffer size */
    BOOLEAN                         nv_read_cmplt;                      /* NV Read completed */
    BOOLEAN                         nv_write_needed;                    /* Something changed - NV write is needed */
    BOOLEAN                         assembling;                         /* Set true if in process of assembling a message  */
    BOOLEAN                         assembly_failed;                    /* Set true if Insufficient buffer to Reassemble incoming message */
    BOOLEAN                         w4_rsp_evt;                         /* Application command sent on HCP Event */
    tNFA_HANDLE                     app_in_use;                         /* Index of the application that is waiting for response */
    UINT8                           local_gate_in_use;                  /* Local gate currently working with */
    UINT8                           remote_gate_in_use;                 /* Remote gate currently working with */
    UINT8                           remote_host_in_use;                 /* The remote host to which a command is sent */
    UINT8                           pipe_in_use;                        /* The pipe currently working with */
    UINT8                           param_in_use;                       /* The registry parameter currently working with */
    tNFA_HCI_COMMAND                cmd_sent;                           /* The last command sent */
    BOOLEAN                         ee_disc_cmplt;                      /* EE Discovery operation completed */
    UINT16                          msg_len;                            /* For segmentation - length of the combined message */
    UINT16                          max_msg_len;                        /* Maximum reassembled message size */
    UINT8                           msg_data[NFA_MAX_HCI_EVENT_LEN];    /* For segmentation - the combined message data */
    UINT8                           *p_msg_data;                        /* For segmentation - reassembled message */
    UINT8                           type;                               /* Instruction type of incoming message */
    UINT8                           inst;                               /* Instruction of incoming message */

    BUFFER_Q                        hci_api_q;                          /* Buffer Q to hold incoming API commands */
    BUFFER_Q                        hci_host_reset_api_q;               /* Buffer Q to hold incoming API commands to a host that is reactivating */
    tNFA_HCI_CBACK                  *p_app_cback[NFA_HCI_MAX_APP_CB];   /* Callback functions registered by the applications */
    UINT16                          rsp_buf_size;                       /* Maximum size of APDU buffer */
    UINT8                           *p_rsp_buf;                         /* Buffer to hold response to sent event */
    struct
    {
        char                        reg_app_names[NFA_HCI_MAX_APP_CB][NFA_MAX_HCI_APP_NAME_LEN + 1];

        tNFA_HCI_DYN_GATE           dyn_gates[NFA_HCI_MAX_GATE_CB];
        tNFA_HCI_DYN_PIPE           dyn_pipes[NFA_HCI_MAX_PIPE_CB];

        BOOLEAN                     b_send_conn_evts[NFA_HCI_MAX_APP_CB];
        tNFA_ADMIN_GATE_INFO        admin_gate;
        tNFA_LINK_MGMT_GATE_INFO    link_mgmt_gate;
        tNFA_ID_MGMT_GATE_INFO      id_mgmt_gate;
    } cfg;

} tNFA_HCI_CB;


/*****************************************************************************
**  External variables
*****************************************************************************/

/* NFA HCI control block */
#if NFA_DYNAMIC_MEMORY == FALSE
extern tNFA_HCI_CB nfa_hci_cb;
#else
extern tNFA_HCI_CB *nfa_hci_cb_ptr;
#define nfa_hci_cb (*nfa_hci_cb_ptr)
#endif


/*****************************************************************************
**  External functions
*****************************************************************************/

/* Functions in nfa_hci_main.c
*/
extern void nfa_hci_init (void);
extern void nfa_hci_proc_nfcc_power_mode (UINT8 nfcc_power_mode);
extern void nfa_hci_dh_startup_complete (void);
extern void nfa_hci_startup_complete (tNFA_STATUS status);
extern void nfa_hci_startup (void);
extern void nfa_hci_restore_default_config (UINT8 *p_session_id);
extern void nfa_hci_vsc_cback (tNFC_VS_EVT event, UINT16 data_len, UINT8 *p_data);

/* Action functions in nfa_hci_act.c
*/
extern void nfa_hci_check_pending_api_requests (void);
extern void nfa_hci_check_api_requests (void);
extern void nfa_hci_handle_admin_gate_cmd (UINT8 *p_data);
extern void nfa_hci_handle_admin_gate_rsp (UINT8 *p_data, UINT8 data_len);
extern void nfa_hci_handle_admin_gate_evt (UINT8 *p_data);
extern void nfa_hci_handle_link_mgm_gate_cmd (UINT8 *p_data);
extern void nfa_hci_handle_dyn_pipe_pkt (UINT8 pipe, UINT8  *p_data, UINT16 data_len);
extern void nfa_hci_handle_pipe_open_close_cmd (tNFA_HCI_DYN_PIPE *p_pipe);
extern void nfa_hci_api_dealloc_gate (tNFA_HCI_EVENT_DATA *p_evt_data);
extern void nfa_hci_api_deregister (tNFA_HCI_EVENT_DATA *p_evt_data);

/* Utility functions in nfa_hci_utils.c
*/
extern tNFA_HCI_DYN_GATE  *nfa_hciu_alloc_gate (UINT8 gate_id, tNFA_HANDLE app_handle);
extern tNFA_HCI_DYN_GATE  *nfa_hciu_find_gate_by_gid (UINT8 gate_id);
extern tNFA_HCI_DYN_GATE  *nfa_hciu_find_gate_by_owner (tNFA_HANDLE app_handle);
extern tNFA_HCI_DYN_GATE  *nfa_hciu_find_gate_with_nopipes_by_owner (tNFA_HANDLE app_handle);
extern tNFA_HCI_DYN_PIPE  *nfa_hciu_find_pipe_by_pid (UINT8 pipe_id);
extern tNFA_HCI_DYN_PIPE  *nfa_hciu_find_pipe_by_owner (tNFA_HANDLE app_handle);
extern tNFA_HCI_DYN_PIPE  *nfa_hciu_find_active_pipe_by_owner (tNFA_HANDLE app_handle);
extern tNFA_HCI_DYN_PIPE  *nfa_hciu_find_pipe_on_gate (UINT8 gate_id);
extern tNFA_HANDLE         nfa_hciu_get_gate_owner (UINT8 gate_id);
extern BOOLEAN             nfa_hciu_is_active_host (UINT8 host_id);
extern BOOLEAN             nfa_hciu_is_host_reseting (UINT8 host_id);
extern BOOLEAN             nfa_hciu_is_no_host_resetting (void);
extern tNFA_HCI_DYN_PIPE  *nfa_hciu_find_active_pipe_on_gate (UINT8 gate_id);
extern tNFA_HANDLE         nfa_hciu_get_pipe_owner (UINT8 pipe_id);
extern UINT8               nfa_hciu_count_open_pipes_on_gate (tNFA_HCI_DYN_GATE *p_gate);
extern UINT8               nfa_hciu_count_pipes_on_gate (tNFA_HCI_DYN_GATE *p_gate);
extern tNFA_STATUS         nfa_hciu_asmbl_dyn_pipe_pkt (UINT8 *p_data, UINT8 data_len);

extern tNFA_HCI_RESPONSE   nfa_hciu_add_pipe_to_gate (UINT8 pipe, UINT8 local_gate, UINT8 dest_host, UINT8 dest_gate);
extern tNFA_HCI_RESPONSE   nfa_hciu_add_pipe_to_static_gate (UINT8 local_gate, UINT8 pipe_id, UINT8 dest_host, UINT8 dest_gate);

extern tNFA_HCI_RESPONSE   nfa_hciu_release_pipe (UINT8 pipe_id);
extern void                nfa_hciu_release_gate (UINT8 gate);
extern void                nfa_hciu_remove_all_pipes_from_host (UINT8 host);
extern UINT8               nfa_hciu_get_allocated_gate_list (UINT8 *p_gate_list);

extern void                nfa_hciu_send_to_app (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA *p_evt, tNFA_HANDLE app_handle);
extern void                nfa_hciu_send_to_all_apps (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA *p_evt);
extern void                nfa_hciu_send_to_apps_handling_connectivity_evts (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA *p_evt);

extern tNFA_STATUS nfa_hciu_send_close_pipe_cmd (UINT8 pipe);
extern tNFA_STATUS nfa_hciu_send_delete_pipe_cmd (UINT8 pipe);
extern tNFA_STATUS nfa_hciu_send_clear_all_pipe_cmd (void);
extern tNFA_STATUS nfa_hciu_send_open_pipe_cmd (UINT8 pipe);
extern tNFA_STATUS nfa_hciu_send_get_param_cmd (UINT8 pipe, UINT8 index);
extern tNFA_STATUS nfa_hciu_send_create_pipe_cmd (UINT8 source_gate, UINT8 dest_host, UINT8 dest_gate);
extern tNFA_STATUS nfa_hciu_send_set_param_cmd (UINT8 pipe, UINT8 index, UINT8 length, UINT8 *p_data);
extern tNFA_STATUS nfa_hciu_send_msg (UINT8 pipe_id, UINT8 type, UINT8 instruction, UINT16 pkt_len, UINT8 *p_pkt);



#if (BT_TRACE_VERBOSE == TRUE)
extern char *nfa_hciu_type_2_str (UINT8 type);
extern char *nfa_hciu_instr_2_str (UINT8 type);
extern char *nfa_hciu_get_event_name (UINT16 event);
extern char *nfa_hciu_get_response_name (UINT8 rsp_code);
extern char *nfa_hciu_get_state_name (UINT8 state);
extern char *nfa_hciu_get_type_inst_names (UINT8 pipe, UINT8 type, UINT8 inst);
extern char *nfa_hciu_evt_2_str (UINT8 pipe_id, UINT8 evt);
#endif


#endif /* NFA_HCI_INT_H */
