Home | History | Annotate | Download | only in rw
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-2014 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 
     20 /******************************************************************************
     21  *
     22  *  This file contains the action functions the NFA_RW state machine.
     23  *
     24  ******************************************************************************/
     25 #include <string.h>
     26 #include "nfa_rw_int.h"
     27 #include "nfa_dm_int.h"
     28 #include "nfa_sys_int.h"
     29 #include "nfa_mem_co.h"
     30 #include "ndef_utils.h"
     31 #include "rw_api.h"
     32 
     33 #define NFA_RW_OPTION_INVALID   0xFF
     34 
     35 /* Local static function prototypes */
     36 static tNFC_STATUS nfa_rw_start_ndef_read(void);
     37 static tNFC_STATUS nfa_rw_start_ndef_write(void);
     38 static tNFC_STATUS nfa_rw_start_ndef_detection(void);
     39 static tNFC_STATUS nfa_rw_config_tag_ro(BOOLEAN b_hard_lock);
     40 static BOOLEAN     nfa_rw_op_req_while_busy(tNFA_RW_MSG *p_data);
     41 static void        nfa_rw_error_cleanup (UINT8 event);
     42 static void        nfa_rw_presence_check (tNFA_RW_MSG *p_data);
     43 static void        nfa_rw_handle_t2t_evt (tRW_EVENT event, tRW_DATA *p_rw_data);
     44 static BOOLEAN     nfa_rw_detect_ndef(tNFA_RW_MSG *p_data);
     45 static void        nfa_rw_cback (tRW_EVENT event, tRW_DATA *p_rw_data);
     46 
     47 /*******************************************************************************
     48 **
     49 ** Function         nfa_rw_free_ndef_rx_buf
     50 **
     51 ** Description      Free buffer allocated to hold incoming NDEF message
     52 **
     53 ** Returns          Nothing
     54 **
     55 *******************************************************************************/
     56 void nfa_rw_free_ndef_rx_buf(void)
     57 {
     58     if (nfa_rw_cb.p_ndef_buf)
     59     {
     60         nfa_mem_co_free(nfa_rw_cb.p_ndef_buf);
     61         nfa_rw_cb.p_ndef_buf = NULL;
     62     }
     63 }
     64 
     65 /*******************************************************************************
     66 **
     67 ** Function         nfa_rw_store_ndef_rx_buf
     68 **
     69 ** Description      Store data into NDEF buffer
     70 **
     71 ** Returns          Nothing
     72 **
     73 *******************************************************************************/
     74 static void nfa_rw_store_ndef_rx_buf (tRW_DATA *p_rw_data)
     75 {
     76     UINT8      *p;
     77 
     78     p = (UINT8 *)(p_rw_data->data.p_data + 1) + p_rw_data->data.p_data->offset;
     79 
     80     /* Save data into buffer */
     81     memcpy(&nfa_rw_cb.p_ndef_buf[nfa_rw_cb.ndef_rd_offset], p, p_rw_data->data.p_data->len);
     82     nfa_rw_cb.ndef_rd_offset += p_rw_data->data.p_data->len;
     83 
     84     GKI_freebuf(p_rw_data->data.p_data);
     85     p_rw_data->data.p_data = NULL;
     86 }
     87 
     88 /*******************************************************************************
     89 **
     90 ** Function         nfa_rw_send_data_to_upper
     91 **
     92 ** Description      Send data to upper layer
     93 **
     94 ** Returns          Nothing
     95 **
     96 *******************************************************************************/
     97 static void nfa_rw_send_data_to_upper (tRW_DATA *p_rw_data)
     98 {
     99     tNFA_CONN_EVT_DATA conn_evt_data;
    100 
    101     if (  (p_rw_data->status == NFC_STATUS_TIMEOUT)
    102         ||(p_rw_data->data.p_data == NULL) )
    103         return;
    104 
    105 #if (BT_TRACE_VERBOSE == TRUE)
    106         NFA_TRACE_DEBUG2 ("nfa_rw_send_data_to_upper: Len [0x%X] Status [%s]", p_rw_data->data.p_data->len, NFC_GetStatusName (p_rw_data->data.status));
    107 #else
    108         NFA_TRACE_DEBUG2 ("nfa_rw_send_data_to_upper: Len [0x%X] Status [0x%X]", p_rw_data->data.p_data->len, p_rw_data->data.status);
    109 #endif
    110 
    111     /* Notify conn cback of NFA_DATA_EVT */
    112     conn_evt_data.data.status = p_rw_data->data.status;
    113     conn_evt_data.data.p_data = (UINT8 *)(p_rw_data->data.p_data + 1) + p_rw_data->data.p_data->offset;
    114     conn_evt_data.data.len    = p_rw_data->data.p_data->len;
    115 
    116     nfa_dm_act_conn_cback_notify(NFA_DATA_EVT, &conn_evt_data);
    117 
    118     GKI_freebuf(p_rw_data->data.p_data);
    119     p_rw_data->data.p_data = NULL;
    120 }
    121 
    122 /*******************************************************************************
    123 **
    124 ** Function         nfa_rw_error_cleanup
    125 **
    126 ** Description      Handle failure - signal command complete and notify app
    127 **
    128 ** Returns          Nothing
    129 **
    130 *******************************************************************************/
    131 static void nfa_rw_error_cleanup (UINT8 event)
    132 {
    133     tNFA_CONN_EVT_DATA conn_evt_data;
    134 
    135     nfa_rw_command_complete();
    136 
    137     conn_evt_data.status = NFA_STATUS_FAILED;
    138 
    139     nfa_dm_act_conn_cback_notify (event, &conn_evt_data);
    140 }
    141 
    142 /*******************************************************************************
    143 **
    144 ** Function         nfa_rw_check_start_presence_check_timer
    145 **
    146 ** Description      Start timer to wait for specified time before presence check
    147 **
    148 ** Returns          Nothing
    149 **
    150 *******************************************************************************/
    151 static void nfa_rw_check_start_presence_check_timer (UINT16 presence_check_start_delay)
    152 {
    153     if (!p_nfa_dm_cfg->auto_presence_check)
    154         return;
    155 
    156     if (nfa_rw_cb.flags & NFA_RW_FL_NOT_EXCL_RF_MODE)
    157     {
    158         if (presence_check_start_delay)
    159         {
    160             NFA_TRACE_DEBUG0("Starting presence check timer...");
    161             nfa_sys_start_timer(&nfa_rw_cb.tle, NFA_RW_PRESENCE_CHECK_TICK_EVT, presence_check_start_delay);
    162         }
    163         else
    164         {
    165             /* Presence check now */
    166             nfa_rw_presence_check (NULL);
    167         }
    168     }
    169 }
    170 
    171 /*******************************************************************************
    172 **
    173 ** Function         nfa_rw_stop_presence_check_timer
    174 **
    175 ** Description      Stop timer for presence check
    176 **
    177 ** Returns          Nothing
    178 **
    179 *******************************************************************************/
    180 void nfa_rw_stop_presence_check_timer(void)
    181 {
    182     nfa_sys_stop_timer(&nfa_rw_cb.tle);
    183     NFA_TRACE_DEBUG0("Stopped presence check timer (if started)");
    184 }
    185 
    186 /*******************************************************************************
    187 **
    188 ** Function         nfa_rw_handle_ndef_detect
    189 **
    190 ** Description      Handler for NDEF detection reader/writer event
    191 **
    192 ** Returns          Nothing
    193 **
    194 *******************************************************************************/
    195 static void nfa_rw_handle_ndef_detect(tRW_EVENT event, tRW_DATA *p_rw_data)
    196 {
    197     tNFA_CONN_EVT_DATA conn_evt_data;
    198 
    199     NFA_TRACE_DEBUG3("NDEF Detection completed: cur_size=%i, max_size=%i, flags=0x%x",
    200         p_rw_data->ndef.cur_size, p_rw_data->ndef.max_size, p_rw_data->ndef.flags);
    201 
    202     /* Check if NDEF detection succeeded */
    203     if (p_rw_data->ndef.status == NFC_STATUS_OK)
    204     {
    205         /* Set NDEF detection state */
    206         nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_TRUE;
    207         nfa_rw_cb.flags  |= NFA_RW_FL_NDEF_OK;
    208 
    209         /* Store ndef properties */
    210         conn_evt_data.ndef_detect.status = NFA_STATUS_OK;
    211         conn_evt_data.ndef_detect.protocol = p_rw_data->ndef.protocol;
    212         conn_evt_data.ndef_detect.cur_size = nfa_rw_cb.ndef_cur_size = p_rw_data->ndef.cur_size;
    213         conn_evt_data.ndef_detect.max_size = nfa_rw_cb.ndef_max_size = p_rw_data->ndef.max_size;
    214         conn_evt_data.ndef_detect.flags    = p_rw_data->ndef.flags;
    215 
    216         if (p_rw_data->ndef.flags & RW_NDEF_FL_READ_ONLY)
    217             nfa_rw_cb.flags |= NFA_RW_FL_TAG_IS_READONLY;
    218         else
    219             nfa_rw_cb.flags &= ~NFA_RW_FL_TAG_IS_READONLY;
    220 
    221         /* Determine what operation triggered the NDEF detection procedure */
    222         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
    223         {
    224             /* if ndef detection was done as part of ndef-read operation, then perform ndef read now */
    225             if ((conn_evt_data.status = nfa_rw_start_ndef_read()) != NFA_STATUS_OK)
    226             {
    227                 /* Failed to start NDEF Read */
    228 
    229                 /* Command complete - perform cleanup, notify app */
    230                 nfa_rw_command_complete();
    231                 nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
    232             }
    233         }
    234         else if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
    235         {
    236             /* if ndef detection was done as part of ndef-write operation, then perform ndef write now */
    237             if ((conn_evt_data.status = nfa_rw_start_ndef_write()) != NFA_STATUS_OK)
    238             {
    239                 /* Failed to start NDEF Write.  */
    240 
    241                 /* Command complete - perform cleanup, notify app */
    242                 nfa_rw_command_complete();
    243                 nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
    244             }
    245         }
    246         else
    247         {
    248             /* current op was stand-alone NFA_DetectNDef. Command complete - perform cleanup and notify app */
    249             nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
    250             nfa_rw_command_complete();
    251 
    252             nfa_dm_act_conn_cback_notify(NFA_NDEF_DETECT_EVT, &conn_evt_data);
    253         }
    254     }
    255     else
    256     {
    257         /* NDEF detection failed... */
    258 
    259         /* Command complete - perform cleanup, notify app */
    260         nfa_rw_command_complete();
    261         nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_FALSE;
    262         conn_evt_data.status = p_rw_data->ndef.status;
    263 
    264         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
    265         {
    266             /* if ndef detection was done as part of ndef-read operation, then notify NDEF handlers of failure */
    267             nfa_dm_ndef_handle_message(NFA_STATUS_FAILED, NULL, 0);
    268 
    269             /* Notify app of read status */
    270             nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
    271         }
    272         else if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
    273         {
    274             /* if ndef detection was done as part of ndef-write operation, then notify app of failure */
    275             nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
    276         }
    277         else if (nfa_rw_cb.cur_op == NFA_RW_OP_DETECT_NDEF)
    278         {
    279             conn_evt_data.ndef_detect.protocol = p_rw_data->ndef.protocol;
    280             /* current op was stand-alone NFA_DetectNDef. Notify app of failure */
    281             if (p_rw_data->ndef.status == NFC_STATUS_TIMEOUT)
    282             {
    283                 /* Tag could have moved away */
    284                 conn_evt_data.ndef_detect.cur_size = 0;
    285                 conn_evt_data.ndef_detect.max_size = 0;
    286                 conn_evt_data.ndef_detect.flags    = RW_NDEF_FL_UNKNOWN;
    287                 conn_evt_data.ndef_detect.status   = NFA_STATUS_TIMEOUT;
    288             }
    289             else
    290             {
    291                 /* NDEF Detection failed for other reasons */
    292                 conn_evt_data.ndef_detect.cur_size = nfa_rw_cb.ndef_cur_size = p_rw_data->ndef.cur_size;
    293                 conn_evt_data.ndef_detect.max_size = nfa_rw_cb.ndef_max_size = p_rw_data->ndef.max_size;
    294                 conn_evt_data.ndef_detect.flags    = p_rw_data->ndef.flags;
    295             }
    296             nfa_dm_act_conn_cback_notify(NFA_NDEF_DETECT_EVT, &conn_evt_data);
    297         }
    298 
    299         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
    300     }
    301 }
    302 
    303 /*******************************************************************************
    304 **
    305 ** Function         nfa_rw_handle_tlv_detect
    306 **
    307 ** Description      Handler for TLV detection reader/writer event
    308 **
    309 ** Returns          Nothing
    310 **
    311 *******************************************************************************/
    312 static void nfa_rw_handle_tlv_detect(tRW_EVENT event, tRW_DATA *p_rw_data)
    313 {
    314     tNFA_CONN_EVT_DATA conn_evt_data;
    315 
    316     /* Set TLV detection state */
    317     if (nfa_rw_cb.cur_op == NFA_RW_OP_SET_TAG_RO)
    318     {
    319         if(nfa_rw_cb.tlv_st == NFA_RW_TLV_DETECT_ST_OP_NOT_STARTED)
    320         {
    321             nfa_rw_cb.tlv_st = NFA_RW_TLV_DETECT_ST_LOCK_TLV_OP_COMPLETE;
    322         }
    323         else
    324         {
    325             nfa_rw_cb.tlv_st = NFA_RW_TLV_DETECT_ST_COMPLETE;
    326         }
    327     }
    328     else
    329     {
    330         if(nfa_rw_cb.cur_op == NFA_RW_OP_DETECT_LOCK_TLV)
    331         {
    332             nfa_rw_cb.tlv_st |= NFA_RW_TLV_DETECT_ST_LOCK_TLV_OP_COMPLETE;
    333         }
    334         else if(nfa_rw_cb.cur_op == NFA_RW_OP_DETECT_MEM_TLV)
    335         {
    336             nfa_rw_cb.tlv_st |= NFA_RW_TLV_DETECT_ST_MEM_TLV_OP_COMPLETE;
    337         }
    338     }
    339 
    340     /* Check if TLV detection succeeded */
    341     if (p_rw_data->tlv.status == NFC_STATUS_OK)
    342     {
    343         NFA_TRACE_DEBUG1("TLV Detection succeeded: num_bytes=%i",p_rw_data->tlv.num_bytes);
    344 
    345         /* Store tlv properties */
    346         conn_evt_data.tlv_detect.status     = NFA_STATUS_OK;
    347         conn_evt_data.tlv_detect.protocol   = p_rw_data->tlv.protocol;
    348         conn_evt_data.tlv_detect.num_bytes  = p_rw_data->tlv.num_bytes;
    349 
    350 
    351         /* Determine what operation triggered the TLV detection procedure */
    352         if(nfa_rw_cb.cur_op == NFA_RW_OP_SET_TAG_RO)
    353         {
    354             if (nfa_rw_config_tag_ro(nfa_rw_cb.b_hard_lock) != NFC_STATUS_OK)
    355             {
    356                 /* Failed to set tag read only */
    357                 conn_evt_data.tlv_detect.status = NFA_STATUS_FAILED;
    358                 nfa_dm_act_conn_cback_notify(NFA_SET_TAG_RO_EVT, &conn_evt_data);
    359             }
    360         }
    361         else
    362         {
    363             /* current op was stand-alone NFA_DetectTlv. Command complete - perform cleanup and notify app */
    364             nfa_rw_command_complete();
    365             nfa_dm_act_conn_cback_notify(NFA_TLV_DETECT_EVT, &conn_evt_data);
    366         }
    367     }
    368 
    369     /* Handle failures */
    370     if (p_rw_data->tlv.status != NFC_STATUS_OK)
    371     {
    372         /* Command complete - perform cleanup, notify the app */
    373         nfa_rw_command_complete();
    374 
    375         conn_evt_data.tlv_detect.status = NFA_STATUS_FAILED;
    376         if(  (nfa_rw_cb.cur_op == NFA_RW_OP_DETECT_LOCK_TLV)
    377            ||(nfa_rw_cb.cur_op == NFA_RW_OP_DETECT_MEM_TLV) )
    378         {
    379             nfa_dm_act_conn_cback_notify(NFA_TLV_DETECT_EVT, &conn_evt_data);
    380         }
    381         else if(nfa_rw_cb.cur_op == NFA_RW_OP_SET_TAG_RO)
    382         {
    383             if (nfa_rw_config_tag_ro(nfa_rw_cb.b_hard_lock) != NFC_STATUS_OK)
    384             {
    385                 /* Failed to set tag read only */
    386                 conn_evt_data.tlv_detect.status = NFA_STATUS_FAILED;
    387                 nfa_dm_act_conn_cback_notify(NFA_SET_TAG_RO_EVT, &conn_evt_data);
    388             }
    389         }
    390     }
    391 }
    392 
    393 /*******************************************************************************
    394 **
    395 ** Function         nfa_rw_handle_sleep_wakeup_rsp
    396 **
    397 ** Description      Handl sleep wakeup
    398 **
    399 ** Returns          Nothing
    400 **
    401 *******************************************************************************/
    402 void nfa_rw_handle_sleep_wakeup_rsp (tNFC_STATUS status)
    403 {
    404     tNFC_ACTIVATE_DEVT activate_params;
    405     tRW_EVENT event;
    406 
    407     if (  (nfa_rw_cb.halt_event != RW_T2T_MAX_EVT)
    408         &&(nfa_rw_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A)
    409                 &&(nfa_rw_cb.protocol == NFC_PROTOCOL_T2T)
    410                 &&(nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)  )
    411             {
    412         NFA_TRACE_DEBUG0("nfa_rw_handle_sleep_wakeup_rsp; Attempt to wake up Type 2 tag from HALT State is complete");
    413         if (status == NFC_STATUS_OK)
    414         {
    415             /* Type 2 Tag is wakeup from HALT state */
    416             NFA_TRACE_DEBUG0("nfa_rw_handle_sleep_wakeup_rsp; Handle the NACK rsp received now");
    417             /* Initialize control block */
    418             activate_params.protocol                        = nfa_rw_cb.protocol;
    419             activate_params.rf_tech_param.param.pa.sel_rsp  = nfa_rw_cb.pa_sel_res;
    420             activate_params.rf_tech_param.mode              = nfa_rw_cb.activated_tech_mode;
    421 
    422                 /* Initialize RW module */
    423                 if ((RW_SetActivatedTagType (&activate_params, nfa_rw_cback)) != NFC_STATUS_OK)
    424                 {
    425                     /* Log error (stay in NFA_RW_ST_ACTIVATED state until deactivation) */
    426                     NFA_TRACE_ERROR0("RW_SetActivatedTagType failed.");
    427                     if (nfa_rw_cb.halt_event == RW_T2T_READ_CPLT_EVT)
    428                     {
    429                         if (nfa_rw_cb.rw_data.data.p_data)
    430                             GKI_freebuf(nfa_rw_cb.rw_data.data.p_data);
    431                         nfa_rw_cb.rw_data.data.p_data = NULL;
    432                     }
    433                 /* Do not try to detect NDEF again but just notify current operation failed */
    434                 nfa_rw_cb.halt_event = RW_T2T_MAX_EVT;
    435             }
    436         }
    437 
    438         /* The current operation failed with NACK rsp from type 2 tag */
    439                 nfa_rw_cb.rw_data.status = NFC_STATUS_FAILED;
    440                 event = nfa_rw_cb.halt_event;
    441 
    442         /* Got NACK rsp during presence check and legacy presence check performed */
    443                 if (nfa_rw_cb.cur_op == NFA_RW_OP_PRESENCE_CHECK)
    444                     nfa_rw_cb.rw_data.status = status;
    445 
    446         /* If cannot Sleep wakeup tag, then NDEF Detect operation is complete */
    447         if ((status != NFC_STATUS_OK) && (nfa_rw_cb.halt_event == RW_T2T_NDEF_DETECT_EVT))
    448                     nfa_rw_cb.halt_event = RW_T2T_MAX_EVT;
    449 
    450                 nfa_rw_handle_t2t_evt (event, &nfa_rw_cb.rw_data);
    451         nfa_rw_cb.halt_event = RW_T2T_MAX_EVT;
    452 
    453         /* If Type 2 tag sleep wakeup failed and If in normal mode (not-exclusive RF mode) then deactivate the link if sleep wakeup failed */
    454         if ((nfa_rw_cb.flags & NFA_RW_FL_NOT_EXCL_RF_MODE) && (status != NFC_STATUS_OK))
    455         {
    456             NFA_TRACE_DEBUG0("Sleep wakeup failed. Deactivating...");
    457             nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
    458         }
    459     }
    460     else
    461     {
    462         NFA_TRACE_DEBUG0("nfa_rw_handle_sleep_wakeup_rsp; Legacy presence check performed");
    463         /* Legacy presence check performed */
    464         nfa_rw_handle_presence_check_rsp (status);
    465     }
    466 }
    467 
    468 /*******************************************************************************
    469 **
    470 ** Function         nfa_rw_handle_presence_check_rsp
    471 **
    472 ** Description      Handler RW_T#t_PRESENCE_CHECK_EVT
    473 **
    474 ** Returns          Nothing
    475 **
    476 *******************************************************************************/
    477 void nfa_rw_handle_presence_check_rsp (tNFC_STATUS status)
    478 {
    479     BT_HDR *p_pending_msg;
    480 
    481     /* Stop the presence check timer - timer may have been started when presence check started */
    482     nfa_rw_stop_presence_check_timer();
    483     if (status == NFA_STATUS_OK)
    484     {
    485         /* Clear the BUSY flag and restart the presence-check timer */
    486         nfa_rw_command_complete();
    487     }
    488     else
    489     {
    490         /* If presence check failed just clear the BUSY flag */
    491         nfa_rw_cb.flags &= ~NFA_RW_FL_API_BUSY;
    492     }
    493 
    494     /* Handle presence check due to auto-presence-check  */
    495     if (nfa_rw_cb.flags & NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY)
    496     {
    497         nfa_rw_cb.flags &= ~NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY;
    498 
    499         /* If an API was called during auto-presence-check, then handle it now */
    500         if (nfa_rw_cb.p_pending_msg)
    501         {
    502             /* If NFA_RwPresenceCheck was called during auto-presence-check, notify app of result */
    503             if (nfa_rw_cb.p_pending_msg->op_req.op == NFA_RW_OP_PRESENCE_CHECK)
    504             {
    505                 /* Notify app of presence check status */
    506                 nfa_dm_act_conn_cback_notify(NFA_PRESENCE_CHECK_EVT, (tNFA_CONN_EVT_DATA *)&status);
    507                 GKI_freebuf(nfa_rw_cb.p_pending_msg);
    508                 nfa_rw_cb.p_pending_msg = NULL;
    509             }
    510             /* For all other APIs called during auto-presence check, perform the command now (if tag is still present) */
    511             else if (status == NFC_STATUS_OK)
    512             {
    513                 NFA_TRACE_DEBUG0("Performing deferred operation after presence check...");
    514                 p_pending_msg = (BT_HDR *)nfa_rw_cb.p_pending_msg;
    515                 nfa_rw_cb.p_pending_msg = NULL;
    516                 nfa_rw_handle_event(p_pending_msg);
    517                 GKI_freebuf (p_pending_msg);
    518             }
    519             else
    520             {
    521                 /* Tag no longer present. Free command for pending API command */
    522                 GKI_freebuf(nfa_rw_cb.p_pending_msg);
    523                 nfa_rw_cb.p_pending_msg = NULL;
    524             }
    525         }
    526 
    527         /* Auto-presence check failed. Deactivate */
    528         if (status != NFC_STATUS_OK)
    529         {
    530             NFA_TRACE_DEBUG0("Auto presence check failed. Deactivating...");
    531             nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
    532         }
    533     }
    534     /* Handle presence check due to NFA_RwPresenceCheck API call */
    535     else
    536     {
    537         /* Notify app of presence check status */
    538         nfa_dm_act_conn_cback_notify(NFA_PRESENCE_CHECK_EVT, (tNFA_CONN_EVT_DATA *)&status);
    539 
    540         /* If in normal mode (not-exclusive RF mode) then deactivate the link if presence check failed */
    541         if ((nfa_rw_cb.flags & NFA_RW_FL_NOT_EXCL_RF_MODE) && (status != NFC_STATUS_OK))
    542         {
    543             NFA_TRACE_DEBUG0("Presence check failed. Deactivating...");
    544             nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
    545         }
    546     }
    547 }
    548 
    549 /*******************************************************************************
    550 **
    551 ** Function         nfa_rw_handle_t1t_evt
    552 **
    553 ** Description      Handler for Type-1 tag reader/writer events
    554 **
    555 ** Returns          Nothing
    556 **
    557 *******************************************************************************/
    558 static void nfa_rw_handle_t1t_evt (tRW_EVENT event, tRW_DATA *p_rw_data)
    559 {
    560     tNFA_CONN_EVT_DATA conn_evt_data;
    561     tNFA_TAG_PARAMS tag_params;
    562     UINT8 *p_rid_rsp;
    563     tNFA_STATUS activation_status;
    564 
    565     conn_evt_data.status = p_rw_data->data.status;
    566     switch (event)
    567     {
    568     case RW_T1T_RID_EVT:
    569         if (p_rw_data->data.p_data != NULL)
    570         {
    571             /* Assume the data is just the response byte sequence */
    572             p_rid_rsp = (UINT8 *)(p_rw_data->data.p_data + 1) + p_rw_data->data.p_data->offset;
    573             /* Fetch HR from RID response message */
    574             STREAM_TO_ARRAY (tag_params.t1t.hr, p_rid_rsp, T1T_HR_LEN);
    575             /* Fetch UID0-3 from RID response message */
    576             STREAM_TO_ARRAY (tag_params.t1t.uid, p_rid_rsp, T1T_CMD_UID_LEN);
    577             GKI_freebuf (p_rw_data->data.p_data);
    578             p_rw_data->data.p_data = NULL;
    579         }
    580 
    581         /* Command complete - perform cleanup, notify the app */
    582         nfa_rw_command_complete();
    583 
    584         if (p_rw_data->status == NFC_STATUS_TIMEOUT)
    585         {
    586             activation_status = NFA_STATUS_TIMEOUT;
    587         }
    588         else
    589         {
    590             activation_status = NFA_STATUS_OK;
    591         }
    592 
    593         nfa_dm_notify_activation_status (activation_status, &tag_params);
    594         break;
    595 
    596     case RW_T1T_RALL_CPLT_EVT:
    597     case RW_T1T_READ_CPLT_EVT:
    598     case RW_T1T_RSEG_CPLT_EVT:
    599     case RW_T1T_READ8_CPLT_EVT:
    600         nfa_rw_send_data_to_upper (p_rw_data);
    601 
    602         /* Command complete - perform cleanup, notify the app */
    603         nfa_rw_command_complete();
    604         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
    605         break;
    606 
    607     case RW_T1T_WRITE_E_CPLT_EVT:
    608     case RW_T1T_WRITE_NE_CPLT_EVT:
    609     case RW_T1T_WRITE_E8_CPLT_EVT:
    610     case RW_T1T_WRITE_NE8_CPLT_EVT:
    611         nfa_rw_send_data_to_upper (p_rw_data);
    612 
    613         /* Command complete - perform cleanup, notify the app */
    614         nfa_rw_command_complete();
    615         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
    616         break;
    617 
    618     case RW_T1T_TLV_DETECT_EVT:
    619         nfa_rw_handle_tlv_detect(event, p_rw_data);
    620         break;
    621 
    622     case RW_T1T_NDEF_DETECT_EVT:
    623         nfa_rw_cb.tlv_st = NFA_RW_TLV_DETECT_ST_COMPLETE;
    624 
    625         if (  (p_rw_data->status != NFC_STATUS_OK)
    626             &&(nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
    627             &&(p_rw_data->ndef.flags & NFA_RW_NDEF_FL_FORMATABLE) && (!(p_rw_data->ndef.flags & NFA_RW_NDEF_FL_FORMATED)) && (p_rw_data->ndef.flags & NFA_RW_NDEF_FL_SUPPORTED)  )
    628         {
    629             /* Tag is in Initialized state, Format the tag first and then Write NDEF */
    630             if (RW_T1tFormatNDef() == NFC_STATUS_OK)
    631                 break;
    632         }
    633 
    634         nfa_rw_handle_ndef_detect(event, p_rw_data);
    635 
    636         break;
    637 
    638     case RW_T1T_NDEF_READ_EVT:
    639         nfa_rw_cb.tlv_st = NFA_RW_TLV_DETECT_ST_COMPLETE;
    640         if (p_rw_data->status == NFC_STATUS_OK)
    641         {
    642             /* Process the ndef record */
    643             nfa_dm_ndef_handle_message(NFA_STATUS_OK, nfa_rw_cb.p_ndef_buf, nfa_rw_cb.ndef_cur_size);
    644         }
    645         else
    646         {
    647             /* Notify app of failure */
    648             if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
    649             {
    650                 /* If current operation is READ_NDEF, then notify ndef handlers of failure */
    651                 nfa_dm_ndef_handle_message(NFA_STATUS_FAILED, NULL, 0);
    652             }
    653         }
    654 
    655         /* Command complete - perform cleanup, notify the app */
    656         nfa_rw_command_complete();
    657         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
    658 
    659         /* Free ndef buffer */
    660         nfa_rw_free_ndef_rx_buf();
    661         break;
    662 
    663     case RW_T1T_NDEF_WRITE_EVT:
    664         if (p_rw_data->data.status != NFA_STATUS_OK)
    665             nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
    666         nfa_rw_cb.tlv_st = NFA_RW_TLV_DETECT_ST_COMPLETE;
    667 
    668 
    669         /* Command complete - perform cleanup, notify the app */
    670         nfa_rw_command_complete();
    671 
    672         /* Notify app */
    673         conn_evt_data.status = (p_rw_data->data.status == NFC_STATUS_OK) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
    674         if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
    675         {
    676             /* Update local cursize of ndef message */
    677             nfa_rw_cb.ndef_cur_size = nfa_rw_cb.ndef_wr_len;
    678         }
    679 
    680         /* Notify app of ndef write complete status */
    681         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
    682         break;
    683 
    684     case RW_T1T_SET_TAG_RO_EVT:
    685         /* Command complete - perform cleanup, notify the app */
    686         nfa_rw_command_complete();
    687         nfa_dm_act_conn_cback_notify(NFA_SET_TAG_RO_EVT, &conn_evt_data);
    688         break;
    689 
    690     case RW_T1T_RAW_FRAME_EVT:
    691         nfa_rw_send_data_to_upper (p_rw_data);
    692         /* Command complete - perform cleanup */
    693         nfa_rw_command_complete();
    694         break;
    695 
    696     case RW_T1T_PRESENCE_CHECK_EVT:             /* Presence check completed */
    697         nfa_rw_handle_presence_check_rsp(p_rw_data->status);
    698         break;
    699 
    700     case RW_T1T_FORMAT_CPLT_EVT:
    701 
    702         if (p_rw_data->data.status == NFA_STATUS_OK)
    703             nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
    704 
    705         if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
    706         {
    707             /* if format operation was done as part of ndef-write operation, now start NDEF Write */
    708             if (  (p_rw_data->data.status != NFA_STATUS_OK)
    709                 ||((conn_evt_data.status = RW_T1tDetectNDef ()) != NFC_STATUS_OK)  )
    710             {
    711                 /* Command complete - perform cleanup, notify app */
    712                 nfa_rw_command_complete();
    713                 nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_FALSE;
    714 
    715 
    716                 /* if format operation failed or ndef detection did not start, then notify app of ndef-write operation failure */
    717                 conn_evt_data.status = NFA_STATUS_FAILED;
    718                 nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
    719             }
    720         }
    721         else
    722         {
    723             /* Command complete - perform cleanup, notify the app */
    724             nfa_rw_command_complete();
    725             nfa_dm_act_conn_cback_notify(NFA_FORMAT_CPLT_EVT, &conn_evt_data);
    726         }
    727         break;
    728 
    729     case RW_T1T_INTF_ERROR_EVT:
    730         nfa_dm_act_conn_cback_notify(NFA_RW_INTF_ERROR_EVT, &conn_evt_data);
    731         break;
    732     }
    733 }
    734 
    735 /*******************************************************************************
    736 **
    737 ** Function         nfa_rw_handle_t2t_evt
    738 **
    739 ** Description      Handler for Type-2 tag reader/writer events
    740 **
    741 ** Returns          Nothing
    742 **
    743 *******************************************************************************/
    744 static void nfa_rw_handle_t2t_evt (tRW_EVENT event, tRW_DATA *p_rw_data)
    745 {
    746     tNFA_CONN_EVT_DATA conn_evt_data;
    747 
    748     conn_evt_data.status = p_rw_data->status;
    749 
    750     if (p_rw_data->status == NFC_STATUS_REJECTED)
    751     {
    752         NFA_TRACE_DEBUG0("nfa_rw_handle_t2t_evt(); Waking the tag first before handling the response!");
    753         /* Received NACK. Let DM wakeup the tag first (by putting tag to sleep and then waking it up) */
    754         if ((p_rw_data->status = nfa_dm_disc_sleep_wakeup ()) == NFC_STATUS_OK)
    755         {
    756             nfa_rw_cb.halt_event    = event;
    757             memcpy (&nfa_rw_cb.rw_data, p_rw_data, sizeof (tRW_DATA));
    758             return;
    759         }
    760     }
    761 
    762     switch (event)
    763     {
    764     case RW_T2T_READ_CPLT_EVT:              /* Read completed          */
    765         nfa_rw_send_data_to_upper (p_rw_data);
    766         /* Command complete - perform cleanup, notify the app */
    767         nfa_rw_command_complete();
    768         nfa_dm_act_conn_cback_notify (NFA_READ_CPLT_EVT, &conn_evt_data);
    769         break;
    770 
    771     case RW_T2T_WRITE_CPLT_EVT:             /* Write completed         */
    772         /* Command complete - perform cleanup, notify the app */
    773         nfa_rw_command_complete();
    774         nfa_dm_act_conn_cback_notify (NFA_WRITE_CPLT_EVT, &conn_evt_data);
    775         break;
    776 
    777     case RW_T2T_SELECT_CPLT_EVT:            /* Sector select completed */
    778         /* Command complete - perform cleanup, notify the app */
    779         nfa_rw_command_complete();
    780         nfa_dm_act_conn_cback_notify (NFA_SELECT_CPLT_EVT, &conn_evt_data);
    781         break;
    782 
    783     case RW_T2T_NDEF_DETECT_EVT:            /* NDEF detection complete */
    784         if (  (p_rw_data->status == NFC_STATUS_OK)
    785             ||((p_rw_data->status == NFC_STATUS_FAILED) && ((p_rw_data->ndef.flags == NFA_RW_NDEF_FL_UNKNOWN) || (nfa_rw_cb.halt_event == RW_T2T_MAX_EVT)))
    786             ||(nfa_rw_cb.skip_dyn_locks == TRUE)  )
    787         {
    788             /* NDEF Detection is complete */
    789             nfa_rw_cb.skip_dyn_locks = FALSE;
    790             nfa_rw_handle_ndef_detect (event, p_rw_data);
    791         }
    792         else
    793         {
    794             /* Try to detect NDEF again, this time without reading dynamic lock bytes */
    795             nfa_rw_cb.skip_dyn_locks = TRUE;
    796             nfa_rw_detect_ndef (NULL);
    797         }
    798         break;
    799 
    800     case RW_T2T_TLV_DETECT_EVT:             /* Lock control/Mem/Prop tlv detection complete */
    801         nfa_rw_handle_tlv_detect(event, p_rw_data);
    802         break;
    803 
    804     case RW_T2T_NDEF_READ_EVT:              /* NDEF read completed     */
    805         if (p_rw_data->status == NFC_STATUS_OK)
    806         {
    807             /* Process the ndef record */
    808             nfa_dm_ndef_handle_message(NFA_STATUS_OK, nfa_rw_cb.p_ndef_buf, nfa_rw_cb.ndef_cur_size);
    809         }
    810         else
    811         {
    812             /* Notify app of failure */
    813             if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
    814             {
    815                 /* If current operation is READ_NDEF, then notify ndef handlers of failure */
    816                 nfa_dm_ndef_handle_message(NFA_STATUS_FAILED, NULL, 0);
    817             }
    818         }
    819 
    820         /* Notify app of read status */
    821         conn_evt_data.status = p_rw_data->status;
    822         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
    823         /* Free ndef buffer */
    824         nfa_rw_free_ndef_rx_buf();
    825 
    826         /* Command complete - perform cleanup */
    827         nfa_rw_command_complete();
    828         break;
    829 
    830     case RW_T2T_NDEF_WRITE_EVT:             /* NDEF write complete     */
    831 
    832         /* Command complete - perform cleanup, notify the app */
    833         nfa_rw_command_complete();
    834 
    835         /* Notify app */
    836         conn_evt_data.status = (p_rw_data->data.status == NFC_STATUS_OK) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
    837         if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
    838         {
    839             /* Update local cursize of ndef message */
    840             nfa_rw_cb.ndef_cur_size = nfa_rw_cb.ndef_wr_len;
    841         }
    842 
    843         /* Notify app of ndef write complete status */
    844         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
    845 
    846         break;
    847 
    848     case RW_T2T_SET_TAG_RO_EVT:
    849         /* Command complete - perform cleanup, notify the app */
    850         nfa_rw_command_complete();
    851         nfa_dm_act_conn_cback_notify(NFA_SET_TAG_RO_EVT, &conn_evt_data);
    852         break;
    853 
    854     case RW_T2T_RAW_FRAME_EVT:
    855         nfa_rw_send_data_to_upper (p_rw_data);
    856         /* Command complete - perform cleanup */
    857         if (p_rw_data->status != NFC_STATUS_CONTINUE)
    858         {
    859             nfa_rw_command_complete();
    860         }
    861         break;
    862 
    863     case RW_T2T_PRESENCE_CHECK_EVT:             /* Presence check completed */
    864         nfa_rw_handle_presence_check_rsp(p_rw_data->status);
    865         break;
    866 
    867     case RW_T2T_FORMAT_CPLT_EVT:
    868         if (p_rw_data->data.status == NFA_STATUS_OK)
    869             nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
    870 
    871         /* Command complete - perform cleanup, notify the app */
    872         nfa_rw_command_complete();
    873         nfa_dm_act_conn_cback_notify(NFA_FORMAT_CPLT_EVT, &conn_evt_data);
    874         break;
    875 
    876     case RW_T2T_INTF_ERROR_EVT:
    877         nfa_dm_act_conn_cback_notify(NFA_RW_INTF_ERROR_EVT, &conn_evt_data);
    878         break;
    879     }
    880 }
    881 
    882 /*******************************************************************************
    883 **
    884 ** Function         nfa_rw_handle_t3t_evt
    885 **
    886 ** Description      Handler for Type-3 tag reader/writer events
    887 **
    888 ** Returns          Nothing
    889 **
    890 *******************************************************************************/
    891 static void nfa_rw_handle_t3t_evt (tRW_EVENT event, tRW_DATA *p_rw_data)
    892 {
    893     tNFA_CONN_EVT_DATA conn_evt_data;
    894     tNFA_TAG_PARAMS tag_params;
    895 
    896     switch (event)
    897     {
    898     case RW_T3T_NDEF_DETECT_EVT:            /* NDEF detection complete */
    899         nfa_rw_handle_ndef_detect(event, p_rw_data);
    900         break;
    901 
    902     case RW_T3T_UPDATE_CPLT_EVT:        /* Write completed */
    903         /* Command complete - perform cleanup, notify the app */
    904         nfa_rw_command_complete();
    905 
    906         /* Notify app */
    907         conn_evt_data.status = (p_rw_data->data.status == NFC_STATUS_OK) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
    908         if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
    909         {
    910             /* Update local cursize of ndef message */
    911             nfa_rw_cb.ndef_cur_size = nfa_rw_cb.ndef_wr_len;
    912         }
    913 
    914         /* Notify app of ndef write complete status */
    915         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
    916 
    917         break;
    918 
    919     case RW_T3T_CHECK_CPLT_EVT:         /* Read completed */
    920         if (p_rw_data->status == NFC_STATUS_OK)
    921         {
    922             /* Process the ndef record */
    923             nfa_dm_ndef_handle_message(NFA_STATUS_OK, nfa_rw_cb.p_ndef_buf, nfa_rw_cb.ndef_cur_size);
    924         }
    925         else
    926         {
    927             /* Notify app of failure */
    928             if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
    929             {
    930                 /* If current operation is READ_NDEF, then notify ndef handlers of failure */
    931                 nfa_dm_ndef_handle_message(NFA_STATUS_FAILED, NULL, 0);
    932             }
    933         }
    934 
    935         /* Free ndef buffer */
    936         nfa_rw_free_ndef_rx_buf();
    937 
    938         /* Command complete - perform cleanup, notify the app */
    939         nfa_rw_command_complete();
    940         conn_evt_data.status = p_rw_data->status;
    941         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
    942         break;
    943 
    944     case RW_T3T_CHECK_EVT:                  /* Segment of data received from type 3 tag */
    945         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
    946         {
    947             nfa_rw_store_ndef_rx_buf (p_rw_data);
    948         }
    949         else
    950         {
    951             nfa_rw_send_data_to_upper (p_rw_data);
    952         }
    953         break;
    954 
    955     case RW_T3T_RAW_FRAME_EVT:              /* SendRawFrame response */
    956         nfa_rw_send_data_to_upper (p_rw_data);
    957 
    958         if (p_rw_data->status != NFC_STATUS_CONTINUE)
    959         {
    960             /* Command complete - perform cleanup */
    961             nfa_rw_command_complete();
    962         }
    963         break;
    964 
    965     case RW_T3T_PRESENCE_CHECK_EVT:             /* Presence check completed */
    966         nfa_rw_handle_presence_check_rsp(p_rw_data->status);
    967         break;
    968 
    969     case RW_T3T_GET_SYSTEM_CODES_EVT:           /* Presence check completed */
    970         /* Command complete - perform cleanup */
    971         nfa_rw_command_complete();
    972 
    973         /* System codes retrieved - notify app of ACTIVATION */
    974         if (p_rw_data->status == NFC_STATUS_OK)
    975         {
    976             tag_params.t3t.num_system_codes = p_rw_data->t3t_sc.num_system_codes;
    977             tag_params.t3t.p_system_codes = p_rw_data->t3t_sc.p_system_codes;
    978         }
    979         else
    980         {
    981             tag_params.t3t.num_system_codes = 0;
    982             tag_params.t3t.p_system_codes = NULL;
    983         }
    984 
    985         nfa_dm_notify_activation_status(NFA_STATUS_OK, &tag_params);
    986         break;
    987 
    988     case RW_T3T_FORMAT_CPLT_EVT:        /* Format completed */
    989         /* Command complete - perform cleanup, notify the app */
    990         nfa_rw_command_complete();
    991 
    992         /* Notify app */
    993         conn_evt_data.status = (p_rw_data->data.status == NFC_STATUS_OK) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
    994 
    995         /* Notify app of ndef write complete status */
    996         nfa_dm_act_conn_cback_notify(NFA_FORMAT_CPLT_EVT, &conn_evt_data);
    997         break;
    998 
    999 
   1000     case RW_T3T_INTF_ERROR_EVT:
   1001         conn_evt_data.status = p_rw_data->status;
   1002         nfa_dm_act_conn_cback_notify(NFA_RW_INTF_ERROR_EVT, &conn_evt_data);
   1003         break;
   1004 
   1005     case RW_T3T_SET_READ_ONLY_CPLT_EVT:
   1006         /* Command complete - perform cleanup, notify the app */
   1007         nfa_rw_command_complete();
   1008 
   1009         conn_evt_data.status = p_rw_data->status;
   1010         nfa_dm_act_conn_cback_notify(NFA_SET_TAG_RO_EVT, &conn_evt_data);
   1011         break;
   1012 
   1013     default:
   1014         NFA_TRACE_DEBUG1("nfa_rw_handle_t3t_evt(); Unhandled RW event 0x%X", event);
   1015         break;
   1016     }
   1017 }
   1018 
   1019 
   1020 /*******************************************************************************
   1021 **
   1022 ** Function         nfa_rw_handle_t4t_evt
   1023 **
   1024 ** Description      Handler for Type-4 tag reader/writer events
   1025 **
   1026 ** Returns          Nothing
   1027 **
   1028 *******************************************************************************/
   1029 static void nfa_rw_handle_t4t_evt (tRW_EVENT event, tRW_DATA *p_rw_data)
   1030 {
   1031     tNFA_CONN_EVT_DATA conn_evt_data;
   1032 
   1033     switch (event)
   1034     {
   1035     case RW_T4T_NDEF_DETECT_EVT :           /* Result of NDEF detection procedure */
   1036         nfa_rw_handle_ndef_detect(event, p_rw_data);
   1037         break;
   1038 
   1039     case RW_T4T_NDEF_FORMAT_CPLT_EVT:
   1040         /* Command complete - perform cleanup, notify the app */
   1041         nfa_rw_command_complete ();
   1042         nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
   1043         nfa_rw_cb.ndef_cur_size = p_rw_data->ndef.cur_size;
   1044         nfa_rw_cb.ndef_max_size = p_rw_data->ndef.max_size;
   1045         conn_evt_data.status = (p_rw_data->status == NFC_STATUS_OK) ? NFA_STATUS_OK : NFA_STATUS_FAILED;
   1046 
   1047         nfa_dm_act_conn_cback_notify (NFA_FORMAT_CPLT_EVT, &conn_evt_data);
   1048         break;
   1049 
   1050     case RW_T4T_NDEF_READ_EVT:              /* Segment of data received from type 4 tag */
   1051         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
   1052         {
   1053             nfa_rw_store_ndef_rx_buf (p_rw_data);
   1054         }
   1055         else
   1056         {
   1057             nfa_rw_send_data_to_upper (p_rw_data);
   1058         }
   1059         break;
   1060 
   1061     case RW_T4T_NDEF_READ_CPLT_EVT:         /* Read operation completed           */
   1062         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
   1063         {
   1064             nfa_rw_store_ndef_rx_buf (p_rw_data);
   1065 
   1066             /* Process the ndef record */
   1067             nfa_dm_ndef_handle_message (NFA_STATUS_OK, nfa_rw_cb.p_ndef_buf, nfa_rw_cb.ndef_cur_size);
   1068 
   1069             /* Free ndef buffer */
   1070             nfa_rw_free_ndef_rx_buf();
   1071         }
   1072         else
   1073         {
   1074             nfa_rw_send_data_to_upper (p_rw_data);
   1075         }
   1076 
   1077         /* Command complete - perform cleanup, notify the app */
   1078         nfa_rw_command_complete();
   1079         nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
   1080         conn_evt_data.status = NFC_STATUS_OK;
   1081         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
   1082         break;
   1083 
   1084     case RW_T4T_NDEF_READ_FAIL_EVT:         /* Read operation failed              */
   1085         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
   1086         {
   1087             /* If current operation is READ_NDEF, then notify ndef handlers of failure */
   1088             nfa_dm_ndef_handle_message(NFA_STATUS_FAILED, NULL, 0);
   1089 
   1090             /* Free ndef buffer */
   1091             nfa_rw_free_ndef_rx_buf();
   1092         }
   1093 
   1094         /* Command complete - perform cleanup, notify the app */
   1095         nfa_rw_command_complete();
   1096         nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
   1097         conn_evt_data.status = NFA_STATUS_FAILED;
   1098         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
   1099         break;
   1100 
   1101     case RW_T4T_NDEF_UPDATE_CPLT_EVT:       /* Update operation completed         */
   1102     case RW_T4T_NDEF_UPDATE_FAIL_EVT:       /* Update operation failed            */
   1103 
   1104         if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
   1105         {
   1106             /* Update local cursize of ndef message */
   1107             nfa_rw_cb.ndef_cur_size = nfa_rw_cb.ndef_wr_len;
   1108         }
   1109 
   1110         /* Notify app */
   1111         if (event == RW_T4T_NDEF_UPDATE_CPLT_EVT)
   1112             conn_evt_data.status = NFA_STATUS_OK;
   1113         else
   1114             conn_evt_data.status = NFA_STATUS_FAILED;
   1115 
   1116         /* Command complete - perform cleanup, notify the app */
   1117         nfa_rw_command_complete();
   1118         nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
   1119         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
   1120         break;
   1121 
   1122     case RW_T4T_RAW_FRAME_EVT:              /* Raw Frame data event         */
   1123         nfa_rw_send_data_to_upper (p_rw_data);
   1124 
   1125         if (p_rw_data->status != NFC_STATUS_CONTINUE)
   1126         {
   1127             /* Command complete - perform cleanup */
   1128             nfa_rw_command_complete();
   1129             nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
   1130         }
   1131         break;
   1132 
   1133     case RW_T4T_SET_TO_RO_EVT:              /* Tag is set as read only          */
   1134         conn_evt_data.status = p_rw_data->status;
   1135         nfa_dm_act_conn_cback_notify(NFA_SET_TAG_RO_EVT, &conn_evt_data);
   1136 
   1137         nfa_rw_command_complete();
   1138         nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
   1139         break;
   1140 
   1141     case RW_T4T_INTF_ERROR_EVT:             /* RF Interface error event         */
   1142         conn_evt_data.status = p_rw_data->status;
   1143         nfa_dm_act_conn_cback_notify(NFA_RW_INTF_ERROR_EVT, &conn_evt_data);
   1144 
   1145         nfa_rw_command_complete();
   1146         nfa_rw_cb.cur_op = NFA_RW_OP_MAX;
   1147         break;
   1148 
   1149     case RW_T4T_PRESENCE_CHECK_EVT:             /* Presence check completed */
   1150         nfa_rw_handle_presence_check_rsp(p_rw_data->status);
   1151         break;
   1152 
   1153     default:
   1154         NFA_TRACE_DEBUG1("nfa_rw_handle_t4t_evt(); Unhandled RW event 0x%X", event);
   1155         break;
   1156     }
   1157 }
   1158 
   1159 /*******************************************************************************
   1160 **
   1161 ** Function         nfa_rw_handle_i93_evt
   1162 **
   1163 ** Description      Handler for ISO 15693 tag reader/writer events
   1164 **
   1165 ** Returns          Nothing
   1166 **
   1167 *******************************************************************************/
   1168 static void nfa_rw_handle_i93_evt (tRW_EVENT event, tRW_DATA *p_rw_data)
   1169 {
   1170     tNFA_CONN_EVT_DATA conn_evt_data;
   1171     tNFA_TAG_PARAMS    i93_params;
   1172 
   1173     switch (event)
   1174     {
   1175     case RW_I93_NDEF_DETECT_EVT :           /* Result of NDEF detection procedure */
   1176         nfa_rw_handle_ndef_detect(event, p_rw_data);
   1177         break;
   1178 
   1179     case RW_I93_NDEF_READ_EVT:              /* Segment of data received from type 4 tag */
   1180         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
   1181         {
   1182             nfa_rw_store_ndef_rx_buf (p_rw_data);
   1183         }
   1184         else
   1185         {
   1186             nfa_rw_send_data_to_upper (p_rw_data);
   1187         }
   1188         break;
   1189 
   1190     case RW_I93_NDEF_READ_CPLT_EVT:         /* Read operation completed           */
   1191         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
   1192         {
   1193             nfa_rw_store_ndef_rx_buf (p_rw_data);
   1194 
   1195             /* Process the ndef record */
   1196             nfa_dm_ndef_handle_message (NFA_STATUS_OK, nfa_rw_cb.p_ndef_buf, nfa_rw_cb.ndef_cur_size);
   1197 
   1198             /* Free ndef buffer */
   1199             nfa_rw_free_ndef_rx_buf();
   1200         }
   1201         else
   1202         {
   1203             nfa_rw_send_data_to_upper (p_rw_data);
   1204         }
   1205 
   1206         /* Command complete - perform cleanup, notify app */
   1207         nfa_rw_command_complete();
   1208         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1209         conn_evt_data.status = NFC_STATUS_OK;
   1210         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
   1211         break;
   1212 
   1213     case RW_I93_NDEF_READ_FAIL_EVT:         /* Read operation failed              */
   1214         if (nfa_rw_cb.cur_op == NFA_RW_OP_READ_NDEF)
   1215         {
   1216             /* If current operation is READ_NDEF, then notify ndef handlers of failure */
   1217             nfa_dm_ndef_handle_message(NFA_STATUS_FAILED, NULL, 0);
   1218 
   1219             /* Free ndef buffer */
   1220             nfa_rw_free_ndef_rx_buf();
   1221         }
   1222 
   1223         /* Command complete - perform cleanup, notify app */
   1224         nfa_rw_command_complete();
   1225         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1226         conn_evt_data.status = NFA_STATUS_FAILED;
   1227         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
   1228         break;
   1229 
   1230     case RW_I93_NDEF_UPDATE_CPLT_EVT:       /* Update operation completed         */
   1231     case RW_I93_NDEF_UPDATE_FAIL_EVT:       /* Update operation failed            */
   1232 
   1233         if (nfa_rw_cb.cur_op == NFA_RW_OP_WRITE_NDEF)
   1234         {
   1235             /* Update local cursize of ndef message */
   1236             nfa_rw_cb.ndef_cur_size = nfa_rw_cb.ndef_wr_len;
   1237         }
   1238 
   1239         /* Command complete - perform cleanup, notify app */
   1240         nfa_rw_command_complete();
   1241         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1242 
   1243         if (event == RW_I93_NDEF_UPDATE_CPLT_EVT)
   1244             conn_evt_data.status = NFA_STATUS_OK;
   1245         else
   1246             conn_evt_data.status = NFA_STATUS_FAILED;
   1247 
   1248         /* Notify app of ndef write complete status */
   1249         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
   1250         break;
   1251 
   1252     case RW_I93_RAW_FRAME_EVT:              /* Raw Frame data event         */
   1253         nfa_rw_send_data_to_upper (p_rw_data);
   1254         if (p_rw_data->status != NFC_STATUS_CONTINUE)
   1255         {
   1256             /* Command complete - perform cleanup */
   1257             nfa_rw_command_complete();
   1258         }
   1259         break;
   1260 
   1261     case RW_I93_INTF_ERROR_EVT:             /* RF Interface error event         */
   1262         /* Command complete - perform cleanup, notify app */
   1263         nfa_rw_command_complete();
   1264 
   1265         if (nfa_rw_cb.flags & NFA_RW_FL_ACTIVATION_NTF_PENDING)
   1266         {
   1267             nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATION_NTF_PENDING;
   1268 
   1269             memset (&i93_params, 0x00, sizeof (tNFA_TAG_PARAMS));
   1270             memcpy (i93_params.i93.uid, nfa_rw_cb.i93_uid, I93_UID_BYTE_LEN);
   1271 
   1272             nfa_dm_notify_activation_status (NFA_STATUS_OK, &i93_params);
   1273         }
   1274         else
   1275         {
   1276             conn_evt_data.status = p_rw_data->status;
   1277             nfa_dm_act_conn_cback_notify(NFA_RW_INTF_ERROR_EVT, &conn_evt_data);
   1278         }
   1279 
   1280         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1281         break;
   1282 
   1283 
   1284     case RW_I93_PRESENCE_CHECK_EVT:             /* Presence check completed */
   1285         nfa_rw_handle_presence_check_rsp(p_rw_data->status);
   1286         break;
   1287 
   1288     case RW_I93_FORMAT_CPLT_EVT:                /* Format procedure complete          */
   1289         if (p_rw_data->data.status == NFA_STATUS_OK)
   1290             nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
   1291 
   1292         /* Command complete - perform cleanup, notify app */
   1293         nfa_rw_command_complete();
   1294         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1295         conn_evt_data.status = p_rw_data->status;
   1296         nfa_dm_act_conn_cback_notify(NFA_FORMAT_CPLT_EVT, &conn_evt_data);
   1297         break;
   1298 
   1299     case RW_I93_SET_TAG_RO_EVT:                 /* Set read-only procedure complete   */
   1300         nfa_rw_cb.flags |= NFA_RW_FL_TAG_IS_READONLY;
   1301 
   1302         /* Command complete - perform cleanup, notify app */
   1303         nfa_rw_command_complete();
   1304         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1305         conn_evt_data.status = p_rw_data->status;
   1306         nfa_dm_act_conn_cback_notify(NFA_SET_TAG_RO_EVT, &conn_evt_data);
   1307         break;
   1308 
   1309     case RW_I93_INVENTORY_EVT:                  /* Response of Inventory              */
   1310 
   1311         /* Command complete - perform cleanup, notify app */
   1312         nfa_rw_command_complete();
   1313 
   1314         conn_evt_data.i93_cmd_cplt.status       = p_rw_data->i93_inventory.status;
   1315         conn_evt_data.i93_cmd_cplt.sent_command = I93_CMD_INVENTORY;
   1316 
   1317         conn_evt_data.i93_cmd_cplt.params.inventory.dsfid = p_rw_data->i93_inventory.dsfid;
   1318         memcpy (conn_evt_data.i93_cmd_cplt.params.inventory.uid,
   1319                 p_rw_data->i93_inventory.uid,
   1320                 I93_UID_BYTE_LEN);
   1321 
   1322         nfa_dm_act_conn_cback_notify(NFA_I93_CMD_CPLT_EVT, &conn_evt_data);
   1323 
   1324         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1325         break;
   1326 
   1327     case RW_I93_DATA_EVT:                       /* Response of Read, Get Multi Security */
   1328 
   1329         /* Command complete - perform cleanup, notify app */
   1330         nfa_rw_command_complete();
   1331 
   1332         conn_evt_data.data.p_data = (UINT8 *)(p_rw_data->i93_data.p_data + 1) + p_rw_data->i93_data.p_data->offset;
   1333 
   1334         if (nfa_rw_cb.flags & NFA_RW_FL_ACTIVATION_NTF_PENDING)
   1335         {
   1336             nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATION_NTF_PENDING;
   1337 
   1338             i93_params.i93.info_flags = (I93_INFO_FLAG_DSFID|I93_INFO_FLAG_MEM_SIZE|I93_INFO_FLAG_AFI);
   1339             i93_params.i93.afi        = *(conn_evt_data.data.p_data + nfa_rw_cb.i93_afi_location % nfa_rw_cb.i93_block_size);
   1340             i93_params.i93.dsfid      = nfa_rw_cb.i93_dsfid;
   1341             i93_params.i93.block_size = nfa_rw_cb.i93_block_size;
   1342             i93_params.i93.num_block  = nfa_rw_cb.i93_num_block;
   1343             memcpy (i93_params.i93.uid, nfa_rw_cb.i93_uid, I93_UID_BYTE_LEN);
   1344 
   1345             nfa_dm_notify_activation_status (NFA_STATUS_OK, &i93_params);
   1346         }
   1347         else
   1348         {
   1349             conn_evt_data.data.len    = p_rw_data->i93_data.p_data->len;
   1350 
   1351             nfa_dm_act_conn_cback_notify(NFA_DATA_EVT, &conn_evt_data);
   1352         }
   1353 
   1354         GKI_freebuf(p_rw_data->i93_data.p_data);
   1355         p_rw_data->i93_data.p_data = NULL;
   1356 
   1357         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1358         break;
   1359 
   1360     case RW_I93_SYS_INFO_EVT:                   /* Response of System Information     */
   1361 
   1362         /* Command complete - perform cleanup, notify app */
   1363         nfa_rw_command_complete();
   1364 
   1365         if (nfa_rw_cb.flags & NFA_RW_FL_ACTIVATION_NTF_PENDING)
   1366         {
   1367             nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATION_NTF_PENDING;
   1368 
   1369             nfa_rw_cb.i93_block_size = p_rw_data->i93_sys_info.block_size;
   1370             nfa_rw_cb.i93_num_block  = p_rw_data->i93_sys_info.num_block;
   1371 
   1372             i93_params.i93.info_flags   = p_rw_data->i93_sys_info.info_flags;
   1373             i93_params.i93.dsfid        = p_rw_data->i93_sys_info.dsfid;
   1374             i93_params.i93.afi          = p_rw_data->i93_sys_info.afi;
   1375             i93_params.i93.num_block    = p_rw_data->i93_sys_info.num_block;
   1376             i93_params.i93.block_size   = p_rw_data->i93_sys_info.block_size;
   1377             i93_params.i93.IC_reference = p_rw_data->i93_sys_info.IC_reference;
   1378             memcpy (i93_params.i93.uid, p_rw_data->i93_sys_info.uid, I93_UID_BYTE_LEN);
   1379 
   1380             nfa_dm_notify_activation_status (NFA_STATUS_OK, &i93_params);
   1381         }
   1382         else
   1383         {
   1384             conn_evt_data.i93_cmd_cplt.status       = p_rw_data->i93_sys_info.status;
   1385             conn_evt_data.i93_cmd_cplt.sent_command = I93_CMD_GET_SYS_INFO;
   1386 
   1387             conn_evt_data.i93_cmd_cplt.params.sys_info.info_flags = p_rw_data->i93_sys_info.info_flags;
   1388             memcpy (conn_evt_data.i93_cmd_cplt.params.sys_info.uid,
   1389                     p_rw_data->i93_sys_info.uid,
   1390                     I93_UID_BYTE_LEN);
   1391             conn_evt_data.i93_cmd_cplt.params.sys_info.dsfid        = p_rw_data->i93_sys_info.dsfid;
   1392             conn_evt_data.i93_cmd_cplt.params.sys_info.afi          = p_rw_data->i93_sys_info.afi;
   1393             conn_evt_data.i93_cmd_cplt.params.sys_info.num_block    = p_rw_data->i93_sys_info.num_block;
   1394             conn_evt_data.i93_cmd_cplt.params.sys_info.block_size   = p_rw_data->i93_sys_info.block_size;
   1395             conn_evt_data.i93_cmd_cplt.params.sys_info.IC_reference = p_rw_data->i93_sys_info.IC_reference;
   1396 
   1397             /* store tag memory information for writing blocks */
   1398             nfa_rw_cb.i93_block_size = p_rw_data->i93_sys_info.block_size;
   1399             nfa_rw_cb.i93_num_block  = p_rw_data->i93_sys_info.num_block;
   1400 
   1401             nfa_dm_act_conn_cback_notify(NFA_I93_CMD_CPLT_EVT, &conn_evt_data);
   1402         }
   1403 
   1404         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1405         break;
   1406 
   1407     case RW_I93_CMD_CMPL_EVT:                   /* Command complete                   */
   1408         /* Command complete - perform cleanup, notify app */
   1409         nfa_rw_command_complete();
   1410 
   1411         if (nfa_rw_cb.flags & NFA_RW_FL_ACTIVATION_NTF_PENDING)
   1412         {
   1413             /* Reader got error code from tag */
   1414 
   1415             nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATION_NTF_PENDING;
   1416 
   1417             memset (&i93_params, 0x00, sizeof(i93_params));
   1418             memcpy (i93_params.i93.uid, nfa_rw_cb.i93_uid, I93_UID_BYTE_LEN);
   1419 
   1420             nfa_dm_notify_activation_status (NFA_STATUS_OK, &i93_params);
   1421         }
   1422         else
   1423         {
   1424             conn_evt_data.i93_cmd_cplt.status       = p_rw_data->i93_cmd_cmpl.status;
   1425             conn_evt_data.i93_cmd_cplt.sent_command = p_rw_data->i93_cmd_cmpl.command;
   1426 
   1427             if (conn_evt_data.i93_cmd_cplt.status != NFC_STATUS_OK)
   1428                 conn_evt_data.i93_cmd_cplt.params.error_code = p_rw_data->i93_cmd_cmpl.error_code;
   1429 
   1430             nfa_dm_act_conn_cback_notify(NFA_I93_CMD_CPLT_EVT, &conn_evt_data);
   1431         }
   1432 
   1433         nfa_rw_cb.cur_op = NFA_RW_OP_MAX; /* clear current operation */
   1434         break;
   1435 
   1436     default:
   1437         NFA_TRACE_DEBUG1("nfa_rw_handle_i93_evt(); Unhandled RW event 0x%X", event);
   1438         break;
   1439     }
   1440 }
   1441 
   1442 /*******************************************************************************
   1443 **
   1444 ** Function         nfa_rw_cback
   1445 **
   1446 ** Description      Callback for reader/writer event notification
   1447 **
   1448 ** Returns          Nothing
   1449 **
   1450 *******************************************************************************/
   1451 static void nfa_rw_cback (tRW_EVENT event, tRW_DATA *p_rw_data)
   1452 {
   1453     NFA_TRACE_DEBUG1("nfa_rw_cback: event=0x%02x", event);
   1454 
   1455     /* Call appropriate event handler for tag type */
   1456     if (event < RW_T1T_MAX_EVT)
   1457     {
   1458         /* Handle Type-1 tag events */
   1459         nfa_rw_handle_t1t_evt(event, p_rw_data);
   1460     }
   1461     else if (event < RW_T2T_MAX_EVT)
   1462     {
   1463         /* Handle Type-2 tag events */
   1464         nfa_rw_handle_t2t_evt(event, p_rw_data);
   1465     }
   1466     else if (event < RW_T3T_MAX_EVT)
   1467     {
   1468         /* Handle Type-3 tag events */
   1469         nfa_rw_handle_t3t_evt(event, p_rw_data);
   1470     }
   1471     else if (event < RW_T4T_MAX_EVT)
   1472     {
   1473         /* Handle Type-4 tag events */
   1474         nfa_rw_handle_t4t_evt(event, p_rw_data);
   1475     }
   1476     else if (event < RW_I93_MAX_EVT)
   1477     {
   1478         /* Handle ISO 15693 tag events */
   1479         nfa_rw_handle_i93_evt(event, p_rw_data);
   1480     }
   1481     else
   1482     {
   1483         NFA_TRACE_ERROR1("nfa_rw_cback: unhandled event=0x%02x", event);
   1484     }
   1485 }
   1486 
   1487 /*******************************************************************************
   1488 **
   1489 ** Function         nfa_rw_start_ndef_detection
   1490 **
   1491 ** Description      Start NDEF detection on activated tag
   1492 **
   1493 ** Returns          Nothing
   1494 **
   1495 *******************************************************************************/
   1496 static tNFC_STATUS nfa_rw_start_ndef_detection(void)
   1497 {
   1498     tNFC_PROTOCOL protocol = nfa_rw_cb.protocol;
   1499     tNFC_STATUS status = NFC_STATUS_FAILED;
   1500 
   1501     if (NFC_PROTOCOL_T1T == protocol)
   1502     {
   1503         /* Type1Tag    - NFC-A */
   1504         status = RW_T1tDetectNDef();
   1505     }
   1506     else if (NFC_PROTOCOL_T2T == protocol)
   1507     {
   1508         /* Type2Tag    - NFC-A */
   1509         if (nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)
   1510         {
   1511             status = RW_T2tDetectNDef(nfa_rw_cb.skip_dyn_locks);
   1512         }
   1513     }
   1514     else if (NFC_PROTOCOL_T3T == protocol)
   1515     {
   1516         /* Type3Tag    - NFC-F */
   1517         status = RW_T3tDetectNDef();
   1518     }
   1519     else if (NFC_PROTOCOL_ISO_DEP == protocol)
   1520     {
   1521         /* ISODEP/4A,4B- NFC-A or NFC-B */
   1522         status = RW_T4tDetectNDef();
   1523     }
   1524     else if (NFC_PROTOCOL_15693 == protocol)
   1525     {
   1526         /* ISO 15693 */
   1527         status = RW_I93DetectNDef();
   1528     }
   1529 
   1530     return(status);
   1531 }
   1532 
   1533 /*******************************************************************************
   1534 **
   1535 ** Function         nfa_rw_start_ndef_read
   1536 **
   1537 ** Description      Start NDEF read on activated tag
   1538 **
   1539 ** Returns          Nothing
   1540 **
   1541 *******************************************************************************/
   1542 static tNFC_STATUS nfa_rw_start_ndef_read(void)
   1543 {
   1544     tNFC_PROTOCOL protocol = nfa_rw_cb.protocol;
   1545     tNFC_STATUS status = NFC_STATUS_FAILED;
   1546     tNFA_CONN_EVT_DATA conn_evt_data;
   1547 
   1548     /* Handle zero length NDEF message */
   1549     if (nfa_rw_cb.ndef_cur_size == 0)
   1550     {
   1551         NFA_TRACE_DEBUG0("NDEF message is zero-length");
   1552 
   1553         /* Send zero-lengh NDEF message to ndef callback */
   1554         nfa_dm_ndef_handle_message(NFA_STATUS_OK, NULL, 0);
   1555 
   1556         /* Command complete - perform cleanup, notify app */
   1557         nfa_rw_command_complete();
   1558         conn_evt_data.status = NFA_STATUS_OK;
   1559         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
   1560         return NFC_STATUS_OK;
   1561     }
   1562 
   1563     /* Allocate buffer for incoming NDEF message (free previous NDEF rx buffer, if needed) */
   1564     nfa_rw_free_ndef_rx_buf ();
   1565     if ((nfa_rw_cb.p_ndef_buf = (UINT8 *)nfa_mem_co_alloc(nfa_rw_cb.ndef_cur_size)) == NULL)
   1566     {
   1567         NFA_TRACE_ERROR1("Unable to allocate a buffer for reading NDEF (size=%i)", nfa_rw_cb.ndef_cur_size);
   1568 
   1569         /* Command complete - perform cleanup, notify app */
   1570         nfa_rw_command_complete();
   1571         conn_evt_data.status = NFA_STATUS_FAILED;
   1572         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
   1573         return NFC_STATUS_FAILED;
   1574     }
   1575     nfa_rw_cb.ndef_rd_offset = 0;
   1576 
   1577     if (NFC_PROTOCOL_T1T == protocol)
   1578     {
   1579         /* Type1Tag    - NFC-A */
   1580         status = RW_T1tReadNDef(nfa_rw_cb.p_ndef_buf,(UINT16)nfa_rw_cb.ndef_cur_size);
   1581     }
   1582     else if (NFC_PROTOCOL_T2T == protocol)
   1583     {
   1584         /* Type2Tag    - NFC-A */
   1585         if (nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)
   1586         {
   1587             status = RW_T2tReadNDef(nfa_rw_cb.p_ndef_buf,(UINT16)nfa_rw_cb.ndef_cur_size);
   1588         }
   1589     }
   1590     else if (NFC_PROTOCOL_T3T == protocol)
   1591     {
   1592         /* Type3Tag    - NFC-F */
   1593         status = RW_T3tCheckNDef();
   1594     }
   1595     else if (NFC_PROTOCOL_ISO_DEP == protocol)
   1596     {
   1597         /* ISODEP/4A,4B- NFC-A or NFC-B */
   1598         status = RW_T4tReadNDef();
   1599     }
   1600     else if (NFC_PROTOCOL_15693 == protocol)
   1601     {
   1602         /* ISO 15693 */
   1603         status = RW_I93ReadNDef();
   1604     }
   1605 
   1606     return(status);
   1607 }
   1608 
   1609 /*******************************************************************************
   1610 **
   1611 ** Function         nfa_rw_detect_ndef
   1612 **
   1613 ** Description      Handler for NFA_RW_API_DETECT_NDEF_EVT
   1614 **
   1615 ** Returns          TRUE (message buffer to be freed by caller)
   1616 **
   1617 *******************************************************************************/
   1618 static BOOLEAN nfa_rw_detect_ndef(tNFA_RW_MSG *p_data)
   1619 {
   1620     tNFA_CONN_EVT_DATA conn_evt_data;
   1621     NFA_TRACE_DEBUG0("nfa_rw_detect_ndef");
   1622 
   1623     if ((conn_evt_data.ndef_detect.status = nfa_rw_start_ndef_detection()) != NFC_STATUS_OK)
   1624     {
   1625         /* Command complete - perform cleanup, notify app */
   1626         nfa_rw_command_complete();
   1627         conn_evt_data.ndef_detect.cur_size = 0;
   1628         conn_evt_data.ndef_detect.max_size = 0;
   1629         conn_evt_data.ndef_detect.flags    = RW_NDEF_FL_UNKNOWN;
   1630         nfa_dm_act_conn_cback_notify(NFA_NDEF_DETECT_EVT, &conn_evt_data);
   1631     }
   1632 
   1633     return TRUE;
   1634 }
   1635 
   1636 /*******************************************************************************
   1637 **
   1638 ** Function         nfa_rw_start_ndef_write
   1639 **
   1640 ** Description      Start NDEF write on activated tag
   1641 **
   1642 ** Returns          Nothing
   1643 **
   1644 *******************************************************************************/
   1645 static tNFC_STATUS nfa_rw_start_ndef_write(void)
   1646 {
   1647     tNFC_PROTOCOL protocol = nfa_rw_cb.protocol;
   1648     tNFC_STATUS status = NFC_STATUS_FAILED;
   1649 
   1650     if (nfa_rw_cb.flags & NFA_RW_FL_TAG_IS_READONLY)
   1651     {
   1652         /* error: ndef tag is read-only */
   1653         status = NFC_STATUS_FAILED;
   1654         NFA_TRACE_ERROR0("Unable to write NDEF. Tag is read-only")
   1655     }
   1656     else if (nfa_rw_cb.ndef_max_size < nfa_rw_cb.ndef_wr_len)
   1657     {
   1658         /* error: ndef tag size is too small */
   1659         status = NFC_STATUS_BUFFER_FULL;
   1660         NFA_TRACE_ERROR2("Unable to write NDEF. Tag maxsize=%i, request write size=%i", nfa_rw_cb.ndef_max_size, nfa_rw_cb.ndef_wr_len)
   1661     }
   1662     else
   1663     {
   1664         if (NFC_PROTOCOL_T1T == protocol)
   1665         {
   1666             /* Type1Tag    - NFC-A */
   1667             status = RW_T1tWriteNDef((UINT16)nfa_rw_cb.ndef_wr_len, nfa_rw_cb.p_ndef_wr_buf);
   1668         }
   1669         else if (NFC_PROTOCOL_T2T == protocol)
   1670         {
   1671             /* Type2Tag    - NFC-A */
   1672             if (nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)
   1673             {
   1674                 status = RW_T2tWriteNDef((UINT16)nfa_rw_cb.ndef_wr_len, nfa_rw_cb.p_ndef_wr_buf);
   1675             }
   1676         }
   1677         else if (NFC_PROTOCOL_T3T == protocol)
   1678         {
   1679             /* Type3Tag    - NFC-F */
   1680             status = RW_T3tUpdateNDef(nfa_rw_cb.ndef_wr_len, nfa_rw_cb.p_ndef_wr_buf);
   1681         }
   1682         else if (NFC_PROTOCOL_ISO_DEP == protocol)
   1683         {
   1684             /* ISODEP/4A,4B- NFC-A or NFC-B */
   1685             status = RW_T4tUpdateNDef((UINT16)nfa_rw_cb.ndef_wr_len, nfa_rw_cb.p_ndef_wr_buf);
   1686         }
   1687         else if (NFC_PROTOCOL_15693 == protocol)
   1688         {
   1689             /* ISO 15693 */
   1690             status = RW_I93UpdateNDef((UINT16)nfa_rw_cb.ndef_wr_len, nfa_rw_cb.p_ndef_wr_buf);
   1691         }
   1692     }
   1693 
   1694     return(status);
   1695 }
   1696 
   1697 /*******************************************************************************
   1698 **
   1699 ** Function         nfa_rw_read_ndef
   1700 **
   1701 ** Description      Handler for NFA_RW_API_READ_NDEF_EVT
   1702 **
   1703 ** Returns          TRUE (message buffer to be freed by caller)
   1704 **
   1705 *******************************************************************************/
   1706 static BOOLEAN nfa_rw_read_ndef(tNFA_RW_MSG *p_data)
   1707 {
   1708     tNFA_STATUS status = NFA_STATUS_OK;
   1709     tNFA_CONN_EVT_DATA conn_evt_data;
   1710 
   1711     NFA_TRACE_DEBUG0("nfa_rw_read_ndef");
   1712 
   1713     /* Check if ndef detection has been performed yet */
   1714     if (nfa_rw_cb.ndef_st == NFA_RW_NDEF_ST_UNKNOWN)
   1715     {
   1716         /* Perform ndef detection first */
   1717         status = nfa_rw_start_ndef_detection();
   1718     }
   1719     else if (nfa_rw_cb.ndef_st == NFA_RW_NDEF_ST_FALSE)
   1720     {
   1721         /* Tag is not NDEF */
   1722         status = NFA_STATUS_FAILED;
   1723     }
   1724     else
   1725     {
   1726         /* Perform the NDEF read operation */
   1727         status = nfa_rw_start_ndef_read();
   1728     }
   1729 
   1730     /* Handle failure */
   1731     if (status != NFA_STATUS_OK)
   1732     {
   1733         /* Command complete - perform cleanup, notify app */
   1734         nfa_rw_command_complete();
   1735         conn_evt_data.status = status;
   1736         nfa_dm_act_conn_cback_notify(NFA_READ_CPLT_EVT, &conn_evt_data);
   1737     }
   1738 
   1739 
   1740     return TRUE;
   1741 }
   1742 
   1743 /*******************************************************************************
   1744 **
   1745 ** Function         nfa_rw_write_ndef
   1746 **
   1747 ** Description      Handler for NFA_RW_API_WRITE_NDEF_EVT
   1748 **
   1749 ** Returns          TRUE (message buffer to be freed by caller)
   1750 **
   1751 *******************************************************************************/
   1752 static BOOLEAN nfa_rw_write_ndef(tNFA_RW_MSG *p_data)
   1753 {
   1754     tNDEF_STATUS ndef_status;
   1755     tNFA_STATUS write_status = NFA_STATUS_OK;
   1756     tNFA_CONN_EVT_DATA conn_evt_data;
   1757     NFA_TRACE_DEBUG0("nfa_rw_write_ndef");
   1758 
   1759     /* Validate NDEF message */
   1760     if ((ndef_status = NDEF_MsgValidate(p_data->op_req.params.write_ndef.p_data, p_data->op_req.params.write_ndef.len, FALSE)) != NDEF_OK)
   1761     {
   1762         NFA_TRACE_ERROR1("Invalid NDEF message. NDEF_MsgValidate returned %i", ndef_status);
   1763 
   1764         /* Command complete - perform cleanup, notify app */
   1765         nfa_rw_command_complete();
   1766         conn_evt_data.status = NFA_STATUS_FAILED;
   1767         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
   1768         return TRUE;
   1769     }
   1770 
   1771     /* Store pointer to source NDEF */
   1772     nfa_rw_cb.p_ndef_wr_buf = p_data->op_req.params.write_ndef.p_data;
   1773     nfa_rw_cb.ndef_wr_len = p_data->op_req.params.write_ndef.len;
   1774 
   1775     /* Check if ndef detection has been performed yet */
   1776     if (nfa_rw_cb.ndef_st == NFA_RW_NDEF_ST_UNKNOWN)
   1777     {
   1778         /* Perform ndef detection first */
   1779         write_status = nfa_rw_start_ndef_detection();
   1780     }
   1781     else if (nfa_rw_cb.ndef_st == NFA_RW_NDEF_ST_FALSE)
   1782     {
   1783         if (nfa_rw_cb.protocol == NFC_PROTOCOL_T1T)
   1784         {
   1785             /* For Type 1 tag, NDEF can be written on Initialized tag
   1786             *  Perform ndef detection first to check if tag is in Initialized state to Write NDEF */
   1787             write_status = nfa_rw_start_ndef_detection();
   1788         }
   1789         else
   1790         {
   1791             /* Tag is not NDEF */
   1792             write_status = NFA_STATUS_FAILED;
   1793         }
   1794     }
   1795     else
   1796     {
   1797         /* Perform the NDEF read operation */
   1798         write_status = nfa_rw_start_ndef_write();
   1799     }
   1800 
   1801     /* Handle failure */
   1802     if (write_status != NFA_STATUS_OK)
   1803     {
   1804         /* Command complete - perform cleanup, notify app */
   1805         nfa_rw_command_complete();
   1806         conn_evt_data.status = write_status;
   1807         nfa_dm_act_conn_cback_notify(NFA_WRITE_CPLT_EVT, &conn_evt_data);
   1808     }
   1809 
   1810     return TRUE;
   1811 }
   1812 
   1813 /*******************************************************************************
   1814 **
   1815 ** Function         nfa_rw_presence_check
   1816 **
   1817 ** Description      Handler for NFA_RW_API_PRESENCE_CHECK
   1818 **
   1819 ** Returns          Nothing
   1820 **
   1821 *******************************************************************************/
   1822 void nfa_rw_presence_check (tNFA_RW_MSG *p_data)
   1823 {
   1824     tNFC_PROTOCOL       protocol = nfa_rw_cb.protocol;
   1825     UINT8               sel_res  = nfa_rw_cb.pa_sel_res;
   1826     tNFC_STATUS         status   = NFC_STATUS_FAILED;
   1827     BOOLEAN             unsupported = FALSE;
   1828     UINT8               option = NFA_RW_OPTION_INVALID;
   1829     tNFA_RW_PRES_CHK_OPTION op_param = NFA_RW_PRES_CHK_DEFAULT;
   1830 
   1831     if (NFC_PROTOCOL_T1T == protocol)
   1832     {
   1833         /* Type1Tag    - NFC-A */
   1834         status = RW_T1tPresenceCheck();
   1835     }
   1836     else if (NFC_PROTOCOL_T2T == protocol)
   1837     {
   1838         /* If T2T NFC-Forum, then let RW handle presence check */
   1839         if (sel_res == NFC_SEL_RES_NFC_FORUM_T2T)
   1840         {
   1841             /* Type 2 tag have not sent NACK after activation */
   1842             status = RW_T2tPresenceCheck();
   1843         }
   1844         else
   1845         {
   1846             /* Will fall back to deactivate/reactivate */
   1847             unsupported = TRUE;
   1848         }
   1849     }
   1850     else if (NFC_PROTOCOL_T3T == protocol)
   1851     {
   1852         /* Type3Tag    - NFC-F */
   1853         status = RW_T3tPresenceCheck();
   1854     }
   1855     else if (NFC_PROTOCOL_ISO_DEP == protocol)
   1856     {
   1857         /* ISODEP/4A,4B- NFC-A or NFC-B */
   1858         if (p_data)
   1859         {
   1860             op_param    = p_data->op_req.params.option;
   1861         }
   1862 
   1863         switch (op_param)
   1864         {
   1865         case NFA_RW_PRES_CHK_I_BLOCK:
   1866             option = RW_T4T_CHK_EMPTY_I_BLOCK;
   1867             break;
   1868 
   1869         case NFA_RW_PRES_CHK_RESET:
   1870             /* option is initialized to NFA_RW_OPTION_INVALID, which will Deactivate to Sleep; Re-activate */
   1871             break;
   1872 
   1873         case NFA_RW_PRES_CHK_RB_CH0:
   1874             option = RW_T4T_CHK_READ_BINARY_CH0;
   1875             break;
   1876 
   1877         case NFA_RW_PRES_CHK_RB_CH3:
   1878             option = RW_T4T_CHK_READ_BINARY_CH3;
   1879             break;
   1880 
   1881         default:
   1882             if (nfa_rw_cb.flags & NFA_RW_FL_NDEF_OK)
   1883             {
   1884                 /* read binary on channel 0 */
   1885                 option = RW_T4T_CHK_READ_BINARY_CH0;
   1886             }
   1887             else
   1888             {
   1889                 /* NDEF DETECT failed.*/
   1890                 if ( nfa_dm_is_raw_frame_session())
   1891                 {
   1892                     /* NFA_SendRawFrame() is called */
   1893                     if (p_nfa_dm_cfg->presence_check_option & NFA_DM_PCO_EMPTY_I_BLOCK)
   1894                     {
   1895                         /* empty I block */
   1896                         option = RW_T4T_CHK_EMPTY_I_BLOCK;
   1897                     }
   1898                     else
   1899                     {
   1900                         /* read binary on channel 3 */
   1901                         option = RW_T4T_CHK_READ_BINARY_CH3;
   1902                     }
   1903                 }
   1904                 else if (!(p_nfa_dm_cfg->presence_check_option & NFA_DM_PCO_ISO_SLEEP_WAKE) && (nfa_rw_cb.intf_type == NFC_INTERFACE_ISO_DEP))
   1905                 {
   1906                     /* the option indicates to use empty I block && ISODEP interface is activated */
   1907                     option = RW_T4T_CHK_EMPTY_I_BLOCK;
   1908                 }
   1909             }
   1910         }
   1911 
   1912         if (option != NFA_RW_OPTION_INVALID)
   1913         {
   1914             /* use the presence check with the chosen option */
   1915             status = RW_T4tPresenceCheck (option);
   1916         }
   1917         else
   1918         {
   1919             /* use sleep/wake for presence check */
   1920             unsupported = TRUE;
   1921         }
   1922     }
   1923     else if (NFC_PROTOCOL_15693 == protocol)
   1924     {
   1925         /* ISO 15693 */
   1926         status = RW_I93PresenceCheck();
   1927     }
   1928     else
   1929     {
   1930         /* Protocol unsupported by RW module... */
   1931         unsupported = TRUE;
   1932     }
   1933 
   1934     if (unsupported)
   1935     {
   1936         if (nfa_rw_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_KOVIO)
   1937         {
   1938             /* start Kovio presence check (deactivate and wait for activation) */
   1939             status = nfa_dm_disc_start_kovio_presence_check ();
   1940         }
   1941         else
   1942         {
   1943             /* Let DM perform presence check (by putting tag to sleep and then waking it up) */
   1944             status = nfa_dm_disc_sleep_wakeup();
   1945         }
   1946     }
   1947 
   1948     /* Handle presence check failure */
   1949     if (status != NFC_STATUS_OK)
   1950         nfa_rw_handle_presence_check_rsp(NFC_STATUS_FAILED);
   1951     else if (!unsupported)
   1952     {
   1953         nfa_sys_start_timer (&nfa_rw_cb.tle, NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT, p_nfa_dm_cfg->presence_check_timeout);
   1954     }
   1955 }
   1956 
   1957 
   1958 /*******************************************************************************
   1959 **
   1960 ** Function         nfa_rw_presence_check_tick
   1961 **
   1962 ** Description      Called on expiration of NFA_RW_PRESENCE_CHECK_INTERVAL
   1963 **                  Initiate presence check
   1964 **
   1965 ** Returns          TRUE (caller frees message buffer)
   1966 **
   1967 *******************************************************************************/
   1968 BOOLEAN nfa_rw_presence_check_tick(tNFA_RW_MSG *p_data)
   1969 {
   1970     /* Store the current operation */
   1971     nfa_rw_cb.cur_op = NFA_RW_OP_PRESENCE_CHECK;
   1972     nfa_rw_cb.flags |= NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY;
   1973     NFA_TRACE_DEBUG0("Auto-presence check starting...");
   1974 
   1975     /* Perform presence check */
   1976     nfa_rw_presence_check(NULL);
   1977 
   1978     return TRUE;
   1979 }
   1980 
   1981 /*******************************************************************************
   1982 **
   1983 ** Function         nfa_rw_presence_check_timeout
   1984 **
   1985 ** Description      presence check timeout: report presence check failure
   1986 **
   1987 ** Returns          TRUE (caller frees message buffer)
   1988 **
   1989 *******************************************************************************/
   1990 BOOLEAN nfa_rw_presence_check_timeout (tNFA_RW_MSG *p_data)
   1991 {
   1992     nfa_rw_handle_presence_check_rsp(NFC_STATUS_FAILED);
   1993     return TRUE;
   1994 }
   1995 
   1996 /*******************************************************************************
   1997 **
   1998 ** Function         nfa_rw_format_tag
   1999 **
   2000 ** Description      Handler for NFA_RW_API_FORMAT_TAG
   2001 **
   2002 ** Returns          Nothing
   2003 **
   2004 *******************************************************************************/
   2005 static void nfa_rw_format_tag (tNFA_RW_MSG *p_data)
   2006 {
   2007     tNFC_PROTOCOL   protocol = nfa_rw_cb.protocol;
   2008     tNFC_STATUS     status   = NFC_STATUS_FAILED;
   2009 
   2010     if (protocol == NFC_PROTOCOL_T1T)
   2011     {
   2012         status = RW_T1tFormatNDef();
   2013     }
   2014     else if (  (protocol  == NFC_PROTOCOL_T2T)
   2015              &&(nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)  )
   2016     {
   2017         status = RW_T2tFormatNDef();
   2018     }
   2019     else if (protocol == NFC_PROTOCOL_T3T)
   2020     {
   2021         status = RW_T3tFormatNDef();
   2022     }
   2023     else if (protocol == NFC_PROTOCOL_15693)
   2024     {
   2025         status = RW_I93FormatNDef();
   2026     }
   2027     else if (protocol == NFC_PROTOCOL_ISO_DEP)
   2028     {
   2029         status = RW_T4tFormatNDef ();
   2030     }
   2031 
   2032     /* If unable to format NDEF, notify the app */
   2033     if (status != NFC_STATUS_OK)
   2034         nfa_rw_error_cleanup (NFA_FORMAT_CPLT_EVT);
   2035 }
   2036 
   2037 /*******************************************************************************
   2038 **
   2039 ** Function         nfa_rw_detect_tlv
   2040 **
   2041 ** Description      Handler for NFA_RW_API_DETECT_NDEF_EVT
   2042 **
   2043 ** Returns          TRUE (message buffer to be freed by caller)
   2044 **
   2045 *******************************************************************************/
   2046 static BOOLEAN nfa_rw_detect_tlv (tNFA_RW_MSG *p_data, UINT8 tlv)
   2047 {
   2048     NFA_TRACE_DEBUG0("nfa_rw_detect_tlv");
   2049 
   2050     switch (nfa_rw_cb.protocol)
   2051     {
   2052     case NFC_PROTOCOL_T1T:
   2053         if (RW_T1tLocateTlv(tlv) != NFC_STATUS_OK)
   2054             nfa_rw_error_cleanup (NFA_TLV_DETECT_EVT);
   2055         break;
   2056 
   2057     case NFC_PROTOCOL_T2T:
   2058         if (nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)
   2059         {
   2060             if (RW_T2tLocateTlv(tlv) != NFC_STATUS_OK)
   2061                 nfa_rw_error_cleanup (NFA_TLV_DETECT_EVT);
   2062         }
   2063         break;
   2064 
   2065     default:
   2066         break;
   2067     }
   2068 
   2069     return TRUE;
   2070 }
   2071 
   2072 /*******************************************************************************
   2073 **
   2074 ** Function         nfa_rw_config_tag_ro
   2075 **
   2076 ** Description      Handler for NFA_RW_OP_SET_TAG_RO
   2077 **
   2078 ** Returns          TRUE (message buffer to be freed by caller)
   2079 **
   2080 *******************************************************************************/
   2081 static tNFC_STATUS nfa_rw_config_tag_ro (BOOLEAN b_hard_lock)
   2082 {
   2083     tNFC_PROTOCOL protocol = nfa_rw_cb.protocol;
   2084     tNFC_STATUS   status   = NFC_STATUS_FAILED;
   2085 
   2086     NFA_TRACE_DEBUG0 ("nfa_rw_config_tag_ro ()");
   2087 
   2088     if (NFC_PROTOCOL_T1T == protocol)
   2089     {
   2090         /* Type1Tag    - NFC-A */
   2091         if(  (nfa_rw_cb.tlv_st == NFA_RW_TLV_DETECT_ST_OP_NOT_STARTED)
   2092            ||(nfa_rw_cb.tlv_st == NFA_RW_TLV_DETECT_ST_MEM_TLV_OP_COMPLETE) )
   2093         {
   2094             status = RW_T1tLocateTlv(TAG_LOCK_CTRL_TLV);
   2095             return (status);
   2096         }
   2097         else
   2098         {
   2099             status = RW_T1tSetTagReadOnly(b_hard_lock);
   2100         }
   2101     }
   2102     else if (NFC_PROTOCOL_T2T == protocol)
   2103     {
   2104         /* Type2Tag    - NFC-A */
   2105         if (nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)
   2106         {
   2107             status = RW_T2tSetTagReadOnly(b_hard_lock);
   2108         }
   2109     }
   2110     else if (NFC_PROTOCOL_T3T == protocol)
   2111     {
   2112         /* Type3Tag    - NFC-F */
   2113         status = RW_T3tSetReadOnly(b_hard_lock);
   2114     }
   2115     else if (NFC_PROTOCOL_ISO_DEP == protocol)
   2116     {
   2117         /* ISODEP/4A,4B- NFC-A or NFC-B */
   2118         status = RW_T4tSetNDefReadOnly();
   2119     }
   2120     else if (NFC_PROTOCOL_15693 == protocol)
   2121     {
   2122         /* ISO 15693 */
   2123         status = RW_I93SetTagReadOnly();
   2124     }
   2125 
   2126     if (status == NFC_STATUS_OK)
   2127     {
   2128         nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
   2129     }
   2130     else
   2131     {
   2132         nfa_rw_error_cleanup (NFA_SET_TAG_RO_EVT);
   2133     }
   2134 
   2135     return (status);
   2136 }
   2137 
   2138 /*******************************************************************************
   2139 **
   2140 ** Function         nfa_rw_t1t_rid
   2141 **
   2142 ** Description      Handler for T1T_RID API
   2143 **
   2144 ** Returns          TRUE (message buffer to be freed by caller)
   2145 **
   2146 *******************************************************************************/
   2147 static BOOLEAN nfa_rw_t1t_rid(tNFA_RW_MSG *p_data)
   2148 {
   2149     if (RW_T1tRid () != NFC_STATUS_OK)
   2150         nfa_rw_error_cleanup (NFA_READ_CPLT_EVT);
   2151 
   2152     return TRUE;
   2153 }
   2154 
   2155 /*******************************************************************************
   2156 **
   2157 ** Function         nfa_rw_t1t_rall
   2158 **
   2159 ** Description      Handler for T1T_ReadAll API
   2160 **
   2161 ** Returns          TRUE (message buffer to be freed by caller)
   2162 **
   2163 *******************************************************************************/
   2164 static BOOLEAN nfa_rw_t1t_rall(tNFA_RW_MSG *p_data)
   2165 {
   2166     if (RW_T1tReadAll() != NFC_STATUS_OK)
   2167         nfa_rw_error_cleanup (NFA_READ_CPLT_EVT);
   2168 
   2169     return TRUE;
   2170 }
   2171 
   2172 /*******************************************************************************
   2173 **
   2174 ** Function         nfa_rw_t1t_read
   2175 **
   2176 ** Description      Handler for T1T_Read API
   2177 **
   2178 ** Returns          TRUE (message buffer to be freed by caller)
   2179 **
   2180 *******************************************************************************/
   2181 static BOOLEAN nfa_rw_t1t_read (tNFA_RW_MSG *p_data)
   2182 {
   2183     tNFA_RW_OP_PARAMS_T1T_READ *p_t1t_read = (tNFA_RW_OP_PARAMS_T1T_READ *)&(p_data->op_req.params.t1t_read);
   2184 
   2185     if (RW_T1tRead (p_t1t_read->block_number, p_t1t_read->index) != NFC_STATUS_OK)
   2186         nfa_rw_error_cleanup (NFA_READ_CPLT_EVT);
   2187 
   2188     return TRUE;
   2189 }
   2190 
   2191 /*******************************************************************************
   2192 **
   2193 ** Function         nfa_rw_t1t_write
   2194 **
   2195 ** Description      Handler for T1T_WriteErase/T1T_WriteNoErase API
   2196 **
   2197 ** Returns          TRUE (message buffer to be freed by caller)
   2198 **
   2199 *******************************************************************************/
   2200 static BOOLEAN nfa_rw_t1t_write (tNFA_RW_MSG *p_data)
   2201 {
   2202     tNFA_RW_OP_PARAMS_T1T_WRITE *p_t1t_write = (tNFA_RW_OP_PARAMS_T1T_WRITE *)&(p_data->op_req.params.t1t_write);
   2203     tNFC_STATUS                 status;
   2204 
   2205     if (p_t1t_write->b_erase)
   2206     {
   2207         status = RW_T1tWriteErase (p_t1t_write->block_number,p_t1t_write->index,p_t1t_write->p_block_data[0]);
   2208     }
   2209     else
   2210     {
   2211         status = RW_T1tWriteNoErase (p_t1t_write->block_number,p_t1t_write->index,p_t1t_write->p_block_data[0]);
   2212     }
   2213 
   2214     if (status != NFC_STATUS_OK)
   2215     {
   2216         nfa_rw_error_cleanup (NFA_WRITE_CPLT_EVT);
   2217     }
   2218     else
   2219     {
   2220         if (p_t1t_write->block_number == 0x01)
   2221             nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
   2222     }
   2223 
   2224     return TRUE;
   2225 }
   2226 
   2227 /*******************************************************************************
   2228 **
   2229 ** Function         nfa_rw_t1t_rseg
   2230 **
   2231 ** Description      Handler for T1t_ReadSeg API
   2232 **
   2233 ** Returns          TRUE (message buffer to be freed by caller)
   2234 **
   2235 *******************************************************************************/
   2236 static BOOLEAN nfa_rw_t1t_rseg (tNFA_RW_MSG *p_data)
   2237 {
   2238     tNFA_RW_OP_PARAMS_T1T_READ *p_t1t_read = (tNFA_RW_OP_PARAMS_T1T_READ *)&(p_data->op_req.params.t1t_read);
   2239 
   2240     if (RW_T1tReadSeg (p_t1t_read->segment_number) != NFC_STATUS_OK)
   2241         nfa_rw_error_cleanup (NFA_READ_CPLT_EVT);
   2242 
   2243     return TRUE;
   2244 }
   2245 
   2246 /*******************************************************************************
   2247 **
   2248 ** Function         nfa_rw_t1t_read8
   2249 **
   2250 ** Description      Handler for T1T_Read8 API
   2251 **
   2252 ** Returns          TRUE (message buffer to be freed by caller)
   2253 **
   2254 *******************************************************************************/
   2255 static BOOLEAN nfa_rw_t1t_read8 (tNFA_RW_MSG *p_data)
   2256 {
   2257     tNFA_RW_OP_PARAMS_T1T_READ *p_t1t_read = (tNFA_RW_OP_PARAMS_T1T_READ *)&(p_data->op_req.params.t1t_read);
   2258 
   2259     if (RW_T1tRead8 (p_t1t_read->block_number) != NFC_STATUS_OK)
   2260         nfa_rw_error_cleanup (NFA_READ_CPLT_EVT);
   2261 
   2262     return TRUE;
   2263 }
   2264 
   2265 /*******************************************************************************
   2266 **
   2267 ** Function         nfa_rw_t1t_write8
   2268 **
   2269 ** Description      Handler for T1T_WriteErase8/T1T_WriteNoErase8 API
   2270 **
   2271 ** Returns          TRUE (message buffer to be freed by caller)
   2272 **
   2273 *******************************************************************************/
   2274 static BOOLEAN nfa_rw_t1t_write8 (tNFA_RW_MSG *p_data)
   2275 {
   2276     tNFA_RW_OP_PARAMS_T1T_WRITE *p_t1t_write = (tNFA_RW_OP_PARAMS_T1T_WRITE *)&(p_data->op_req.params.t1t_write);
   2277     tNFC_STATUS                 status;
   2278 
   2279     if (p_t1t_write->b_erase)
   2280     {
   2281         status = RW_T1tWriteErase8 (p_t1t_write->block_number,p_t1t_write->p_block_data);
   2282     }
   2283     else
   2284     {
   2285         status = RW_T1tWriteNoErase8 (p_t1t_write->block_number,p_t1t_write->p_block_data);
   2286     }
   2287 
   2288     if (status != NFC_STATUS_OK)
   2289     {
   2290         nfa_rw_error_cleanup (NFA_WRITE_CPLT_EVT);
   2291     }
   2292     else
   2293     {
   2294         if (p_t1t_write->block_number == 0x01)
   2295             nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
   2296     }
   2297 
   2298     return TRUE;
   2299 }
   2300 
   2301 /*******************************************************************************
   2302 **
   2303 ** Function         nfa_rw_t2t_read
   2304 **
   2305 ** Description      Handler for T2T_Read API
   2306 **
   2307 ** Returns          TRUE (message buffer to be freed by caller)
   2308 **
   2309 *******************************************************************************/
   2310 static BOOLEAN nfa_rw_t2t_read (tNFA_RW_MSG *p_data)
   2311 {
   2312     tNFA_RW_OP_PARAMS_T2T_READ *p_t2t_read = (tNFA_RW_OP_PARAMS_T2T_READ *)&(p_data->op_req.params.t2t_read);
   2313     tNFC_STATUS                status = NFC_STATUS_FAILED;
   2314 
   2315     if (nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)
   2316         status = RW_T2tRead (p_t2t_read->block_number);
   2317 
   2318     if (status != NFC_STATUS_OK)
   2319         nfa_rw_error_cleanup (NFA_READ_CPLT_EVT);
   2320 
   2321     return TRUE;
   2322 }
   2323 
   2324 /*******************************************************************************
   2325 **
   2326 ** Function         nfa_rw_t2t_write
   2327 **
   2328 ** Description      Handler for T2T_Write API
   2329 **
   2330 ** Returns          TRUE (message buffer to be freed by caller)
   2331 **
   2332 *******************************************************************************/
   2333 static BOOLEAN nfa_rw_t2t_write (tNFA_RW_MSG *p_data)
   2334 {
   2335     tNFA_RW_OP_PARAMS_T2T_WRITE *p_t2t_write = (tNFA_RW_OP_PARAMS_T2T_WRITE *)&(p_data->op_req.params.t2t_write);
   2336 
   2337     if (RW_T2tWrite (p_t2t_write->block_number,p_t2t_write->p_block_data) != NFC_STATUS_OK)
   2338     {
   2339         nfa_rw_error_cleanup (NFA_WRITE_CPLT_EVT);
   2340     }
   2341     else
   2342     {
   2343         if (p_t2t_write->block_number == 0x03)
   2344             nfa_rw_cb.ndef_st = NFA_RW_NDEF_ST_UNKNOWN;
   2345     }
   2346 
   2347     return TRUE;
   2348 }
   2349 
   2350 /*******************************************************************************
   2351 **
   2352 ** Function         nfa_rw_t2t_sector_select
   2353 **
   2354 ** Description      Handler for T2T_Sector_Select API
   2355 **
   2356 ** Returns          TRUE (message buffer to be freed by caller)
   2357 **
   2358 *******************************************************************************/
   2359 static BOOLEAN nfa_rw_t2t_sector_select(tNFA_RW_MSG *p_data)
   2360 {
   2361     tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT *p_t2t_sector_select = (tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT *)&(p_data->op_req.params.t2t_sector_select);
   2362 
   2363     if (RW_T2tSectorSelect (p_t2t_sector_select->sector_number) != NFC_STATUS_OK)
   2364         nfa_rw_error_cleanup (NFA_SELECT_CPLT_EVT);
   2365 
   2366     return TRUE;
   2367 }
   2368 
   2369 /*******************************************************************************
   2370 **
   2371 ** Function         nfa_rw_t3t_read
   2372 **
   2373 ** Description      Handler for T3T_Read API
   2374 **
   2375 ** Returns          TRUE (message buffer to be freed by caller)
   2376 **
   2377 *******************************************************************************/
   2378 static BOOLEAN nfa_rw_t3t_read (tNFA_RW_MSG *p_data)
   2379 {
   2380     tNFA_RW_OP_PARAMS_T3T_READ *p_t3t_read = (tNFA_RW_OP_PARAMS_T3T_READ *)&(p_data->op_req.params.t3t_read);
   2381 
   2382     if (RW_T3tCheck (p_t3t_read->num_blocks, (tT3T_BLOCK_DESC *)p_t3t_read->p_block_desc) != NFC_STATUS_OK)
   2383         nfa_rw_error_cleanup (NFA_READ_CPLT_EVT);
   2384 
   2385     return TRUE;
   2386 }
   2387 
   2388 /*******************************************************************************
   2389 **
   2390 ** Function         nfa_rw_t3t_write
   2391 **
   2392 ** Description      Handler for T3T_Write API
   2393 **
   2394 ** Returns          TRUE (message buffer to be freed by caller)
   2395 **
   2396 *******************************************************************************/
   2397 static BOOLEAN nfa_rw_t3t_write (tNFA_RW_MSG *p_data)
   2398 {
   2399     tNFA_RW_OP_PARAMS_T3T_WRITE *p_t3t_write = (tNFA_RW_OP_PARAMS_T3T_WRITE *)&(p_data->op_req.params.t3t_write);
   2400 
   2401     if (RW_T3tUpdate (p_t3t_write->num_blocks, (tT3T_BLOCK_DESC *)p_t3t_write->p_block_desc, p_t3t_write->p_block_data) != NFC_STATUS_OK)
   2402         nfa_rw_error_cleanup (NFA_WRITE_CPLT_EVT);
   2403 
   2404     return TRUE;
   2405 }
   2406 
   2407 /*******************************************************************************
   2408 **
   2409 ** Function         nfa_rw_t3t_get_system_codes
   2410 **
   2411 ** Description      Get system codes (initiated by NFA after activation)
   2412 **
   2413 ** Returns          TRUE (message buffer to be freed by caller)
   2414 **
   2415 *******************************************************************************/
   2416 static BOOLEAN nfa_rw_t3t_get_system_codes (tNFA_RW_MSG *p_data)
   2417 {
   2418     tNFC_STATUS     status;
   2419     tNFA_TAG_PARAMS tag_params;
   2420 
   2421     status = RW_T3tGetSystemCodes();
   2422 
   2423     if (status != NFC_STATUS_OK)
   2424     {
   2425         /* Command complete - perform cleanup, notify app */
   2426         nfa_rw_command_complete();
   2427         tag_params.t3t.num_system_codes = 0;
   2428         tag_params.t3t.p_system_codes   = NULL;
   2429 
   2430         nfa_dm_notify_activation_status (NFA_STATUS_OK, &tag_params);
   2431     }
   2432 
   2433     return TRUE;
   2434 }
   2435 
   2436 /*******************************************************************************
   2437 **
   2438 ** Function         nfa_rw_i93_command
   2439 **
   2440 ** Description      Handler for ISO 15693 command
   2441 **
   2442 ** Returns          TRUE (message buffer to be freed by caller)
   2443 **
   2444 *******************************************************************************/
   2445 static BOOLEAN nfa_rw_i93_command (tNFA_RW_MSG *p_data)
   2446 {
   2447     tNFA_CONN_EVT_DATA conn_evt_data;
   2448     tNFC_STATUS        status = NFC_STATUS_OK;
   2449     UINT8              i93_command = I93_CMD_STAY_QUIET;
   2450 
   2451     switch (p_data->op_req.op)
   2452     {
   2453     case NFA_RW_OP_I93_INVENTORY:
   2454         i93_command = I93_CMD_INVENTORY;
   2455         if (p_data->op_req.params.i93_cmd.uid_present)
   2456         {
   2457             status = RW_I93Inventory (p_data->op_req.params.i93_cmd.afi_present,
   2458                                       p_data->op_req.params.i93_cmd.afi,
   2459                                       p_data->op_req.params.i93_cmd.uid);
   2460         }
   2461         else
   2462         {
   2463             status = RW_I93Inventory (p_data->op_req.params.i93_cmd.afi_present,
   2464                                       p_data->op_req.params.i93_cmd.afi,
   2465                                       NULL);
   2466         }
   2467         break;
   2468 
   2469     case NFA_RW_OP_I93_STAY_QUIET:
   2470         i93_command = I93_CMD_STAY_QUIET;
   2471         status = RW_I93StayQuiet ();
   2472         break;
   2473 
   2474     case NFA_RW_OP_I93_READ_SINGLE_BLOCK:
   2475         i93_command = I93_CMD_READ_SINGLE_BLOCK;
   2476         status = RW_I93ReadSingleBlock (p_data->op_req.params.i93_cmd.first_block_number);
   2477         break;
   2478 
   2479     case NFA_RW_OP_I93_WRITE_SINGLE_BLOCK:
   2480         i93_command = I93_CMD_WRITE_SINGLE_BLOCK;
   2481         status = RW_I93WriteSingleBlock (p_data->op_req.params.i93_cmd.first_block_number,
   2482                                          p_data->op_req.params.i93_cmd.p_data);
   2483         break;
   2484 
   2485     case NFA_RW_OP_I93_LOCK_BLOCK:
   2486         i93_command = I93_CMD_LOCK_BLOCK;
   2487         status = RW_I93LockBlock ((UINT8)p_data->op_req.params.i93_cmd.first_block_number);
   2488         break;
   2489 
   2490     case NFA_RW_OP_I93_READ_MULTI_BLOCK:
   2491         i93_command = I93_CMD_READ_MULTI_BLOCK;
   2492         status = RW_I93ReadMultipleBlocks (p_data->op_req.params.i93_cmd.first_block_number,
   2493                                            p_data->op_req.params.i93_cmd.number_blocks);
   2494         break;
   2495 
   2496     case NFA_RW_OP_I93_WRITE_MULTI_BLOCK:
   2497         i93_command = I93_CMD_WRITE_MULTI_BLOCK;
   2498         status = RW_I93WriteMultipleBlocks ((UINT8)p_data->op_req.params.i93_cmd.first_block_number,
   2499                                             p_data->op_req.params.i93_cmd.number_blocks,
   2500                                             p_data->op_req.params.i93_cmd.p_data);
   2501         break;
   2502 
   2503     case NFA_RW_OP_I93_SELECT:
   2504         i93_command = I93_CMD_SELECT;
   2505         status = RW_I93Select (p_data->op_req.params.i93_cmd.p_data);
   2506         break;
   2507 
   2508     case NFA_RW_OP_I93_RESET_TO_READY:
   2509         i93_command = I93_CMD_RESET_TO_READY;
   2510         status = RW_I93ResetToReady ();
   2511         break;
   2512 
   2513     case NFA_RW_OP_I93_WRITE_AFI:
   2514         i93_command = I93_CMD_WRITE_AFI;
   2515         status = RW_I93WriteAFI (p_data->op_req.params.i93_cmd.afi);
   2516         break;
   2517 
   2518     case NFA_RW_OP_I93_LOCK_AFI:
   2519         i93_command = I93_CMD_LOCK_AFI;
   2520         status = RW_I93LockAFI ();
   2521         break;
   2522 
   2523     case NFA_RW_OP_I93_WRITE_DSFID:
   2524         i93_command = I93_CMD_WRITE_DSFID;
   2525         status = RW_I93WriteDSFID (p_data->op_req.params.i93_cmd.dsfid);
   2526         break;
   2527 
   2528     case NFA_RW_OP_I93_LOCK_DSFID:
   2529         i93_command = I93_CMD_LOCK_DSFID;
   2530         status = RW_I93LockDSFID ();
   2531         break;
   2532 
   2533     case NFA_RW_OP_I93_GET_SYS_INFO:
   2534         i93_command = I93_CMD_GET_SYS_INFO;
   2535         if (p_data->op_req.params.i93_cmd.uid_present)
   2536         {
   2537             status = RW_I93GetSysInfo (p_data->op_req.params.i93_cmd.uid);
   2538         }
   2539         else
   2540         {
   2541             status = RW_I93GetSysInfo (NULL);
   2542         }
   2543         break;
   2544 
   2545     case NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS:
   2546         i93_command = I93_CMD_GET_MULTI_BLK_SEC;
   2547         status = RW_I93GetMultiBlockSecurityStatus (p_data->op_req.params.i93_cmd.first_block_number,
   2548                                                     p_data->op_req.params.i93_cmd.number_blocks);
   2549         break;
   2550 
   2551     default:
   2552         break;
   2553     }
   2554 
   2555     if (status != NFC_STATUS_OK)
   2556     {
   2557         /* Command complete - perform cleanup, notify app */
   2558         nfa_rw_command_complete();
   2559 
   2560         conn_evt_data.i93_cmd_cplt.status       = NFA_STATUS_FAILED;
   2561         conn_evt_data.i93_cmd_cplt.sent_command = i93_command;
   2562 
   2563         nfa_dm_act_conn_cback_notify(NFA_I93_CMD_CPLT_EVT, &conn_evt_data);
   2564     }
   2565 
   2566     return TRUE;
   2567 }
   2568 
   2569 /*******************************************************************************
   2570 **
   2571 ** Function         nfa_rw_raw_mode_data_cback
   2572 **
   2573 ** Description      Handler for incoming tag data for unsupported tag protocols
   2574 **                  (forward data to upper layer)
   2575 **
   2576 ** Returns          nothing
   2577 **
   2578 *******************************************************************************/
   2579 static void nfa_rw_raw_mode_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
   2580 {
   2581     BT_HDR             *p_msg;
   2582     tNFA_CONN_EVT_DATA evt_data;
   2583 
   2584     NFA_TRACE_DEBUG1 ("nfa_rw_raw_mode_data_cback(): event = 0x%X", event);
   2585 
   2586     if (  (event == NFC_DATA_CEVT)
   2587         &&(  (p_data->data.status == NFC_STATUS_OK)
   2588            ||(p_data->data.status == NFC_STATUS_CONTINUE)  )  )
   2589     {
   2590         p_msg = (BT_HDR *)p_data->data.p_data;
   2591 
   2592         if (p_msg)
   2593         {
   2594             evt_data.data.status = p_data->data.status;
   2595             evt_data.data.p_data = (UINT8 *)(p_msg + 1) + p_msg->offset;
   2596             evt_data.data.len    = p_msg->len;
   2597 
   2598             nfa_dm_conn_cback_event_notify (NFA_DATA_EVT, &evt_data);
   2599 
   2600             GKI_freebuf (p_msg);
   2601         }
   2602         else
   2603         {
   2604             NFA_TRACE_ERROR0 ("nfa_rw_raw_mode_data_cback (): received NFC_DATA_CEVT with NULL data pointer");
   2605         }
   2606     }
   2607     else if (event == NFC_DEACTIVATE_CEVT)
   2608     {
   2609         NFC_SetStaticRfCback (NULL);
   2610     }
   2611 }
   2612 
   2613 
   2614 /*******************************************************************************
   2615 **
   2616 ** Function         nfa_rw_activate_ntf
   2617 **
   2618 ** Description      Handler for NFA_RW_ACTIVATE_NTF
   2619 **
   2620 ** Returns          TRUE (message buffer to be freed by caller)
   2621 **
   2622 *******************************************************************************/
   2623 BOOLEAN nfa_rw_activate_ntf(tNFA_RW_MSG *p_data)
   2624 {
   2625     tNFC_ACTIVATE_DEVT *p_activate_params = p_data->activate_ntf.p_activate_params;
   2626     tNFA_TAG_PARAMS    tag_params;
   2627     tNFA_RW_OPERATION  msg;
   2628     BOOLEAN            activate_notify = TRUE;
   2629     UINT8              *p;
   2630 
   2631     if (  (nfa_rw_cb.halt_event != RW_T2T_MAX_EVT)
   2632         &&(nfa_rw_cb.activated_tech_mode == NFC_DISCOVERY_TYPE_POLL_A)
   2633         &&(nfa_rw_cb.protocol == NFC_PROTOCOL_T2T)
   2634         &&(nfa_rw_cb.pa_sel_res == NFC_SEL_RES_NFC_FORUM_T2T)  )
   2635     {
   2636         /* Type 2 tag is wake up from HALT State */
   2637         if(nfa_dm_cb.p_activate_ntf != NULL)
   2638         {
   2639             GKI_freebuf (nfa_dm_cb.p_activate_ntf);
   2640             nfa_dm_cb.p_activate_ntf = NULL;
   2641         }
   2642         NFA_TRACE_DEBUG0("nfa_rw_activate_ntf () - Type 2 tag wake up from HALT State");
   2643         return TRUE;
   2644     }
   2645 
   2646     NFA_TRACE_DEBUG0("nfa_rw_activate_ntf");
   2647 
   2648     /* Initialize control block */
   2649     nfa_rw_cb.protocol   = p_activate_params->protocol;
   2650     nfa_rw_cb.intf_type  = p_activate_params->intf_param.type;
   2651     nfa_rw_cb.pa_sel_res = p_activate_params->rf_tech_param.param.pa.sel_rsp;
   2652     nfa_rw_cb.activated_tech_mode = p_activate_params->rf_tech_param.mode;
   2653     nfa_rw_cb.flags      = NFA_RW_FL_ACTIVATED;
   2654     nfa_rw_cb.cur_op     = NFA_RW_OP_MAX;
   2655     nfa_rw_cb.halt_event = RW_T2T_MAX_EVT;
   2656     nfa_rw_cb.skip_dyn_locks = FALSE;
   2657     nfa_rw_cb.ndef_st    = NFA_RW_NDEF_ST_UNKNOWN;
   2658     nfa_rw_cb.tlv_st     = NFA_RW_TLV_DETECT_ST_OP_NOT_STARTED;
   2659 
   2660     memset (&tag_params, 0, sizeof(tNFA_TAG_PARAMS));
   2661 
   2662     /* Check if we are in exclusive RF mode */
   2663     if (p_data->activate_ntf.excl_rf_not_active)
   2664     {
   2665         /* Not in exclusive RF mode */
   2666         nfa_rw_cb.flags |= NFA_RW_FL_NOT_EXCL_RF_MODE;
   2667     }
   2668 
   2669     /* check if the protocol is activated with supported interface */
   2670     if (p_activate_params->intf_param.type == NCI_INTERFACE_FRAME)
   2671     {
   2672         if (  (p_activate_params->protocol != NFA_PROTOCOL_T1T)
   2673             &&(p_activate_params->protocol != NFA_PROTOCOL_T2T)
   2674             &&(p_activate_params->protocol != NFA_PROTOCOL_T3T)
   2675             &&(p_activate_params->protocol != NFC_PROTOCOL_15693)  )
   2676         {
   2677             nfa_rw_cb.protocol = NFA_PROTOCOL_INVALID;
   2678         }
   2679     }
   2680     else if (p_activate_params->intf_param.type == NCI_INTERFACE_ISO_DEP)
   2681     {
   2682         if (p_activate_params->protocol != NFA_PROTOCOL_ISO_DEP)
   2683         {
   2684             nfa_rw_cb.protocol = NFA_PROTOCOL_INVALID;
   2685         }
   2686     }
   2687 
   2688     if (nfa_rw_cb.protocol == NFA_PROTOCOL_INVALID)
   2689     {
   2690         /* Only sending raw frame and presence check are supported in this state */
   2691 
   2692         NFC_SetStaticRfCback(nfa_rw_raw_mode_data_cback);
   2693 
   2694         /* Notify app of NFA_ACTIVATED_EVT and start presence check timer */
   2695         nfa_dm_notify_activation_status (NFA_STATUS_OK, NULL);
   2696         nfa_rw_check_start_presence_check_timer (NFA_RW_PRESENCE_CHECK_INTERVAL);
   2697         return TRUE;
   2698     }
   2699 
   2700     /* If protocol not supported by RW module, notify app of NFA_ACTIVATED_EVT and start presence check if needed */
   2701     if (!nfa_dm_is_protocol_supported(p_activate_params->protocol, p_activate_params->rf_tech_param.param.pa.sel_rsp))
   2702     {
   2703         /* Notify upper layer of NFA_ACTIVATED_EVT if needed, and start presence check timer */
   2704         /* Set data callback (pass all incoming data to upper layer using NFA_DATA_EVT) */
   2705         NFC_SetStaticRfCback(nfa_rw_raw_mode_data_cback);
   2706 
   2707         /* Notify app of NFA_ACTIVATED_EVT and start presence check timer */
   2708         nfa_dm_notify_activation_status (NFA_STATUS_OK, NULL);
   2709         nfa_rw_check_start_presence_check_timer (NFA_RW_PRESENCE_CHECK_INTERVAL);
   2710         return TRUE;
   2711     }
   2712 
   2713     /* Initialize RW module */
   2714     if ((RW_SetActivatedTagType (p_activate_params, nfa_rw_cback)) != NFC_STATUS_OK)
   2715     {
   2716         /* Log error (stay in NFA_RW_ST_ACTIVATED state until deactivation) */
   2717         NFA_TRACE_ERROR0("RW_SetActivatedTagType failed.");
   2718         return TRUE;
   2719     }
   2720 
   2721     /* Perform protocol-specific actions */
   2722     if (NFC_PROTOCOL_T1T == nfa_rw_cb.protocol)
   2723     {
   2724         /* Retrieve HR and UID fields from activation notification */
   2725         memcpy (tag_params.t1t.hr, p_activate_params->intf_param.intf_param.frame.param, NFA_T1T_HR_LEN);
   2726         memcpy (tag_params.t1t.uid, p_activate_params->rf_tech_param.param.pa.nfcid1, p_activate_params->rf_tech_param.param.pa.nfcid1_len);
   2727         msg.op = NFA_RW_OP_T1T_RID;
   2728         nfa_rw_handle_op_req ((tNFA_RW_MSG *)&msg);
   2729         activate_notify = FALSE;                    /* Delay notifying upper layer of NFA_ACTIVATED_EVT until HR0/HR1 is received */
   2730     }
   2731     else if (NFC_PROTOCOL_T2T == nfa_rw_cb.protocol)
   2732     {
   2733         /* Retrieve UID fields from activation notification */
   2734         memcpy (tag_params.t2t.uid, p_activate_params->rf_tech_param.param.pa.nfcid1, p_activate_params->rf_tech_param.param.pa.nfcid1_len);
   2735     }
   2736     else if (NFC_PROTOCOL_T3T == nfa_rw_cb.protocol)
   2737     {
   2738         /* Issue command to get Felica system codes */
   2739         activate_notify = FALSE;                    /* Delay notifying upper layer of NFA_ACTIVATED_EVT until system codes are retrieved */
   2740         msg.op = NFA_RW_OP_T3T_GET_SYSTEM_CODES;
   2741         nfa_rw_handle_op_req((tNFA_RW_MSG *)&msg);
   2742     }
   2743     else if (NFC_PROTOCOL_15693 == nfa_rw_cb.protocol)
   2744     {
   2745         /* Delay notifying upper layer of NFA_ACTIVATED_EVT to retrieve additional tag infomation */
   2746         nfa_rw_cb.flags |= NFA_RW_FL_ACTIVATION_NTF_PENDING;
   2747         activate_notify = FALSE;
   2748 
   2749         /* store DSFID and UID from activation NTF */
   2750         nfa_rw_cb.i93_dsfid = p_activate_params->rf_tech_param.param.pi93.dsfid;
   2751 
   2752         p = nfa_rw_cb.i93_uid;
   2753         ARRAY8_TO_STREAM (p, p_activate_params->rf_tech_param.param.pi93.uid);
   2754 
   2755         if ((nfa_rw_cb.i93_uid[1] == I93_UID_IC_MFG_CODE_TI)
   2756           &&(((nfa_rw_cb.i93_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) == I93_UID_TAG_IT_HF_I_STD_CHIP_INLAY)
   2757            ||((nfa_rw_cb.i93_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) == I93_UID_TAG_IT_HF_I_PRO_CHIP_INLAY)))
   2758         {
   2759             /* these don't support Get System Information Command */
   2760             nfa_rw_cb.i93_block_size    = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_BLK_SIZE;
   2761             nfa_rw_cb.i93_afi_location  = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_AFI_LOCATION;
   2762 
   2763             if ((nfa_rw_cb.i93_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) == I93_UID_TAG_IT_HF_I_STD_CHIP_INLAY)
   2764             {
   2765                 nfa_rw_cb.i93_num_block     = I93_TAG_IT_HF_I_STD_CHIP_INLAY_NUM_TOTAL_BLK;
   2766             }
   2767             else
   2768             {
   2769                 nfa_rw_cb.i93_num_block     = I93_TAG_IT_HF_I_PRO_CHIP_INLAY_NUM_TOTAL_BLK;
   2770             }
   2771 
   2772             /* read AFI */
   2773             if (RW_I93ReadSingleBlock ((UINT8)(nfa_rw_cb.i93_afi_location / nfa_rw_cb.i93_block_size)) != NFC_STATUS_OK)
   2774             {
   2775                 /* notify activation without AFI/IC-Ref */
   2776                 nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATION_NTF_PENDING;
   2777                 activate_notify = TRUE;
   2778 
   2779                 tag_params.i93.info_flags = (I93_INFO_FLAG_DSFID|I93_INFO_FLAG_MEM_SIZE);
   2780                 tag_params.i93.dsfid      = nfa_rw_cb.i93_dsfid;
   2781                 tag_params.i93.block_size = nfa_rw_cb.i93_block_size;
   2782                 tag_params.i93.num_block  = nfa_rw_cb.i93_num_block;
   2783                 memcpy (tag_params.i93.uid, nfa_rw_cb.i93_uid, I93_UID_BYTE_LEN);
   2784             }
   2785         }
   2786         else
   2787         {
   2788             /* All of ICODE supports Get System Information Command */
   2789             /* Tag-it HF-I Plus Chip/Inlay supports Get System Information Command */
   2790             /* just try for others */
   2791 
   2792             if (RW_I93GetSysInfo (nfa_rw_cb.i93_uid) != NFC_STATUS_OK)
   2793             {
   2794                 /* notify activation without AFI/MEM size/IC-Ref */
   2795                 nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATION_NTF_PENDING;
   2796                 activate_notify = TRUE;
   2797 
   2798                 tag_params.i93.info_flags = I93_INFO_FLAG_DSFID;
   2799                 tag_params.i93.dsfid      = nfa_rw_cb.i93_dsfid;
   2800                 tag_params.i93.block_size = 0;
   2801                 tag_params.i93.num_block  = 0;
   2802                 memcpy (tag_params.i93.uid, nfa_rw_cb.i93_uid, I93_UID_BYTE_LEN);
   2803             }
   2804             else
   2805             {
   2806                 /* reset memory size */
   2807                 nfa_rw_cb.i93_block_size = 0;
   2808                 nfa_rw_cb.i93_num_block  = 0;
   2809             }
   2810         }
   2811     }
   2812 
   2813     /* Notify upper layer of NFA_ACTIVATED_EVT if needed, and start presence check timer */
   2814     if (activate_notify)
   2815     {
   2816         nfa_dm_notify_activation_status (NFA_STATUS_OK, &tag_params);
   2817         nfa_rw_check_start_presence_check_timer (NFA_RW_PRESENCE_CHECK_INTERVAL);
   2818     }
   2819 
   2820 
   2821     return TRUE;
   2822 }
   2823 
   2824 
   2825 /*******************************************************************************
   2826 **
   2827 ** Function         nfa_rw_deactivate_ntf
   2828 **
   2829 ** Description      Handler for NFA_RW_DEACTIVATE_NTF
   2830 **
   2831 ** Returns          TRUE (message buffer to be freed by caller)
   2832 **
   2833 *******************************************************************************/
   2834 BOOLEAN nfa_rw_deactivate_ntf(tNFA_RW_MSG *p_data)
   2835 {
   2836     /* Clear the activated flag */
   2837     nfa_rw_cb.flags &= ~NFA_RW_FL_ACTIVATED;
   2838 
   2839     /* Free buffer for incoming NDEF message, in case we were in the middle of a read operation */
   2840     nfa_rw_free_ndef_rx_buf();
   2841 
   2842     /* If there is a pending command message, then free it */
   2843     if (nfa_rw_cb.p_pending_msg)
   2844     {
   2845         if (  (nfa_rw_cb.p_pending_msg->op_req.op == NFA_RW_OP_SEND_RAW_FRAME)
   2846             &&(nfa_rw_cb.p_pending_msg->op_req.params.send_raw_frame.p_data)  )
   2847         {
   2848             GKI_freebuf(nfa_rw_cb.p_pending_msg->op_req.params.send_raw_frame.p_data);
   2849         }
   2850 
   2851         GKI_freebuf(nfa_rw_cb.p_pending_msg);
   2852         nfa_rw_cb.p_pending_msg = NULL;
   2853     }
   2854 
   2855     /* If we are in the process of waking up tag from HALT state */
   2856     if (nfa_rw_cb.halt_event == RW_T2T_READ_CPLT_EVT)
   2857     {
   2858         if (nfa_rw_cb.rw_data.data.p_data)
   2859             GKI_freebuf(nfa_rw_cb.rw_data.data.p_data);
   2860         nfa_rw_cb.rw_data.data.p_data = NULL;
   2861     }
   2862 
   2863     /* Stop presence check timer (if started) */
   2864     nfa_rw_stop_presence_check_timer();
   2865 
   2866     return TRUE;
   2867 }
   2868 
   2869 /*******************************************************************************
   2870 **
   2871 ** Function         nfa_rw_handle_op_req
   2872 **
   2873 ** Description      Handler for NFA_RW_OP_REQUEST_EVT, operation request
   2874 **
   2875 ** Returns          TRUE if caller should free p_data
   2876 **                  FALSE if caller does not need to free p_data
   2877 **
   2878 *******************************************************************************/
   2879 BOOLEAN nfa_rw_handle_op_req (tNFA_RW_MSG *p_data)
   2880 {
   2881     BOOLEAN freebuf = TRUE;
   2882     UINT16  presence_check_start_delay = 0;
   2883 
   2884     /* Check if activated */
   2885     if (!(nfa_rw_cb.flags & NFA_RW_FL_ACTIVATED))
   2886     {
   2887         NFA_TRACE_ERROR0("nfa_rw_handle_op_req: not activated");
   2888         return TRUE;
   2889     }
   2890     /* Check if currently busy with another API call */
   2891     else if (nfa_rw_cb.flags & NFA_RW_FL_API_BUSY)
   2892     {
   2893         return (nfa_rw_op_req_while_busy(p_data));
   2894     }
   2895     /* Check if currently busy with auto-presence check */
   2896     else if (nfa_rw_cb.flags & NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY)
   2897     {
   2898         /* Cache the command (will be handled once auto-presence check is completed) */
   2899         NFA_TRACE_DEBUG1("Deferring operation %i until after auto-presence check is completed", p_data->op_req.op);
   2900         nfa_rw_cb.p_pending_msg = p_data;
   2901         nfa_rw_cb.flags |= NFA_RW_FL_API_BUSY;
   2902         return (FALSE);
   2903     }
   2904 
   2905     NFA_TRACE_DEBUG1("nfa_rw_handle_op_req: op=0x%02x", p_data->op_req.op);
   2906 
   2907     nfa_rw_cb.flags |= NFA_RW_FL_API_BUSY;
   2908 
   2909     /* Stop the presence check timer */
   2910     nfa_rw_stop_presence_check_timer();
   2911 
   2912     /* Store the current operation */
   2913     nfa_rw_cb.cur_op = p_data->op_req.op;
   2914 
   2915     /* Call appropriate handler for requested operation */
   2916     switch (p_data->op_req.op)
   2917     {
   2918     case NFA_RW_OP_DETECT_NDEF:
   2919         nfa_rw_cb.skip_dyn_locks = FALSE;
   2920         nfa_rw_detect_ndef(p_data);
   2921         break;
   2922 
   2923     case NFA_RW_OP_READ_NDEF:
   2924         nfa_rw_read_ndef(p_data);
   2925         break;
   2926 
   2927     case NFA_RW_OP_WRITE_NDEF:
   2928         nfa_rw_write_ndef(p_data);
   2929         break;
   2930 
   2931     case NFA_RW_OP_SEND_RAW_FRAME:
   2932         presence_check_start_delay = p_data->op_req.params.send_raw_frame.p_data->layer_specific;
   2933 
   2934         NFC_SendData (NFC_RF_CONN_ID, p_data->op_req.params.send_raw_frame.p_data);
   2935 
   2936         /* Clear the busy flag */
   2937         nfa_rw_cb.flags &= ~NFA_RW_FL_API_BUSY;
   2938 
   2939         /* Start presence_check after specified delay */
   2940         nfa_rw_check_start_presence_check_timer (presence_check_start_delay);
   2941         break;
   2942 
   2943     case NFA_RW_OP_PRESENCE_CHECK:
   2944         nfa_rw_presence_check(p_data);
   2945         break;
   2946 
   2947     case NFA_RW_OP_FORMAT_TAG:
   2948         nfa_rw_format_tag(p_data);
   2949         break;
   2950 
   2951     case NFA_RW_OP_DETECT_LOCK_TLV:
   2952         nfa_rw_detect_tlv(p_data, TAG_LOCK_CTRL_TLV);
   2953         break;
   2954 
   2955     case NFA_RW_OP_DETECT_MEM_TLV:
   2956         nfa_rw_detect_tlv(p_data, TAG_MEM_CTRL_TLV);
   2957         break;
   2958 
   2959     case NFA_RW_OP_SET_TAG_RO:
   2960         nfa_rw_cb.b_hard_lock = p_data->op_req.params.set_readonly.b_hard_lock;
   2961         nfa_rw_config_tag_ro(nfa_rw_cb.b_hard_lock);
   2962         break;
   2963 
   2964     case NFA_RW_OP_T1T_RID:
   2965         nfa_rw_t1t_rid(p_data);
   2966         break;
   2967 
   2968     case NFA_RW_OP_T1T_RALL:
   2969         nfa_rw_t1t_rall(p_data);
   2970         break;
   2971 
   2972     case NFA_RW_OP_T1T_READ:
   2973         nfa_rw_t1t_read(p_data);
   2974         break;
   2975 
   2976     case NFA_RW_OP_T1T_WRITE:
   2977         nfa_rw_t1t_write(p_data);
   2978         break;
   2979 
   2980     case NFA_RW_OP_T1T_RSEG:
   2981         nfa_rw_t1t_rseg(p_data);
   2982         break;
   2983 
   2984     case NFA_RW_OP_T1T_READ8:
   2985         nfa_rw_t1t_read8(p_data);
   2986         break;
   2987 
   2988     case NFA_RW_OP_T1T_WRITE8:
   2989         nfa_rw_t1t_write8(p_data);
   2990         break;
   2991 
   2992         /* Type-2 tag commands */
   2993     case NFA_RW_OP_T2T_READ:
   2994         nfa_rw_t2t_read(p_data);
   2995         break;
   2996 
   2997     case NFA_RW_OP_T2T_WRITE:
   2998         nfa_rw_t2t_write(p_data);
   2999         break;
   3000 
   3001     case NFA_RW_OP_T2T_SECTOR_SELECT:
   3002         nfa_rw_t2t_sector_select(p_data);
   3003         break;
   3004 
   3005         /* Type-3 tag commands */
   3006     case NFA_RW_OP_T3T_READ:
   3007         nfa_rw_t3t_read(p_data);
   3008         break;
   3009 
   3010     case NFA_RW_OP_T3T_WRITE:
   3011         nfa_rw_t3t_write(p_data);
   3012         break;
   3013 
   3014     case NFA_RW_OP_T3T_GET_SYSTEM_CODES:
   3015         nfa_rw_t3t_get_system_codes(p_data);
   3016         break;
   3017 
   3018         /* ISO 15693 tag commands */
   3019     case NFA_RW_OP_I93_INVENTORY:
   3020     case NFA_RW_OP_I93_STAY_QUIET:
   3021     case NFA_RW_OP_I93_READ_SINGLE_BLOCK:
   3022     case NFA_RW_OP_I93_WRITE_SINGLE_BLOCK:
   3023     case NFA_RW_OP_I93_LOCK_BLOCK:
   3024     case NFA_RW_OP_I93_READ_MULTI_BLOCK:
   3025     case NFA_RW_OP_I93_WRITE_MULTI_BLOCK:
   3026     case NFA_RW_OP_I93_SELECT:
   3027     case NFA_RW_OP_I93_RESET_TO_READY:
   3028     case NFA_RW_OP_I93_WRITE_AFI:
   3029     case NFA_RW_OP_I93_LOCK_AFI:
   3030     case NFA_RW_OP_I93_WRITE_DSFID:
   3031     case NFA_RW_OP_I93_LOCK_DSFID:
   3032     case NFA_RW_OP_I93_GET_SYS_INFO:
   3033     case NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS:
   3034         nfa_rw_i93_command (p_data);
   3035         break;
   3036 
   3037     default:
   3038         NFA_TRACE_ERROR1("nfa_rw_handle_api: unhandled operation: %i", p_data->op_req.op);
   3039         break;
   3040     }
   3041 
   3042     return (freebuf);
   3043 }
   3044 
   3045 
   3046 /*******************************************************************************
   3047 **
   3048 ** Function         nfa_rw_op_req_while_busy
   3049 **
   3050 ** Description      Handle operation request while busy
   3051 **
   3052 ** Returns          TRUE if caller should free p_data
   3053 **                  FALSE if caller does not need to free p_data
   3054 **
   3055 *******************************************************************************/
   3056 static BOOLEAN nfa_rw_op_req_while_busy(tNFA_RW_MSG *p_data)
   3057 {
   3058     BOOLEAN             freebuf = TRUE;
   3059     tNFA_CONN_EVT_DATA  conn_evt_data;
   3060     UINT8               event;
   3061 
   3062     NFA_TRACE_ERROR0("nfa_rw_op_req_while_busy: unable to handle API");
   3063 
   3064     /* Return appropriate event for requested API, with status=BUSY */
   3065     conn_evt_data.status = NFA_STATUS_BUSY;
   3066 
   3067     switch (p_data->op_req.op)
   3068     {
   3069     case NFA_RW_OP_DETECT_NDEF:
   3070         conn_evt_data.ndef_detect.cur_size = 0;
   3071         conn_evt_data.ndef_detect.max_size = 0;
   3072         conn_evt_data.ndef_detect.flags    = RW_NDEF_FL_UNKNOWN;
   3073         event = NFA_NDEF_DETECT_EVT;
   3074         break;
   3075     case NFA_RW_OP_READ_NDEF:
   3076     case NFA_RW_OP_T1T_RID:
   3077     case NFA_RW_OP_T1T_RALL:
   3078     case NFA_RW_OP_T1T_READ:
   3079     case NFA_RW_OP_T1T_RSEG:
   3080     case NFA_RW_OP_T1T_READ8:
   3081     case NFA_RW_OP_T2T_READ:
   3082     case NFA_RW_OP_T3T_READ:
   3083         event = NFA_READ_CPLT_EVT;
   3084         break;
   3085     case NFA_RW_OP_WRITE_NDEF:
   3086     case NFA_RW_OP_T1T_WRITE:
   3087     case NFA_RW_OP_T1T_WRITE8:
   3088     case NFA_RW_OP_T2T_WRITE:
   3089     case NFA_RW_OP_T3T_WRITE:
   3090         event = NFA_WRITE_CPLT_EVT;
   3091         break;
   3092     case NFA_RW_OP_FORMAT_TAG:
   3093         event = NFA_FORMAT_CPLT_EVT;
   3094         break;
   3095         case NFA_RW_OP_DETECT_LOCK_TLV:
   3096     case NFA_RW_OP_DETECT_MEM_TLV:
   3097         event = NFA_TLV_DETECT_EVT;
   3098         break;
   3099     case NFA_RW_OP_SET_TAG_RO:
   3100         event = NFA_SET_TAG_RO_EVT;
   3101         break;
   3102     case NFA_RW_OP_T2T_SECTOR_SELECT:
   3103         event = NFA_SELECT_CPLT_EVT;
   3104         break;
   3105     case NFA_RW_OP_I93_INVENTORY:
   3106     case NFA_RW_OP_I93_STAY_QUIET:
   3107     case NFA_RW_OP_I93_READ_SINGLE_BLOCK:
   3108     case NFA_RW_OP_I93_WRITE_SINGLE_BLOCK:
   3109     case NFA_RW_OP_I93_LOCK_BLOCK:
   3110     case NFA_RW_OP_I93_READ_MULTI_BLOCK:
   3111     case NFA_RW_OP_I93_WRITE_MULTI_BLOCK:
   3112     case NFA_RW_OP_I93_SELECT:
   3113     case NFA_RW_OP_I93_RESET_TO_READY:
   3114     case NFA_RW_OP_I93_WRITE_AFI:
   3115     case NFA_RW_OP_I93_LOCK_AFI:
   3116     case NFA_RW_OP_I93_WRITE_DSFID:
   3117     case NFA_RW_OP_I93_LOCK_DSFID:
   3118     case NFA_RW_OP_I93_GET_SYS_INFO:
   3119     case NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS:
   3120         event = NFA_I93_CMD_CPLT_EVT;
   3121         break;
   3122     default:
   3123         return (freebuf);
   3124     }
   3125     nfa_dm_act_conn_cback_notify(event, &conn_evt_data);
   3126 
   3127     return (freebuf);
   3128 }
   3129 
   3130 /*******************************************************************************
   3131 **
   3132 ** Function         nfa_rw_command_complete
   3133 **
   3134 ** Description      Handle command complete: clear the busy flag,
   3135 **                  and start the presence check timer if applicable.
   3136 **
   3137 ** Returns          None
   3138 **
   3139 *******************************************************************************/
   3140 void nfa_rw_command_complete(void)
   3141 {
   3142     /* Clear the busy flag */
   3143     nfa_rw_cb.flags &= ~NFA_RW_FL_API_BUSY;
   3144 
   3145     /* Restart presence_check timer */
   3146     nfa_rw_check_start_presence_check_timer (NFA_RW_PRESENCE_CHECK_INTERVAL);
   3147 }
   3148