/******************************************************************************
 *
 *  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 file contains the action functions for device manager state
 *  machine.
 *
 ******************************************************************************/
#include <string.h>
#include "nfa_sys.h"
#include "nfa_api.h"
#include "nfa_dm_int.h"
#include "nfa_sys_int.h"
#include "nfa_ce_int.h"
#include "nfc_api.h"
#include "nfa_rw_int.h"
#include "nfa_rw_api.h"
#include "nfa_p2p_int.h"
#include "nfa_cho_int.h"
#include "nci_hmsgs.h"

#if (NFC_NFCEE_INCLUDED == TRUE)
#include "nfa_ee_int.h"
#include "nfa_hci_int.h"
#endif

#if (defined (NFA_SNEP_INCLUDED) && (NFA_SNEP_INCLUDED==TRUE))
#include "nfa_snep_int.h"
#else
#define nfa_snep_init ()
#endif

/* This is the timeout value to guarantee disable is performed within reasonable amount of time */
#ifndef NFA_DM_DISABLE_TIMEOUT_VAL
#define NFA_DM_DISABLE_TIMEOUT_VAL         1000
#endif

static void nfa_dm_set_init_nci_params (void);
static tNFA_STATUS nfa_dm_start_polling (void);
static BOOLEAN nfa_dm_deactivate_polling (void);
static void nfa_dm_excl_disc_cback (tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER *p_data);
static void nfa_dm_poll_disc_cback (tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER *p_data);


/*******************************************************************************
**
** Function         nfa_dm_module_init_cback
**
** Description      Processing initialization complete event from sub-modules
**
** Returns          None
**
*******************************************************************************/
static void nfa_dm_module_init_cback (void)
{
    tNFA_DM_CBACK_DATA dm_cback_data;

    nfa_dm_cb.flags &= ~NFA_DM_FLAGS_ENABLE_EVT_PEND;

    /* All subsystem are initialized */
    dm_cback_data.status = NFA_STATUS_OK;
    (*nfa_dm_cb.p_dm_cback) (NFA_DM_ENABLE_EVT, &dm_cback_data);
}

/*******************************************************************************
**
** Function         nfa_dm_nfcc_power_mode_proc_complete_cback
**
** Description      Processing complete of processing NFCC power state change
**                  from all sub-modules
**
** Returns          None
**
*******************************************************************************/
static void nfa_dm_nfcc_power_mode_proc_complete_cback (void)
{
    tNFA_DM_PWR_MODE_CHANGE power_mode_change;

    NFA_TRACE_DEBUG1 ("nfa_dm_nfcc_power_mode_proc_complete_cback () nfcc_pwr_mode = 0x%x",
                      nfa_dm_cb.nfcc_pwr_mode);

    /* if NFCC power state is change to full power */
    if (nfa_dm_cb.nfcc_pwr_mode != NFA_DM_PWR_MODE_OFF_SLEEP)
    {
        nfa_dm_cb.flags &= ~NFA_DM_FLAGS_NFCC_IS_RESTORING;

        /* reconfigure BRCM NFCC */
        nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_CMD, NULL);
    }

    nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SETTING_PWR_MODE;

    power_mode_change.status     = NFA_STATUS_OK;
    power_mode_change.power_mode = nfa_dm_cb.nfcc_pwr_mode;
    (*nfa_dm_cb.p_dm_cback) (NFA_DM_PWR_MODE_CHANGE_EVT, (tNFA_DM_CBACK_DATA*) &power_mode_change);
}
/*******************************************************************************
**
** Function         nfa_dm_sys_enable
**
** Description      This function on enable
**
** Returns          void
**
*******************************************************************************/
void nfa_dm_sys_enable (void)
{
    nfa_dm_set_init_nci_params ();
}

/*******************************************************************************
**
** Function         nfa_dm_set_init_nci_params
**
** Description      Set initial NCI configuration parameters
**
** Returns          void
**
*******************************************************************************/
static void nfa_dm_set_init_nci_params (void)
{
    UINT8   xx;

    /* set NCI default value if other than zero */

    /* LF_T3T_IDENTIFIERS_1/2/.../16 */
    for (xx = 0; xx < NFA_CE_LISTEN_INFO_MAX; xx++)
    {
        nfa_dm_cb.params.lf_t3t_id[xx][0] = 0xFF;
        nfa_dm_cb.params.lf_t3t_id[xx][1] = 0xFF;
        nfa_dm_cb.params.lf_t3t_id[xx][2] = 0x02;
        nfa_dm_cb.params.lf_t3t_id[xx][2] = 0xFE;
    }

    /* LF_T3T_PMM */
    for (xx = 0; xx < NCI_PARAM_LEN_LF_T3T_PMM; xx++)
    {
        nfa_dm_cb.params.lf_t3t_pmm[xx] = 0xFF;
    }

    /* LF_T3T_FLAGS:
    ** DH needs to set this configuration, even if default value (not listening) is used,
    ** to let NFCC know of intention (not listening) of DH.
    */

    /* FWI */
    nfa_dm_cb.params.fwi[0] = 0x04;

    /* WT */
    nfa_dm_cb.params.wt[0] = 14;

    /* Set CE default configuration */
    if (p_nfa_dm_ce_cfg[0])
    {
        nfa_dm_check_set_config (p_nfa_dm_ce_cfg[0], &p_nfa_dm_ce_cfg[1], FALSE);
    }

    /* Set optional general default configuration */
    if (p_nfa_dm_gen_cfg && p_nfa_dm_gen_cfg[0])
    {
        nfa_dm_check_set_config (p_nfa_dm_gen_cfg[0], &p_nfa_dm_gen_cfg[1], FALSE);
    }

    if (p_nfa_dm_interface_mapping && nfa_dm_num_dm_interface_mapping)
    {
        NFC_DiscoveryMap (nfa_dm_num_dm_interface_mapping, p_nfa_dm_interface_mapping, NULL);
    }
}

/*******************************************************************************
**
** Function         nfa_dm_proc_nfcc_power_mode
**
** Description      Processing NFCC power mode changes
**
** Returns          None
**
*******************************************************************************/
void nfa_dm_proc_nfcc_power_mode (UINT8 nfcc_power_mode)
{
    NFA_TRACE_DEBUG1 ("nfa_dm_proc_nfcc_power_mode (): nfcc_power_mode=%d",
                       nfcc_power_mode);

    /* if NFCC power mode is change to full power */
    if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL)
    {
        memset (&nfa_dm_cb.params, 0x00, sizeof (tNFA_DM_PARAMS));

        nfa_dm_cb.setcfg_pending_mask = 0;
        nfa_dm_cb.setcfg_pending_num  = 0;
        nfa_dm_set_init_nci_params ();
    }

    nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_DM);
}

/*******************************************************************************
**
** Function         nfa_dm_disable_event
**
** Description      report disable event
**
** Returns          void
**
*******************************************************************************/
static void nfa_dm_disable_event (void)
{
    /* Deregister DM from sys */
    nfa_sys_deregister (NFA_ID_DM);

    /* Notify app */
    nfa_dm_cb.flags &= ~(NFA_DM_FLAGS_DM_IS_ACTIVE
                        |NFA_DM_FLAGS_DM_DISABLING_NFC
                        |NFA_DM_FLAGS_ENABLE_EVT_PEND);
    (*nfa_dm_cb.p_dm_cback) (NFA_DM_DISABLE_EVT, NULL);
}

/*******************************************************************************
**
** Function         nfa_dm_nfc_response_cback
**
** Description      Call DM event hanlder with NFC response callback data
**
** Returns          void
**
*******************************************************************************/
static void nfa_dm_nfc_response_cback (tNFC_RESPONSE_EVT event, tNFC_RESPONSE *p_data)
{
    tNFA_DM_CBACK_DATA dm_cback_data;
    tNFA_GET_CONFIG   *p_nfa_get_confg;
    tNFA_CONN_EVT_DATA conn_evt;
    UINT8 dm_cback_evt;

#if (BT_TRACE_VERBOSE == TRUE)
    NFA_TRACE_DEBUG2 ("nfa_dm_nfc_response_cback () %s(0x%x)", nfa_dm_nfc_revt_2_str (event), event);
#else
    NFA_TRACE_DEBUG1 ("nfa_dm_nfc_response_cback () event=0x%x", event);
#endif

    switch (event)
    {
    case NFC_ENABLE_REVT:                        /* 0  Enable event */

        /* NFC stack enabled. Enable nfa sub-systems */
        if (p_data->enable.status == NFC_STATUS_OK)
        {
            nfa_dm_set_init_nci_params ();

            /* Initialize NFA subsystems */
            nfa_sys_enable_subsystems ();
        }
        else if (nfa_dm_cb.flags & NFA_DM_FLAGS_ENABLE_EVT_PEND)
        {
            /* Notify app */
            nfa_dm_cb.flags &= ~(NFA_DM_FLAGS_ENABLE_EVT_PEND | NFA_DM_FLAGS_DM_IS_ACTIVE);
            dm_cback_data.status = p_data->enable.status;
            (*nfa_dm_cb.p_dm_cback) (NFA_DM_ENABLE_EVT, &dm_cback_data);
        }
        break;

    case NFC_DISABLE_REVT:                       /* 1  Disable event */
        nfa_dm_disable_event ();
        break;

    case NFC_SET_CONFIG_REVT:                    /* 2  Set Config Response */
        /* If this setconfig was due to NFA_SetConfig, then notify the app */
        if (nfa_dm_cb.setcfg_pending_mask & 1)      /* lsb=whether last NCI_SET_CONFIG was due to NFA_SetConfig */
        {
            dm_cback_data.set_config.status         = p_data->set_config.status;
            dm_cback_data.set_config.num_param_id   = p_data->set_config.num_param_id;
            memcpy (dm_cback_data.set_config.param_ids, p_data->set_config.param_ids, p_data->set_config.num_param_id);
            (*nfa_dm_cb.p_dm_cback) (NFA_DM_SET_CONFIG_EVT, &dm_cback_data);
        }

        /* Update the pending mask */
        if (nfa_dm_cb.setcfg_pending_num>0)
        {
            nfa_dm_cb.setcfg_pending_mask >>= 1;
            nfa_dm_cb.setcfg_pending_num--;
        }
        else
        {
            /* This should not occur (means we got a SET_CONFIG_NTF that's unaccounted for */
            NFA_TRACE_ERROR0 ("NFA received unexpected NFC_SET_CONFIG_REVT");
        }
        break;

    case NFC_GET_CONFIG_REVT:                    /* 3  Get Config Response */
        if (p_data->get_config.status == NFC_STATUS_OK)
        {
            if ((p_nfa_get_confg = (tNFA_GET_CONFIG *) GKI_getbuf ((UINT16) (sizeof (tNFA_GET_CONFIG) + p_data->get_config.tlv_size))) != NULL)
            {
                p_nfa_get_confg->status = NFA_STATUS_OK;
                p_nfa_get_confg->tlv_size = p_data->get_config.tlv_size;
                memcpy (p_nfa_get_confg->param_tlvs, p_data->get_config.p_param_tlvs, p_data->get_config.tlv_size);
                (*nfa_dm_cb.p_dm_cback) (NFA_DM_GET_CONFIG_EVT, (tNFA_DM_CBACK_DATA *) p_nfa_get_confg);

                GKI_freebuf (p_nfa_get_confg);
                return;
            }
            else
            {
                NFA_TRACE_DEBUG0 ("nfa_dm_nfc_response_cback unable to allocate buffer");
            }
        }

        /* Return result of getconfig to the app */
        dm_cback_data.get_config.status = NFA_STATUS_FAILED;
        (*nfa_dm_cb.p_dm_cback) (NFA_DM_GET_CONFIG_EVT, &dm_cback_data);
        break;

#if (NFC_NFCEE_INCLUDED == TRUE)
    case NFC_NFCEE_DISCOVER_REVT:                /* NFCEE Discover response */
    case NFC_NFCEE_INFO_REVT:                    /* NFCEE Discover Notification */
    case NFC_EE_ACTION_REVT:                     /* EE Action notification */
    case NFC_NFCEE_MODE_SET_REVT:                /* NFCEE Mode Set response */
    case NFC_EE_DISCOVER_REQ_REVT:               /* EE Discover Req notification */
        nfa_ee_proc_evt (event, p_data);
        break;
#endif

    case NFC_RF_FIELD_REVT:                      /* RF Field information            */
        dm_cback_data.rf_field.status          = NFA_STATUS_OK;
        dm_cback_data.rf_field.rf_field_status = p_data->rf_field.rf_field;
        (*nfa_dm_cb.p_dm_cback) (NFA_DM_RF_FIELD_EVT, &dm_cback_data);
        break;

    case NFC_SET_ROUTING_REVT:                   /* Configure Routing response */
        break;

    case NFC_GET_ROUTING_REVT:                   /* Retrieve Routing response */
        break;

    case NFC_GEN_ERROR_REVT:                     /* generic error command or notification */
        break;

    case NFC_NFCC_RESTART_REVT:                  /* NFCC has been re-initialized */

        if (p_data->status == NFC_STATUS_OK)
        {
            nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_FULL;
            nfa_dm_cb.flags |= NFA_DM_FLAGS_NFCC_IS_RESTORING;

            /* NFCC will start from IDLE when turned on again */
            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
            nfa_dm_cb.disc_cb.disc_state = NFA_DM_RFST_IDLE;
        }
        else
        {
            nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_OFF_SLEEP;
        }
        /* Notify NFA submodules change of NFCC power mode */
        nfa_sys_cback_reg_nfcc_power_mode_proc_complete (nfa_dm_nfcc_power_mode_proc_complete_cback);
        nfa_sys_notify_nfcc_power_mode (nfa_dm_cb.nfcc_pwr_mode);
        break;

    case NFC_NFCC_TIMEOUT_REVT:
    case NFC_NFCC_TRANSPORT_ERR_REVT:
        NFA_TRACE_DEBUG1 ("flags:0x%08x", nfa_dm_cb.flags);
        dm_cback_evt = (event == NFC_NFCC_TIMEOUT_REVT) ? NFA_DM_NFCC_TIMEOUT_EVT : NFA_DM_NFCC_TRANSPORT_ERR_EVT;
        (*nfa_dm_cb.p_dm_cback) (dm_cback_evt, NULL);
        break;

    case NFC_NFCC_POWER_OFF_REVT:
        nfa_dm_cb.nfcc_pwr_mode = NFA_DM_PWR_MODE_OFF_SLEEP;

        /* Notify NFA submodules change of NFCC power mode */
        nfa_sys_cback_reg_nfcc_power_mode_proc_complete (nfa_dm_nfcc_power_mode_proc_complete_cback);
        nfa_sys_notify_nfcc_power_mode (NFA_DM_PWR_MODE_OFF_SLEEP);
        break;

    case NFC_RF_COMM_PARAMS_UPDATE_REVT:
        conn_evt.status = p_data->status;
        nfa_dm_conn_cback_event_notify (NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt);
        break;

    default:
        break;
    }
}


/*******************************************************************************
**
** Function         nfa_dm_enable
**
** Description      Initialises the NFC device manager
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_enable (tNFA_DM_MSG *p_data)
{
    tNFA_DM_CBACK_DATA dm_cback_data;
    NFA_TRACE_DEBUG0 ("nfa_dm_enable ()");

    /* Check if NFA is already enabled */
    if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_DM_IS_ACTIVE))
    {
        /* Initialize BRCM control block, it musb be called before setting any flags */
        nfa_dm_cb.flags |= (NFA_DM_FLAGS_DM_IS_ACTIVE | NFA_DM_FLAGS_ENABLE_EVT_PEND);
        nfa_sys_cback_reg_enable_complete (nfa_dm_module_init_cback);


        /* Store Enable parameters */
        nfa_dm_cb.p_dm_cback    = p_data->enable.p_dm_cback;
        nfa_dm_cb.p_conn_cback  = p_data->enable.p_conn_cback;

        /* Enable NFC stack */
        NFC_Enable (nfa_dm_nfc_response_cback);
    }
    else
    {
        NFA_TRACE_ERROR0 ("nfa_dm_enable: ERROR ALREADY ENABLED.");
        dm_cback_data.status = NFA_STATUS_ALREADY_STARTED;
        (*(p_data->enable.p_dm_cback)) (NFA_DM_ENABLE_EVT, &dm_cback_data);
    }

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_disable
**
** Description      Disables the NFC device manager
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_disable (tNFA_DM_MSG *p_data)
{
    tNFC_DEACT_TYPE deactivate_type = NFA_DEACTIVATE_TYPE_IDLE;

    NFA_TRACE_DEBUG1 ("nfa_dm_disable (): graceful:%d", p_data->disable.graceful);

    if (p_data->disable.graceful)
    {
        /* if RF discovery is enabled */
        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED)
        {
            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED;

            if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE)
            {
                /* if waiting RSP in idle state */
                if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
                {
                    nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_DISABLING;
                }
            }
            else
            {
                nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_DISABLING;
                nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type);
                if ((nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF)) == 0)
                {
                    /* not waiting to deactivate, clear the flag now */
                    nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING;
                }
            }
        }
        /* Start timeout for graceful shutdown. If timer expires, then force an ungraceful shutdown */
        nfa_sys_start_timer (&nfa_dm_cb.tle, NFA_DM_TIMEOUT_DISABLE_EVT, NFA_DM_DISABLE_TIMEOUT_VAL);
    }

    /* Disable all subsystems other than DM (DM will be disabled after all  */
    /* the other subsystem have been disabled)                              */
    nfa_sys_disable_subsystems (p_data->disable.graceful);
    return (TRUE);
}


/*******************************************************************************
**
** Function         nfa_dm_disable_complete
**
** Description      Called when all NFA subsytems are disabled.
**
**                  NFC core stack can now be disabled.
**
** Returns          void
**
*******************************************************************************/
void nfa_dm_disable_complete (void)
{
    NFA_TRACE_DEBUG0 ("nfa_dm_disable_complete ()");

    if ((nfa_dm_cb.flags & NFA_DM_FLAGS_DM_DISABLING_NFC) == 0)
    {
        NFA_TRACE_DEBUG0 ("nfa_dm_disable_complete (): proceeding with nfc core shutdown.");

        nfa_dm_cb.flags |= NFA_DM_FLAGS_DM_DISABLING_NFC;

        nfa_sys_stop_timer (&nfa_dm_cb.tle);

        /* Free all buffers for NDEF handlers */
        nfa_dm_ndef_dereg_all();

        /* Disable nfc core stack */
        NFC_Disable ();
    }
}

/*******************************************************************************
**
** Function         nfa_dm_set_config
**
** Description      Process set config command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_set_config (tNFA_DM_MSG *p_data)
{
    tNFC_STATUS status;
    UINT8       buff[255];
    UINT8      *p = buff;

    tNFA_DM_CBACK_DATA dm_cback_data;

    if (p_data->setconfig.length + 2 > 255)
    {
        /* Total length of TLV must be less than 256 (1 byte) */
        status = NFC_STATUS_FAILED;
    }
    else
    {
        UINT8_TO_STREAM (p, p_data->setconfig.param_id);
        UINT8_TO_STREAM (p, p_data->setconfig.length);
        ARRAY_TO_STREAM (p, p_data->setconfig.p_data, p_data->setconfig.length)
        status = nfa_dm_check_set_config ((UINT8) (p_data->setconfig.length + 2), buff, TRUE);
    }

    if (status != NFC_STATUS_OK)
    {
        dm_cback_data.set_config.status = NFA_STATUS_INVALID_PARAM;
        (*nfa_dm_cb.p_dm_cback) (NFA_DM_SET_CONFIG_EVT, &dm_cback_data);
    }

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_get_config
**
** Description      Process get config command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_get_config (tNFA_DM_MSG *p_data)
{
    NFC_GetConfig (p_data->getconfig.num_ids, p_data->getconfig.p_pmids);

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_conn_cback_event_notify
**
** Description      Notify application of CONN_CBACK event, using appropriate
**                  callback
**
** Returns          nothing
**
*******************************************************************************/
void nfa_dm_conn_cback_event_notify (UINT8 event, tNFA_CONN_EVT_DATA *p_data)
{
    if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)
    {
        /* Use exclusive RF mode callback */
        if (nfa_dm_cb.p_excl_conn_cback)
            (*nfa_dm_cb.p_excl_conn_cback) (event, p_data);
    }
    else
    {
        (*nfa_dm_cb.p_conn_cback) (event, p_data);
    }
}

/*******************************************************************************
**
** Function         nfa_dm_rel_excl_rf_control_and_notify
**
** Description      Stop exclusive RF control and notify app of
**                  NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT
**
** Returns          void
**
*******************************************************************************/
void nfa_dm_rel_excl_rf_control_and_notify (void)
{
    tNFA_CONN_EVT_DATA conn_evt;

    NFA_TRACE_DEBUG0 ("nfa_dm_rel_excl_rf_control_and_notify ()");

    /* Exclusive RF control stopped. Notify app */
    nfa_dm_cb.flags &= ~NFA_DM_FLAGS_EXCL_RF_ACTIVE;

    /* Stop exclusive RF discovery for exclusive RF mode */
    nfa_dm_stop_excl_discovery ();

    /* Notify app that exclusive RF control has stopped */
    conn_evt.status = NFA_STATUS_OK;
    (*nfa_dm_cb.p_excl_conn_cback) (NFA_EXCLUSIVE_RF_CONTROL_STOPPED_EVT, &conn_evt);
    nfa_dm_cb.p_excl_conn_cback = NULL;
    nfa_dm_cb.p_excl_ndef_cback = NULL;
}

/*******************************************************************************
**
** Function         nfa_dm_act_request_excl_rf_ctrl
**
** Description      Request exclusive RF control
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_request_excl_rf_ctrl (tNFA_DM_MSG *p_data)
{
    tNFA_CONN_EVT_DATA conn_evt;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_request_excl_rf_ctrl ()");

    if (!nfa_dm_cb.p_excl_conn_cback)
    {
        if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_IDLE)
        {
            conn_evt.status = NFA_STATUS_FAILED;
            (*p_data->req_excl_rf_ctrl.p_conn_cback) (NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &conn_evt);
            return TRUE;
        }

        /* Store callbacks */
        nfa_dm_cb.p_excl_conn_cback = p_data->req_excl_rf_ctrl.p_conn_cback;
        nfa_dm_cb.p_excl_ndef_cback = p_data->req_excl_rf_ctrl.p_ndef_cback;

        nfa_dm_cb.flags |= NFA_DM_FLAGS_EXCL_RF_ACTIVE;

        /* start exclusive RF discovery */
        nfa_dm_start_excl_discovery (p_data->req_excl_rf_ctrl.poll_mask,
                                     &p_data->req_excl_rf_ctrl.listen_cfg,
                                     nfa_dm_excl_disc_cback);
    }
    else
    {
        NFA_TRACE_ERROR0 ("Exclusive rf control already requested");

        conn_evt.status = NFA_STATUS_FAILED;
        (*p_data->req_excl_rf_ctrl.p_conn_cback) (NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &conn_evt);
    }

    return TRUE;
}


/*******************************************************************************
**
** Function         nfa_dm_act_release_excl_rf_ctrl
**
** Description      Release exclusive RF control
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_release_excl_rf_ctrl (tNFA_DM_MSG *p_data)
{
    NFA_TRACE_DEBUG0 ("nfa_dm_act_release_excl_rf_ctrl ()");

    /* nfa_dm_rel_excl_rf_control_and_notify() is called when discovery state goes IDLE */
    nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING;

    /* if discover command has been sent in IDLE state and waiting for response
    ** then just wait for responose. Otherwise initiate deactivating.
    */
    if (!(  (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE)
          &&(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)  ))
    {
        nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE);
    }

    return TRUE;
}

/*******************************************************************************
**
** Function         nfa_dm_act_deactivate
**
** Description      Process deactivate command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_deactivate (tNFA_DM_MSG *p_data)
{
    tNFA_CONN_EVT_DATA conn_evt;
    tNFA_DEACTIVATE_TYPE deact_type;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_deactivate ()");

    if (  (p_data->deactivate.sleep_mode == FALSE)                 /* Always allow deactivate to IDLE */
        ||(  (nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_T1T)      /* Do not allow deactivate to SLEEP for T1T,NFCDEP, ISO15693 */
           &&(nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_NFC_DEP)
           &&(nfa_dm_cb.disc_cb.activated_protocol != NFA_PROTOCOL_ISO15693)  )  )
    {
        if (  (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP)
            &&((nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) == 0x00)  )
        {
            /* Exclusive RF control doesn't use NFA P2P */
            /* NFA P2P will deactivate NFC link after deactivating LLCP link */
            nfa_p2p_deactivate_llcp ();
            return (TRUE);
        }
        else
        {
            deact_type  = NFA_DEACTIVATE_TYPE_DISCOVERY;
            if (p_data->deactivate.sleep_mode)
            {
                if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT)
                {
                    /* Deactivate to sleep mode not allowed in this state. */
                    deact_type = NFA_DEACTIVATE_TYPE_IDLE;
                }
                else if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_LISTEN_SLEEP)
                {
                    deact_type = NFA_DEACTIVATE_TYPE_SLEEP;
                }
            }
            if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_ALL_DISCOVERIES)
            {
                /* Only deactivate to IDLE is allowed in this state. */
                deact_type = NFA_DEACTIVATE_TYPE_IDLE;
            }
            if (nfa_dm_rf_deactivate (deact_type) == NFA_STATUS_OK)
            {
                nfa_rw_stop_presence_check_timer ();
                return (TRUE);
            }
        }
    }

    NFA_TRACE_ERROR0 ("nfa_dm_act_deactivate (): invalid protocol or mode");

    /* Notify error to application */
    conn_evt.status = NFA_STATUS_FAILED;
    nfa_dm_conn_cback_event_notify (NFA_DEACTIVATE_FAIL_EVT, &conn_evt);

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_power_off_sleep
**
** Description      Process power off sleep mode request
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_power_off_sleep (tNFA_DM_MSG *p_data)
{
    NFA_TRACE_DEBUG0 ("nfa_dm_act_power_off_sleep ()");

    NFC_SetPowerOffSleep ((BOOLEAN) (p_data->hdr.layer_specific));

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_reg_vsc
**
** Description      Process registers VSC callback
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_reg_vsc(tNFA_DM_MSG *p_data)
{
    if (NFC_RegVSCback(p_data->reg_vsc.is_register, p_data->reg_vsc.p_cback) != NFC_STATUS_OK)
    {
        NFA_TRACE_ERROR0 ("NFC_RegVSCback failed");
    }
    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_send_vsc
**
** Description      Send the NCI Vendor Specific command to the NCI command queue
**
** Returns          FALSE (message buffer is NOT freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_send_vsc(tNFA_DM_MSG *p_data)
{
    BT_HDR  *p_cmd = (BT_HDR *)p_data;

    p_cmd->offset   = sizeof (tNFA_DM_API_SEND_VSC) - BT_HDR_SIZE;
    p_cmd->len      = p_data->send_vsc.cmd_params_len;
    NFC_SendVsCommand (p_data->send_vsc.oid, p_cmd, p_data->send_vsc.p_cback);

    /* Most dm action functions return TRUE, so nfa-sys frees the GKI buffer carrying the message,
     * This action function re-use the GKI buffer to send the VSC, so the GKI buffer can not be freed by nfa-sys */
    return (FALSE);
}

/*******************************************************************************
**
** Function         nfa_dm_start_polling
**
** Description      Start polling
**
** Returns          tNFA_STATUS
**
*******************************************************************************/
tNFA_STATUS nfa_dm_start_polling (void)
{
    tNFA_STATUS             status;
    tNFA_TECHNOLOGY_MASK    poll_tech_mask;
    tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;

    NFA_TRACE_DEBUG0 ("nfa_dm_start_polling ()");

    poll_tech_mask = nfa_dm_cb.poll_mask;

    /* start RF discovery with discovery callback */
    if (nfa_dm_cb.poll_disc_handle == NFA_HANDLE_INVALID)
    {
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T;
            poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T;
            poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP;
            poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP;
            poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY;
        }
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP;
        }
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP;
        }
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T;
            poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP;
        }
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP;
        }
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ISO15693)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_P_ISO15693;
        }
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME;
        }
        if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO)
        {
            poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO;
        }

        nfa_dm_cb.poll_disc_handle = nfa_dm_add_rf_discover (poll_disc_mask,
                                                             NFA_DM_DISC_HOST_ID_DH,
                                                             nfa_dm_poll_disc_cback);

        if (nfa_dm_cb.poll_disc_handle != NFA_HANDLE_INVALID)
            status = NFA_STATUS_OK;
        else
            status = NFA_STATUS_FAILED;
    }
    else
    {
        status = NFA_STATUS_OK;
    }

    return (status);
}

/*******************************************************************************
**
** Function         nfa_dm_act_enable_polling
**
** Description      Process enable polling command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_enable_polling (tNFA_DM_MSG *p_data)
{
    tNFA_CONN_EVT_DATA evt_data;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_enable_polling ()");

    if (  (!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED))
        &&(!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)  )  )
    {
        nfa_dm_cb.poll_mask = p_data->enable_poll.poll_mask;

        if (nfa_dm_start_polling () == NFA_STATUS_OK)
        {
            nfa_dm_cb.flags |= NFA_DM_FLAGS_POLLING_ENABLED;

            evt_data.status = NFA_STATUS_OK;
            nfa_dm_conn_cback_event_notify (NFA_POLL_ENABLED_EVT, &evt_data);
            return (TRUE);
        }
    }
    else
    {
        NFA_TRACE_ERROR0 ("nfa_dm_act_enable_polling (): already started");
    }

    /* send NFA_POLL_ENABLED_EVT with NFA_STATUS_FAILED */
    evt_data.status = NFA_STATUS_FAILED;
    nfa_dm_conn_cback_event_notify (NFA_POLL_ENABLED_EVT, &evt_data);

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_deactivate_polling
**
** Description      Deactivate any polling state
**
** Returns          TRUE if need to wait for deactivation
**
*******************************************************************************/
static BOOLEAN nfa_dm_deactivate_polling (void)
{
    NFA_TRACE_DEBUG0 ("nfa_dm_deactivate_polling ()");

    if (  (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_ALL_DISCOVERIES)
        ||(nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT)  )
    {
        nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE);
        return FALSE;
    }
    else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
    {
        if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP)
        {
            /* NFA P2P will deactivate NFC link after deactivating LLCP link */
            nfa_p2p_deactivate_llcp ();
        }
        else
        {
            nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE);
        }
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/*******************************************************************************
**
** Function         nfa_dm_act_disable_polling
**
** Description      Process disable polling command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_disable_polling (tNFA_DM_MSG *p_data)
{
    tNFA_CONN_EVT_DATA evt_data;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_disable_polling ()");

    if (nfa_dm_cb.poll_disc_handle != NFA_HANDLE_INVALID)
    {
        nfa_dm_cb.flags &= ~NFA_DM_FLAGS_POLLING_ENABLED;

        if (nfa_dm_deactivate_polling () == FALSE)
        {
            nfa_dm_delete_rf_discover (nfa_dm_cb.poll_disc_handle);
            nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID;

            evt_data.status = NFA_STATUS_OK;
            nfa_dm_conn_cback_event_notify (NFA_POLL_DISABLED_EVT, &evt_data);
        }
        else
        {
            nfa_dm_cb.flags |= NFA_DM_FLAGS_SEND_POLL_STOP_EVT;
        }
    }
    else
    {
        evt_data.status = NFA_STATUS_FAILED;
        nfa_dm_conn_cback_event_notify (NFA_POLL_DISABLED_EVT, &evt_data);
    }

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_send_raw_frame
**
** Description      Send an raw frame on RF link
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_send_raw_frame (tNFA_DM_MSG *p_data)
{
    tNFC_STATUS status = NFC_STATUS_FAILED;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_send_raw_frame ()");

    /* If NFC link is activated */
    if (  (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
        ||(nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE)  )
    {
        /* If not in exclusive mode, and not activated for LISTEN, then forward raw data to NFA_RW to send */
        if (  !(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)
            &&!(nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE)
            &&(  (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T1T)
               ||(nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T2T)
               ||(nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_T3T)
               ||(  (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_ISO_DEP)
                  &&(nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_ISO_DEP)  )
               ||(nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_ISO15693)  )  )
        {
            /* if RW is checking presence then it will put into pending queue */
            status = nfa_rw_send_raw_frame ((BT_HDR*)p_data);
        }
        else
        {
            status = NFC_SendData (NFC_RF_CONN_ID, (BT_HDR*) p_data);
        }
    }

    if (status == NFC_STATUS_FAILED)
    {
        /* free the buffer */
        return TRUE;
    }
    else
    {
        /* NCI layer will free buffer */
        return FALSE;
    }
}

/*******************************************************************************
**
** Function         nfa_dm_set_p2p_listen_tech
**
** Description      Notify change of P2P listen technologies to NFA P2P
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_set_p2p_listen_tech (tNFA_DM_MSG *p_data)
{
    NFA_TRACE_DEBUG1 ("nfa_dm_set_p2p_listen_tech ()  tech_mask = %d",
                      p_data->set_p2p_listen_tech.tech_mask);

    nfa_p2p_update_listen_tech (p_data->set_p2p_listen_tech.tech_mask);
    nfa_dm_conn_cback_event_notify (NFA_SET_P2P_LISTEN_TECH_EVT, NULL);

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_start_rf_discovery
**
** Description      Process start RF discovery command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_start_rf_discovery (tNFA_DM_MSG *p_data)
{
    tNFA_CONN_EVT_DATA evt_data;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_start_rf_discovery ()");

    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED)
    {
        evt_data.status = NFA_STATUS_OK;
        nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
    }
    else if (nfa_dm_cb.disc_cb.disc_state != NFA_DM_RFST_IDLE)
    {
        evt_data.status = NFA_STATUS_SEMANTIC_ERROR;
        nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
    }
    else
    {
        nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_ENABLED|NFA_DM_DISC_FLAGS_NOTIFY);
        nfa_dm_start_rf_discover ();
    }

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_stop_rf_discovery
**
** Description      Process stop RF discovery command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_stop_rf_discovery (tNFA_DM_MSG *p_data)
{
    tNFA_CONN_EVT_DATA evt_data;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_stop_rf_discovery ()");

    if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED) ||
        (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) )
    {
        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED;

        /* if discover command has been sent in IDLE state and waiting for response */
        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
        {
            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING;
        }
        else
        {
            evt_data.status = NFA_STATUS_OK;
            nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data);
        }
    }
    else
    {
        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_ENABLED;
        nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_STOPPING;
        nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE);
    }
    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_set_rf_disc_duration
**
** Description      Set duration for RF discovery
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_set_rf_disc_duration (tNFA_DM_MSG *p_data)
{
    nfa_dm_cb.disc_cb.disc_duration = p_data->disc_duration.rf_disc_dur_ms;
    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_select
**
** Description      Process RF select command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_select (tNFA_DM_MSG *p_data)
{
    NFA_TRACE_DEBUG0 ("nfa_dm_act_select ()");

    nfa_dm_rf_discover_select (p_data->select.rf_disc_id,
                               p_data->select.protocol,
                               p_data->select.rf_interface);
    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_update_rf_params
**
** Description      Process update RF communication parameters command
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_update_rf_params (tNFA_DM_MSG *p_data)
{
    tNFA_CONN_EVT_DATA conn_evt;

    NFA_TRACE_DEBUG0 ("nfa_dm_act_update_rf_params ()");

    if (NFC_UpdateRFCommParams (&p_data->update_rf_params.params) != NFC_STATUS_OK)
    {
        conn_evt.status = NFA_STATUS_FAILED;
        nfa_dm_conn_cback_event_notify (NFA_UPDATE_RF_PARAM_RESULT_EVT, &conn_evt);
    }

    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_disable_timeout
**
** Description      timeout on disable process. Shutdown immediately
**
** Returns          TRUE (message buffer to be freed by caller)
**
*******************************************************************************/
BOOLEAN nfa_dm_act_disable_timeout (tNFA_DM_MSG *p_data)
{
    tNFA_DM_API_DISABLE disable;

    disable.graceful = FALSE;
    nfa_dm_disable ((tNFA_DM_MSG *) &disable);
    return (TRUE);
}

/*******************************************************************************
**
** Function         nfa_dm_act_conn_cback_notify
**
** Description      Notify app of reader/writer/ndef events
**
** Returns          nothing
**
*******************************************************************************/
void nfa_dm_act_conn_cback_notify (UINT8 event, tNFA_CONN_EVT_DATA *p_data)
{
    NFA_TRACE_DEBUG1 ("nfa_dm_act_conn_cback_notify (): event:0x%X", event);

    /* Notify event using appropriate CONN_CBACK */
    nfa_dm_conn_cback_event_notify (event, p_data);

    /* If not in exclusive RF mode, then read NDEF message from tag (if automatic reading is enabled) */
    if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE))
    {
        if (  (event == NFA_NDEF_DETECT_EVT)
            &&(nfa_dm_cb.flags & NFA_DM_FLAGS_AUTO_READING_NDEF)  )
        {
            /* read NDEF message from tag */
            if (p_data->ndef_detect.status == NFA_STATUS_OK)
            {
                NFA_RwReadNDef ();
            }
            else if (p_data->ndef_detect.status == NFA_STATUS_FAILED)
            {
                nfa_dm_cb.flags &= ~NFA_DM_FLAGS_AUTO_READING_NDEF;
            }
            /* ignore NFA_STATUS_BUSY */
        }
        else if (  (event == NFA_READ_CPLT_EVT)
                 &&(nfa_dm_cb.flags & NFA_DM_FLAGS_AUTO_READING_NDEF))
        {
            /* reading NDEF message is done */
            nfa_dm_cb.flags &= ~NFA_DM_FLAGS_AUTO_READING_NDEF;
        }
    }
}

/*******************************************************************************
**
** Function         nfa_dm_act_data_cback
**
** Description      Processing data from RF link
**
** Returns          None
**
*******************************************************************************/
static void nfa_dm_act_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
{
    BT_HDR             *p_msg = (BT_HDR *) p_data->data.p_data;
    tNFA_CONN_EVT_DATA evt_data;

    NFA_TRACE_DEBUG1 ("nfa_dm_act_data_cback (): event = 0x%X", event);

    if (event == NFC_DATA_CEVT)
    {
        if (p_msg)
        {
            evt_data.data.p_data = (UINT8 *) (p_msg + 1) + p_msg->offset;
            evt_data.data.len    = p_msg->len;

            nfa_dm_conn_cback_event_notify (NFA_DATA_EVT, &evt_data);

            GKI_freebuf (p_msg);
        }
        else
        {
            NFA_TRACE_ERROR0 ("nfa_dm_act_data_cback (): received NFC_DATA_CEVT with NULL data pointer");
        }
    }
    else if (event == NFC_DEACTIVATE_CEVT)
    {
        NFC_SetStaticRfCback (NULL);
    }
}

/*******************************************************************************
**
** Function         nfa_dm_excl_disc_cback
**
** Description      Processing event from discovery callback
**
** Returns          None
**
*******************************************************************************/
static void nfa_dm_excl_disc_cback (tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER *p_data)
{
    tNFA_CONN_EVT_DATA evt_data;

    NFA_TRACE_DEBUG1 ("nfa_dm_excl_disc_cback (): event:0x%02X", event);

    switch (event)
    {
    case NFA_DM_RF_DISC_START_EVT:
        evt_data.status = NFA_STATUS_OK;
        nfa_dm_conn_cback_event_notify (NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &evt_data);
        break;

    case NFA_DM_RF_DISC_ACTIVATED_EVT:
        if (nfa_dm_cb.disc_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A)
        {
            /* store SEL_RES response */
            nfa_dm_cb.disc_cb.activated_sel_res = p_data->activate.rf_tech_param.param.pa.sel_rsp;
        }

        if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_ACTIVE)
        {
            /* Set data callback to receive raw frame */
            NFC_SetStaticRfCback (nfa_dm_act_data_cback);

            memset (&(evt_data.activated.params), 0x00, sizeof (tNFA_TAG_PARAMS));
            memcpy (&(evt_data.activated.activate_ntf), &(p_data->activate), sizeof (tNFC_ACTIVATE_DEVT));

            nfa_dm_conn_cback_event_notify (NFA_ACTIVATED_EVT, &evt_data);
        }
        else
        {
            /* holding activation notification until sub-module is ready */
            nfa_dm_cb.p_activate_ntf = (UINT8*) GKI_getbuf (sizeof (tNFC_ACTIVATE_DEVT));

            if (nfa_dm_cb.p_activate_ntf)
            {
                memcpy (nfa_dm_cb.p_activate_ntf,
                        &(p_data->activate),
                        sizeof (tNFC_ACTIVATE_DEVT));

                if (  (nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T1T)
                    ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T2T)
                    ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T3T)
                    ||(  (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_ISO_DEP)
                       &&(nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_ISO_DEP) )
                    ||(nfa_dm_cb.disc_cb.activated_protocol  == NFA_PROTOCOL_ISO15693) )
                {
                    /* Notify NFA tag sub-system */
                    nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data, FALSE);
                }
                else /* if NFC-DEP, ISO-DEP with frame interface or others */
                {
                    /* Set data callback to receive raw frame */
                    NFC_SetStaticRfCback (nfa_dm_act_data_cback);
                    nfa_dm_notify_activation_status (NFA_STATUS_OK, NULL);
                }
            }
            else
            {
                /* deactivate and restart RF discovery */
                nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
            }
        }
        break;

    case NFA_DM_RF_DISC_DEACTIVATED_EVT:

        /* clear stored NFCID/UID */
        nfa_dm_cb.activated_nfcid_len = 0;

        if (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_NFC_DEP)
        {
            /* Notify NFA RW sub-systems */
            nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, FALSE);
        }

        /* if deactivated as sleep mode */
        if (  (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP)
            ||(p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)  )
        {
            evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP;
        }
        else
        {
            evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
        }

        /* notify deactivation to upper layer */
        nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);

        /* clean up SEL_RES response */
        nfa_dm_cb.disc_cb.activated_sel_res = 0;
        break;

    case NFA_DM_RF_DISC_CMD_IDLE_CMPL_EVT:
        /* DH initiated deactivation in NFA_DM_RFST_W4_HOST_SELECT */
        /* No need to notify NFA RW sub-systems                    */

        evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
        /* notify deactivation to application */
        nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
        break;

    default:
        NFA_TRACE_ERROR0 ("Unexpected event");
        break;
    }
}

/*******************************************************************************
**
** Function         nfa_dm_poll_disc_cback
**
** Description      Processing event from discovery callback
**
** Returns          None
**
*******************************************************************************/
static void nfa_dm_poll_disc_cback (tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER *p_data)
{
    tNFA_CONN_EVT_DATA evt_data;

    NFA_TRACE_DEBUG1 ("nfa_dm_poll_disc_cback (): event:0x%02X", event);

    switch (event)
    {
    case NFA_DM_RF_DISC_START_EVT:
        break;

    case NFA_DM_RF_DISC_ACTIVATED_EVT:

        if (nfa_dm_cb.disc_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A)
        {
            /* store SEL_RES response */
            nfa_dm_cb.disc_cb.activated_sel_res = p_data->activate.rf_tech_param.param.pa.sel_rsp;
        }

        /* holding activation notification until sub-module is ready */
        nfa_dm_cb.p_activate_ntf = (UINT8*) GKI_getbuf (sizeof (tNFC_ACTIVATE_DEVT));

        if (nfa_dm_cb.p_activate_ntf)
        {
            memcpy (nfa_dm_cb.p_activate_ntf,
                    &(p_data->activate),
                    sizeof (tNFC_ACTIVATE_DEVT));

            if (  (nfa_dm_cb.disc_cb.activated_protocol     == NFC_PROTOCOL_NFC_DEP)
                &&(nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_NFC_DEP)  )
            {
                /* activate LLCP */
                nfa_p2p_activate_llcp (p_data);
            }
            else if (  (nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T1T)
                     ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T2T)
                     ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T3T)
                     ||(  (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_ISO_DEP)
                        &&(nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_ISO_DEP)  )
                     ||(nfa_dm_cb.disc_cb.activated_protocol  == NFA_PROTOCOL_ISO15693)  )
            {
                /* Notify NFA tag sub-system */
                nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data, TRUE);
            }
            else /* if NFC-DEP/ISO-DEP with frame interface */
            {
                /* Set data callback to receive raw frame */
                NFC_SetStaticRfCback (nfa_dm_act_data_cback);
                nfa_dm_notify_activation_status (NFA_STATUS_OK, NULL);
            }
        }
        else
        {
            /* deactivate and restart RF discovery */
            nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
        }
        break;

    case NFA_DM_RF_DISC_DEACTIVATED_EVT:

        /* clear stored NFCID/UID */
        nfa_dm_cb.activated_nfcid_len = 0;

        if (  (nfa_dm_cb.disc_cb.activated_protocol     == NFC_PROTOCOL_NFC_DEP)
            &&(nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_NFC_DEP)  )
        {
            /*
            ** If LLCP link is not deactivated yet,
            ** LLCP will receive deactivation ntf through data callback.
            ** NFA P2P will receive callback event from LLCP.
            */
        }
        else
        {
            /* Notify NFA RW sub-systems */
            nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, TRUE);
        }

        /* if NFA sent NFA_ACTIVATED_EVT earlier */
        if (nfa_dm_cb.flags & NFA_DM_FLAGS_SEND_DEACTIVATED_EVT)
        {
            nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SEND_DEACTIVATED_EVT;

            /* if deactivated as sleep mode */
            if (  (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP)
                ||(p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)  )
            {
                evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP;
            }
            else
            {
                evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
            }
            /* notify deactivation to application */
            nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
        }

        /* clean up SEL_RES response */
        nfa_dm_cb.disc_cb.activated_sel_res = 0;

        if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED))
        {
            /* deregister discovery callback from NFA DM Discovery */
            nfa_dm_delete_rf_discover (nfa_dm_cb.poll_disc_handle);
            nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID;

            /* this is for disable polling */
            if (nfa_dm_cb.flags & NFA_DM_FLAGS_SEND_POLL_STOP_EVT)
            {
                nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SEND_POLL_STOP_EVT;

                evt_data.status = NFA_STATUS_OK;
                nfa_dm_conn_cback_event_notify (NFA_POLL_DISABLED_EVT, &evt_data);
            }
        }

        break;

    case NFA_DM_RF_DISC_CMD_IDLE_CMPL_EVT:
        /* DH initiated deactivation in NFA_DM_RFST_W4_HOST_SELECT */
        /* No need to notify NFA RW sub-systems                    */

        /* clear stored NFCID/UID */
        nfa_dm_cb.activated_nfcid_len = 0;
        /* clean up SEL_RES response */
        nfa_dm_cb.disc_cb.activated_sel_res = 0;

        evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
        /* notify deactivation to application */
        nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);

        if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_POLLING_ENABLED))
        {
            /* deregister discovery callback from NFA DM Discovery */
            nfa_dm_delete_rf_discover (nfa_dm_cb.poll_disc_handle);
            nfa_dm_cb.poll_disc_handle = NFA_HANDLE_INVALID;

            /* this is for disable polling */
            if (nfa_dm_cb.flags & NFA_DM_FLAGS_SEND_POLL_STOP_EVT)
            {
                nfa_dm_cb.flags &= ~NFA_DM_FLAGS_SEND_POLL_STOP_EVT;

                evt_data.status = NFA_STATUS_OK;
                nfa_dm_conn_cback_event_notify (NFA_POLL_DISABLED_EVT, &evt_data);
            }
        }
        break;
    }
}

/*******************************************************************************
**
** Function         nfa_dm_notify_activation_status
**
** Description      Processing activation status from sub-modules
**
** Returns          None
**
*******************************************************************************/
void nfa_dm_notify_activation_status (tNFA_STATUS status, tNFA_TAG_PARAMS *p_params)
{
    tNFA_CONN_EVT_DATA  evt_data;
    tNFC_RF_TECH_PARAMS *p_tech_params;
    UINT8               *p_nfcid = NULL, nfcid_len;

    NFA_TRACE_DEBUG1 ("nfa_dm_notify_activation_status (): status:0x%X", status);

    if (!nfa_dm_cb.p_activate_ntf)
    {
        /* this is for NFA P2P listen */
        return;
    }

    if (status == NFA_STATUS_OK)
    {
        /* notify NFC link activation */
        memcpy ( &(evt_data.activated.activate_ntf),
                 nfa_dm_cb.p_activate_ntf,
                 sizeof (tNFC_ACTIVATE_DEVT));

        p_tech_params = &evt_data.activated.activate_ntf.rf_tech_param;

        if (p_params)
        {
            memcpy (&(evt_data.activated.params),
                    p_params,
                    sizeof (tNFA_TAG_PARAMS));
        }

        /* get length of NFCID and location */
        if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_A)
        {
            nfcid_len = p_tech_params->param.pa.nfcid1_len;
            p_nfcid   = p_tech_params->param.pa.nfcid1;
        }
        else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_B)
        {
            nfcid_len = NFC_NFCID0_MAX_LEN;
            p_nfcid   = p_tech_params->param.pb.nfcid0;
        }
        else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_F)
        {
            nfcid_len = NFC_NFCID2_LEN;
            p_nfcid   = p_tech_params->param.pf.nfcid2;
        }
        else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_ISO15693)
        {
            nfcid_len = NFC_ISO15693_UID_LEN;
            p_nfcid   = p_tech_params->param.pi93.uid;
        }
        else
        {
            nfcid_len = 0;
        }

        /*
        ** If not in exlusive RF mode, and
        **      P2P activation, then push default NDEF message through SNEP
        **      TAG activation, then read NDEF message
        */
        if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_NFC_DEP)
        {
            /*
            ** Default NDEF message will be put to NFC Forum defualt SNEP server
            ** after receiving NFA_LLCP_ACTIVATED_EVT.
            */
        }
        /* Do not perform NDEF operations on KOVIO */
        else if (p_tech_params->mode == NFC_DISCOVERY_TYPE_POLL_KOVIO)
        {
            NFA_TRACE_DEBUG1 ("Not an NFC-Forum tag, bypassing NDEF detection", nfa_dm_cb.disc_cb.activated_protocol);
        }
        else if (!(nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE))
        {
            /*
            ** if the same tag is activated then do not perform auto NDEF detection.
            ** Application may put a tag into sleep mode and reactivate the same tag.
            */

            if (  (p_tech_params->mode != nfa_dm_cb.disc_cb.activated_tech_mode)
                ||(nfcid_len != nfa_dm_cb.activated_nfcid_len)
                ||(memcmp (p_nfcid, nfa_dm_cb.activated_nfcid, nfcid_len)))
            {
                if (  (nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T1T)
                    ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T2T)
                    ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T3T)
                    ||(  (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_ISO_DEP)
                       &&(nfa_dm_cb.disc_cb.activated_rf_interface == NFC_INTERFACE_ISO_DEP)  )
                    ||(nfa_dm_cb.disc_cb.activated_protocol  == NFA_PROTOCOL_ISO15693)  )
                {
                    if (p_nfa_dm_cfg->auto_detect_ndef)
                    {
                        if (p_nfa_dm_cfg->auto_read_ndef)
                        {
                            nfa_dm_cb.flags |= NFA_DM_FLAGS_AUTO_READING_NDEF;
                        }
                        NFA_RwDetectNDef ();
                    }
                    else if (p_nfa_dm_cfg->auto_read_ndef)
                    {
                        NFA_RwReadNDef ();
                    }
                }
            }
        }

        /* store activated tag information */
        nfa_dm_cb.activated_nfcid_len = nfcid_len;
        if (nfcid_len)
            memcpy (nfa_dm_cb.activated_nfcid, p_nfcid, nfcid_len);

        nfa_dm_cb.flags |= NFA_DM_FLAGS_SEND_DEACTIVATED_EVT;
        nfa_dm_conn_cback_event_notify (NFA_ACTIVATED_EVT, &evt_data);
    }
    else
    {
        /* if NFC_DEP, NFA P2P will deactivate */
        if (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_NFC_DEP)
        {
            nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
        }
    }

    GKI_freebuf (nfa_dm_cb.p_activate_ntf);
    nfa_dm_cb.p_activate_ntf = NULL;
}

#if (BT_TRACE_VERBOSE == TRUE)
/*******************************************************************************
**
** Function         nfa_dm_nfc_revt_2_str
**
** Description      convert nfc revt to string
**
*******************************************************************************/
char *nfa_dm_nfc_revt_2_str (tNFC_RESPONSE_EVT event)
{
    switch (event) {
    case NFC_ENABLE_REVT:
        return "NFC_ENABLE_REVT";

    case NFC_DISABLE_REVT:
        return "NFC_DISABLE_REVT";

    case NFC_SET_CONFIG_REVT:
        return "NFC_SET_CONFIG_REVT";

    case NFC_GET_CONFIG_REVT:
        return "NFC_GET_CONFIG_REVT";

    case NFC_NFCEE_DISCOVER_REVT:
        return "NFC_NFCEE_DISCOVER_REVT";

    case NFC_NFCEE_INFO_REVT:
        return "NFC_NFCEE_INFO_REVT";

    case NFC_NFCEE_MODE_SET_REVT:
        return "NFC_NFCEE_MODE_SET_REVT";

    case NFC_RF_FIELD_REVT:
        return "NFC_RF_FIELD_REVT";

    case NFC_EE_ACTION_REVT:
        return "NFC_EE_ACTION_REVT";

    case NFC_EE_DISCOVER_REQ_REVT:
        return "NFC_EE_DISCOVER_REQ_REVT";

    case NFC_SET_ROUTING_REVT:
        return "NFC_SET_ROUTING_REVT";

    case NFC_GET_ROUTING_REVT:
        return "NFC_GET_ROUTING_REVT";

    case NFC_GEN_ERROR_REVT:
        return "NFC_GEN_ERROR_REVT";

    case NFC_NFCC_RESTART_REVT:
        return "NFC_NFCC_RESTART_REVT";

    case NFC_NFCC_TIMEOUT_REVT:
        return "NFC_NFCC_TIMEOUT_REVT";

    case NFC_NFCC_TRANSPORT_ERR_REVT:
        return "NFC_NFCC_TRANSPORT_ERR_REVT";

    case NFC_NFCC_POWER_OFF_REVT:
        return "NFC_NFCC_POWER_OFF_REVT";

    default:
        return "unknown revt";
        break;
    }
}
#endif /* BT_VERBOSE */
