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

/******************************************************************************
 *
 *  This file contains the implementation for Type 3 tag in Reader/Writer
 *  mode.
 *
 ******************************************************************************/
#include <string.h>

#include <android-base/stringprintf.h>
#include <base/logging.h>
#include <log/log.h>

#include "nfc_target.h"

#include "bt_types.h"
#include "nci_hmsgs.h"
#include "nfc_api.h"
#include "nfc_int.h"
#include "rw_api.h"
#include "rw_int.h"

using android::base::StringPrintf;

extern bool nfc_debug_enabled;

/* Definitions for constructing t3t command messages */
#define RW_T3T_FL_PADDING 0x01 /* Padding needed for last NDEF block */
/* Maximum number of NDEF blocks updates that can fit into one command (when all
 * block-numbers are < 256) */
#define RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT (13)
/* Maximum number of NDEF blocks updates that can fit into one command (when all
 * block-numbers are >= 256) */
#define RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_2_BYTE_FORMAT (12)

/* Definitions for SENSF_RES */
/* Offset of RD in SENSF_RES from NCI_POLL NTF (includes 1 byte SENSF_RES
 * length) */
#define RW_T3T_SENSF_RES_RD_OFFSET 17
#define RW_T3T_SENSF_RES_RD_LEN 2 /* Size of RD in SENSF_RES   */

/* Timeout definitions for commands */
#define RW_T3T_POLL_CMD_TIMEOUT_TICKS \
  ((RW_T3T_TOUT_RESP * 2 * QUICK_TIMER_TICKS_PER_SEC) / 1000)
#define RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS \
  ((RW_T3T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000)
#define RW_T3T_RAW_FRAME_CMD_TIMEOUT_TICKS \
  (RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS * 4)
#define RW_T3T_MIN_TIMEOUT_TICKS 10

/* Macro to extract major version from NDEF version byte */
#define T3T_GET_MAJOR_VERSION(ver) ((ver) >> 4)

/* Enumeration of API commands */
enum {
  RW_T3T_CMD_DETECT_NDEF,
  RW_T3T_CMD_CHECK_NDEF,
  RW_T3T_CMD_UPDATE_NDEF,
  RW_T3T_CMD_CHECK,
  RW_T3T_CMD_UPDATE,
  RW_T3T_CMD_SEND_RAW_FRAME,
  RW_T3T_CMD_GET_SYSTEM_CODES,
  RW_T3T_CMD_FORMAT,
  RW_T3T_CMD_SET_READ_ONLY_SOFT,
  RW_T3T_CMD_SET_READ_ONLY_HARD,

  RW_T3T_CMD_MAX
};

/* RW_CBACK events corresponding to API comands */
const uint8_t rw_t3t_api_res_evt[RW_T3T_CMD_MAX] = {
    RW_T3T_NDEF_DETECT_EVT,       /* RW_T3T_CMD_DETECT_NDEF */
    RW_T3T_CHECK_CPLT_EVT,        /* RW_T3T_CMD_CHECK_NDEF  */
    RW_T3T_UPDATE_CPLT_EVT,       /* RW_T3T_CMD_UPDATE_NDEF */
    RW_T3T_CHECK_CPLT_EVT,        /* RW_T3T_CMD_CHECK */
    RW_T3T_UPDATE_CPLT_EVT,       /* RW_T3T_CMD_UPDATE */
    RW_T3T_RAW_FRAME_EVT,         /* RW_T3T_CMD_SEND_RAW_FRAME */
    RW_T3T_GET_SYSTEM_CODES_EVT,  /* RW_T3T_CMD_GET_SYSTEM_CODES */
    RW_T3T_FORMAT_CPLT_EVT,       /* RW_T3T_CMD_FORMAT */
    RW_T3T_SET_READ_ONLY_CPLT_EVT /* RW_T3T_CMD_SET_READ_ONLY */
};

/* States */
enum {
  RW_T3T_STATE_NOT_ACTIVATED,
  RW_T3T_STATE_IDLE,
  RW_T3T_STATE_COMMAND_PENDING
};

/* Sub-states */
enum {
  /* Sub states for formatting Felica-Lite */
  RW_T3T_FMT_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for
                                      formatting) */
  RW_T3T_FMT_SST_CHECK_MC_BLK,     /* Waiting for Felica-Lite MC (MemoryControl)
                                      block-read to complete */
  RW_T3T_FMT_SST_UPDATE_MC_BLK,    /* Waiting for Felica-Lite MC (MemoryControl)
                                      block-write to complete */
  RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write
                                        to complete */

  /* Sub states for setting Felica-Lite read only */
  RW_T3T_SRO_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for
                                      setting read only) */
  RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write
                                        to complete */
  RW_T3T_SRO_SST_CHECK_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl)
                                  block-read to complete */
  RW_T3T_SRO_SST_UPDATE_MC_BLK /* Waiting for Felica-Lite MC (MemoryControl)
                                  block-write to complete */
};

static std::string rw_t3t_cmd_str(uint8_t cmd_id);
static std::string rw_t3t_state_str(uint8_t state_id);

/* Local static functions */
static void rw_t3t_update_ndef_flag(uint8_t* p_flag);
static tNFC_STATUS rw_t3t_unselect();
static NFC_HDR* rw_t3t_get_cmd_buf(void);
static tNFC_STATUS rw_t3t_send_to_lower(NFC_HDR* p_msg);
static void rw_t3t_handle_get_system_codes_cplt(void);
static void rw_t3t_handle_get_sc_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
                                          uint8_t num_responses,
                                          uint8_t sensf_res_buf_size,
                                          uint8_t* p_sensf_res_buf);
static void rw_t3t_handle_ndef_detect_poll_rsp(tRW_T3T_CB* p_cb,
                                               uint8_t nci_status,
                                               uint8_t num_responses);
static void rw_t3t_handle_fmt_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
                                       uint8_t num_responses);
static void rw_t3t_handle_sro_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
                                       uint8_t num_responses);

/* Default NDEF attribute information block (used when formatting Felica-Lite
 * tags) */
/* NBr (max block reads per cmd)*/
#define RW_T3T_DEFAULT_FELICALITE_NBR 4
/* NBw (max block write per cmd)*/
#define RW_T3T_DEFAULT_FELICALITE_NBW 1
#define RW_T3T_DEFAULT_FELICALITE_NMAXB (T3T_FELICALITE_NMAXB)
#define RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM                       \
  ((T3T_MSG_NDEF_VERSION + RW_T3T_DEFAULT_FELICALITE_NBR +                   \
    RW_T3T_DEFAULT_FELICALITE_NBW + (RW_T3T_DEFAULT_FELICALITE_NMAXB >> 8) + \
    (RW_T3T_DEFAULT_FELICALITE_NMAXB & 0xFF) + T3T_MSG_NDEF_WRITEF_OFF +     \
    T3T_MSG_NDEF_RWFLAG_RW) &                                                \
   0xFFFF)

const uint8_t rw_t3t_default_attrib_info[T3T_MSG_BLOCKSIZE] = {
    T3T_MSG_NDEF_VERSION,                     /* Ver                          */
    RW_T3T_DEFAULT_FELICALITE_NBR,            /* NBr (max block reads per cmd)*/
    RW_T3T_DEFAULT_FELICALITE_NBW,            /* NBw (max block write per cmd)*/
    (RW_T3T_DEFAULT_FELICALITE_NMAXB >> 8),   /* Nmaxb (max size in blocks)   */
    (RW_T3T_DEFAULT_FELICALITE_NMAXB & 0xFF), /* Nmaxb (max size in blocks)   */
    0, 0, 0, 0,                               /* Unused                       */
    T3T_MSG_NDEF_WRITEF_OFF,                  /* WriteF                       */
    T3T_MSG_NDEF_RWFLAG_RW,                   /* RW Flag                      */
    0, 0, 0,                                  /* Ln (current size in bytes)   */

    (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM >>
     8), /* checksum (high-byte) */
    (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM &
     0xFF) /* checksum (low-byte)  */

};

/* This is (T/t3t * 4^E) , E is the index of the array. The unit is .0001 ms */
static const uint32_t rw_t3t_mrti_base[] = {302, 1208, 4832, 19328};

/*******************************************************************************
**
** Function         rw_t3t_check_timeout
**
** Description      The timeout value is a + b * number_blocks)
**
** Returns          timeout value in ticks
**
*******************************************************************************/
static uint32_t rw_t3t_check_timeout(uint16_t num_blocks) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  uint32_t timeout;
  uint32_t extra;

  timeout = (p_cb->check_tout_a + num_blocks * p_cb->check_tout_b) *
            QUICK_TIMER_TICKS_PER_SEC / 1000000;
  /* allow some extra time for driver */
  extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS;
  timeout += extra;

  return timeout;
}

/*******************************************************************************
**
** Function         rw_t3t_update_timeout
**
** Description      The timeout value is a + b * number_blocks)
**
** Returns          timeout value in ticks
**
*******************************************************************************/
static uint32_t rw_t3t_update_timeout(uint16_t num_blocks) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  uint32_t timeout;
  uint32_t extra;

  timeout = (p_cb->update_tout_a + num_blocks * p_cb->update_tout_b) *
            QUICK_TIMER_TICKS_PER_SEC / 1000000;
  /* allow some extra time for driver */
  extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS;
  timeout += extra;

  return timeout;
}
/*******************************************************************************
**
** Function         rw_t3t_process_error
**
** Description      Process error (timeout or CRC error)
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_process_error(tNFC_STATUS status) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  uint8_t evt;
  tRW_DATA evt_data;
  NFC_HDR* p_cmd_buf;

  if (p_cb->rw_state == RW_T3T_STATE_COMMAND_PENDING) {
    if (p_cb->cur_cmd == RW_T3T_CMD_GET_SYSTEM_CODES) {
      /* For GetSystemCode: tag did not respond to requested POLL */
      rw_t3t_handle_get_system_codes_cplt();
      return;
    } else if ((p_cb->flags & (RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP |
                               RW_T3T_FL_W4_GET_SC_POLL_RSP |
                               RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP |
                               RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP |
                               RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP |
                               RW_T3T_FL_W4_USER_POLL_RSP))) {
      /* Tag did not respond correctly to requested POLL */
      return;
    }
    /* Retry sending command if retry-count < max */
    else if (rw_cb.cur_retry < RW_MAX_RETRIES) {
      /* retry sending the command */
      rw_cb.cur_retry++;

      DLOG_IF(INFO, nfc_debug_enabled)
          << StringPrintf("T3T retransmission attempt %i of %i",
                          rw_cb.cur_retry, RW_MAX_RETRIES);

      /* allocate a new buffer for message */
      p_cmd_buf = rw_t3t_get_cmd_buf();
      if (p_cmd_buf != nullptr) {
        memcpy(p_cmd_buf, p_cb->p_cur_cmd_buf, sizeof(NFC_HDR) +
                                                   p_cb->p_cur_cmd_buf->offset +
                                                   p_cb->p_cur_cmd_buf->len);

        if (rw_t3t_send_to_lower(p_cmd_buf) == NFC_STATUS_OK) {
          /* Start timer for waiting for response */
          nfc_start_quick_timer(&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE,
                                p_cb->cur_tout);
          return;
        } else {
          android_errorWriteLog(0x534e4554, "179687208");
        }
      }
    } else {
      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
          "T3T maximum retransmission attempts reached (%i)", RW_MAX_RETRIES);
    }

#if (RW_STATS_INCLUDED == TRUE)
    /* update failure count */
    rw_main_update_fail_stats();
#endif /* RW_STATS_INCLUDED */

    p_cb->rw_state = RW_T3T_STATE_IDLE;

    /* Notify app of result (if there was a pending command) */
    if (p_cb->cur_cmd < RW_T3T_CMD_MAX) {
      /* If doing presence check, use status=NFC_STATUS_FAILED, otherwise
       * NFC_STATUS_TIMEOUT */
      evt_data.status = status;
      if (rw_cb.cur_retry < RW_MAX_RETRIES)
        evt = rw_t3t_api_res_evt[p_cb->cur_cmd];
      else
        evt = RW_T3T_INTF_ERROR_EVT;

      /* Set additional flags for RW_T3T_NDEF_DETECT_EVT */
      if (evt == RW_T3T_NDEF_DETECT_EVT) {
        evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN;
        rw_t3t_update_ndef_flag(&evt_data.ndef.flags);
      }

      (*(rw_cb.p_cback))(evt, &evt_data);
    }
  } else {
    evt_data.status = status;
    (*(rw_cb.p_cback))(RW_T3T_INTF_ERROR_EVT, &evt_data);
  }
}

/*******************************************************************************
**
** Function         rw_t3t_start_poll_timer
**
** Description      Start the timer for T3T POLL Command
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_start_poll_timer(tRW_T3T_CB* p_cb) {
  nfc_start_quick_timer(&p_cb->poll_timer, NFC_TTYPE_RW_T3T_RESPONSE,
                        RW_T3T_POLL_CMD_TIMEOUT_TICKS);
}

/*******************************************************************************
**
** Function         rw_t3t_handle_nci_poll_ntf
**
** Description      Handle NCI_T3T_POLLING_NTF
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_handle_nci_poll_ntf(uint8_t nci_status, uint8_t num_responses,
                                uint8_t sensf_res_buf_size,
                                uint8_t* p_sensf_res_buf) {
  tRW_DATA evt_data;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  /* stop timer for poll response */
  nfc_stop_quick_timer(&p_cb->poll_timer);

  /* Stop t3t timer (if started) */
  if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) {
    p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP;
    evt_data.status = nci_status;
    p_cb->rw_state = RW_T3T_STATE_IDLE;
    (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, &evt_data);
  } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) {
    /* Handle POLL ntf in response to get system codes */
    p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP;
    rw_t3t_handle_get_sc_poll_rsp(p_cb, nci_status, num_responses,
                                  sensf_res_buf_size, p_sensf_res_buf);
  } else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) {
    /* Handle POLL ntf in response to get system codes */
    p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP;
    rw_t3t_handle_fmt_poll_rsp(p_cb, nci_status, num_responses);
  } else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) {
    /* Handle POLL ntf in response to get system codes */
    p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP;
    rw_t3t_handle_sro_poll_rsp(p_cb, nci_status, num_responses);
  } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) {
    /* Handle POLL ntf in response to ndef detection */
    p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP;
    rw_t3t_handle_ndef_detect_poll_rsp(p_cb, nci_status, num_responses);
  } else {
    /* Handle POLL ntf in response to RW_T3tPoll */
    p_cb->flags &= ~RW_T3T_FL_W4_USER_POLL_RSP;
    evt_data.t3t_poll.status = nci_status;
    if (evt_data.t3t_poll.status == NCI_STATUS_OK) {
      evt_data.t3t_poll.rc = p_cb->cur_poll_rc;
      evt_data.t3t_poll.response_num = num_responses;
      evt_data.t3t_poll.response_bufsize = sensf_res_buf_size;
      evt_data.t3t_poll.response_buf = p_sensf_res_buf;
    }

    p_cb->rw_state = RW_T3T_STATE_IDLE;
    (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, &evt_data);
  }
}

/*******************************************************************************
**
** Function         rw_t3t_handle_get_system_codes_cplt
**
** Description      Notify upper layer of system codes
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_handle_get_system_codes_cplt(void) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  tRW_DATA evt_data;
  uint8_t i;

  evt_data.t3t_sc.status = NFC_STATUS_OK;
  evt_data.t3t_sc.num_system_codes = p_cb->num_system_codes;
  evt_data.t3t_sc.p_system_codes = p_cb->system_codes;

  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
      "number of systems: %i", evt_data.t3t_sc.num_system_codes);
  for (i = 0; i < evt_data.t3t_sc.num_system_codes; i++) {
    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
        "system %i: %04X", i, evt_data.t3t_sc.p_system_codes[i]);
  }

  p_cb->rw_state = RW_T3T_STATE_IDLE;
  (*(rw_cb.p_cback))(RW_T3T_GET_SYSTEM_CODES_EVT, &evt_data);
}

/*******************************************************************************
**
** Function         rw_t3t_format_cplt
**
** Description      Notify upper layer of format complete
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_format_cplt(tNFC_STATUS status) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  tRW_DATA evt_data;

  p_cb->rw_state = RW_T3T_STATE_IDLE;

  /* Update ndef info */
  p_cb->ndef_attrib.status = status;
  if (status == NFC_STATUS_OK) {
    p_cb->ndef_attrib.version = T3T_MSG_NDEF_VERSION;
    p_cb->ndef_attrib.nbr = RW_T3T_DEFAULT_FELICALITE_NBR;
    p_cb->ndef_attrib.nbw = RW_T3T_DEFAULT_FELICALITE_NBW;
    p_cb->ndef_attrib.nmaxb = RW_T3T_DEFAULT_FELICALITE_NMAXB;
    p_cb->ndef_attrib.writef = T3T_MSG_NDEF_WRITEF_OFF;
    p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RW;
    p_cb->ndef_attrib.ln = 0;
  }

  /* Notify upper layer of format complete */
  evt_data.status = status;
  (*(rw_cb.p_cback))(RW_T3T_FORMAT_CPLT_EVT, &evt_data);
}

/*******************************************************************************
**
** Function         rw_t3t_set_readonly_cplt
**
** Description      Notify upper layer of set read only complete
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_set_readonly_cplt(tNFC_STATUS status) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  tRW_DATA evt_data;

  p_cb->rw_state = RW_T3T_STATE_IDLE;

  /* Notify upper layer of format complete */
  evt_data.status = status;
  (*(rw_cb.p_cback))(RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data);
}

/*******************************************************************************
**
** Function         rw_t3t_process_timeout
**
** Description      Process timeout
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_process_timeout(TIMER_LIST_ENT* p_tle) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  tRW_DATA evt_data;

  /* Check which timer timed out */
  if (p_tle == &p_cb->timer) {
/* UPDATE/CHECK response timeout */
LOG(ERROR) << StringPrintf("T3T timeout. state=%s cur_cmd=0x%02X (%s)",
                           rw_t3t_state_str(rw_cb.tcb.t3t.rw_state).c_str(),
                           rw_cb.tcb.t3t.cur_cmd,
                           rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd).c_str());

rw_t3t_process_error(NFC_STATUS_TIMEOUT);
  } else {
    LOG(ERROR) << StringPrintf("T3T POLL timeout.");

    /* POLL response timeout */
    if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) {
      /* POLL timeout for presence check */
      p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP;
      evt_data.status = NFC_STATUS_FAILED;
      p_cb->rw_state = RW_T3T_STATE_IDLE;
      (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, &evt_data);
    } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) {
      /* POLL timeout for getting system codes */
      p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP;
      rw_t3t_handle_get_system_codes_cplt();
    } else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) {
      /* POLL timeout for formatting Felica Lite */
      p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP;
      LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
      rw_t3t_format_cplt(NFC_STATUS_FAILED);
    } else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) {
      /* POLL timeout for configuring Felica Lite read only */
      p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP;
      LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
      rw_t3t_set_readonly_cplt(NFC_STATUS_FAILED);
    } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) {
      /* POLL timeout for ndef detection */
      p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP;
      rw_t3t_handle_ndef_detect_poll_rsp(p_cb, NFC_STATUS_TIMEOUT, 0);
    } else {
      /* Timeout waiting for response for RW_T3tPoll */
      evt_data.t3t_poll.status = NFC_STATUS_FAILED;
      p_cb->rw_state = RW_T3T_STATE_IDLE;
      (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, &evt_data);
    }
  }
}

/*******************************************************************************
**
** Function         rw_t3t_process_frame_error
**
** Description      Process frame crc error
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_process_frame_error(void) {
  LOG(ERROR) << StringPrintf("T3T frame error. state=%s cur_cmd=0x%02X (%s)",
                             rw_t3t_state_str(rw_cb.tcb.t3t.rw_state).c_str(),
                             rw_cb.tcb.t3t.cur_cmd,
                             rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd).c_str());

#if (RW_STATS_INCLUDED == TRUE)
  /* Update stats */
  rw_main_update_crc_error_stats();
#endif /* RW_STATS_INCLUDED */

  /* Process the error */
  rw_t3t_process_error(NFC_STATUS_MSG_CORRUPTED);
}

/*******************************************************************************
**
** Function         rw_t3t_send_to_lower
**
** Description      Send command to lower layer
**
** Returns          status of the send
**
*******************************************************************************/
tNFC_STATUS rw_t3t_send_to_lower(NFC_HDR* p_msg) {
  uint8_t* p;

#if (RW_STATS_INCLUDED == TRUE)
  bool is_retry;
  /* Update stats */
  rw_main_update_tx_stats(p_msg->len, ((rw_cb.cur_retry == 0) ? false : true));
#endif /* RW_STATS_INCLUDED */

  /* Set NFC-F SoD field (payload len + 1) */
  if (p_msg->offset) p_msg->offset -= 1; /* Point to SoD field */
  p = (uint8_t*)(p_msg + 1) + p_msg->offset;
  UINT8_TO_STREAM(p, (p_msg->len + 1));
  p_msg->len += 1; /* Increment len to include SoD */

  return (NFC_SendData(NFC_RF_CONN_ID, p_msg));
}

/*****************************************************************************
**
** Function         rw_t3t_get_cmd_buf
**
** Description      Get a buffer for sending T3T messages
**
** Returns          NFC_HDR *
**
*****************************************************************************/
NFC_HDR* rw_t3t_get_cmd_buf(void) {
  NFC_HDR* p_cmd_buf;

  p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
  if (p_cmd_buf != nullptr) {
    /* Reserve offset for NCI_DATA_HDR and NFC-F Sod (LEN) field */
    p_cmd_buf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + 1;
    p_cmd_buf->len = 0;
  }

  return (p_cmd_buf);
}

/*****************************************************************************
**
** Function         rw_t3t_send_cmd
**
** Description      Send command to tag, and start timer for response
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_send_cmd(tRW_T3T_CB* p_cb, uint8_t rw_t3t_cmd,
                            NFC_HDR* p_cmd_buf, uint32_t timeout_ticks) {
  tNFC_STATUS retval;

  /* Indicate first attempt to send command, back up cmd buffer in case needed
   * for retransmission */
  rw_cb.cur_retry = 0;
  memcpy(p_cb->p_cur_cmd_buf, p_cmd_buf,
         sizeof(NFC_HDR) + p_cmd_buf->offset + p_cmd_buf->len);

  p_cb->cur_cmd = rw_t3t_cmd;
  p_cb->cur_tout = timeout_ticks;
  p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING;

  retval = rw_t3t_send_to_lower(p_cmd_buf);
  if (retval == NFC_STATUS_OK) {
    /* Start timer for waiting for response */
    nfc_start_quick_timer(&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE,
                          timeout_ticks);
  } else {
    /* Error sending */
    p_cb->rw_state = RW_T3T_STATE_IDLE;
  }

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("cur_tout: %d, timeout_ticks: %d ret:%d", p_cb->cur_tout,
                      timeout_ticks, retval);
  return (retval);
}

/*****************************************************************************
**
** Function         rw_t3t_send_update_ndef_attribute_cmd
**
** Description      Send UPDATE command for Attribute Information
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_send_update_ndef_attribute_cmd(tRW_T3T_CB* p_cb,
                                                  bool write_in_progress) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  NFC_HDR* p_cmd_buf;
  uint8_t *p_cmd_start, *p;
  uint16_t checksum, i;
  uint8_t write_f;
  uint32_t ln;
  uint8_t* p_ndef_attr_info_start;

  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    /* Construct T3T message */
    p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;

    /* Add UPDATE opcode to message  */
    UINT8_TO_STREAM(p, T3T_MSG_OPC_UPDATE_CMD);

    /* Add IDm to message */
    ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN);

    /* Add Service code list */
    UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */
    UINT16_TO_STREAM(
        p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */

    /* Add number of blocks in this UPDATE command */
    UINT8_TO_STREAM(p, 1); /* Number of blocks to write in this command */

    /* Block List element: the NDEF attribute information block (block 0) */
    UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT);
    UINT8_TO_STREAM(p, 0);

    /* Add payload (Attribute information block) */
    p_ndef_attr_info_start =
        p; /* Save start of a NDEF attribute info block for checksum */
    UINT8_TO_STREAM(p, T3T_MSG_NDEF_VERSION);
    UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbr);
    UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbw);
    UINT16_TO_BE_STREAM(p, p_cb->ndef_attrib.nmaxb);
    UINT32_TO_STREAM(p, 0);

    /* If starting NDEF write: set WriteF=ON, and ln=current ndef length */
    if (write_in_progress) {
      write_f = T3T_MSG_NDEF_WRITEF_ON;
      ln = p_cb->ndef_attrib.ln;
    }
    /* If finishing NDEF write: set WriteF=OFF, and ln=new ndef len */
    else {
      write_f = T3T_MSG_NDEF_WRITEF_OFF;
      ln = p_cb->ndef_msg_len;
    }
    UINT8_TO_STREAM(p, write_f);
    UINT8_TO_STREAM(p, p_cb->ndef_attrib.rwflag);
    UINT8_TO_STREAM(p, (ln >> 16) & 0xFF); /* High byte (of 3) of Ln */
    UINT8_TO_STREAM(p, (ln >> 8) & 0xFF);  /* Middle byte (of 3) of Ln */
    UINT8_TO_STREAM(p, (ln)&0xFF);         /* Low byte (of 3) of Ln */

    /* Calculate and append Checksum */
    checksum = 0;
    for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) {
      checksum += p_ndef_attr_info_start[i];
    }
    UINT16_TO_BE_STREAM(p, checksum);

    /* Calculate length of message */
    p_cmd_buf->len = (uint16_t)(p - p_cmd_start);

    /* Send the T3T message */
    retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf,
                             rw_t3t_update_timeout(1));
  } else {
    retval = NFC_STATUS_NO_BUFFERS;
  }

  return (retval);
}

/*****************************************************************************
**
** Function         rw_t3t_send_next_ndef_update_cmd
**
** Description      Send next segment of NDEF message to update
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_send_next_ndef_update_cmd(tRW_T3T_CB* p_cb) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  uint16_t block_id;
  uint16_t first_block_to_write;
  uint16_t ndef_blocks_to_write, ndef_blocks_remaining;
  uint32_t ndef_bytes_remaining, ndef_padding = 0;
  uint8_t flags = 0;
  uint8_t* p_cur_ndef_src_offset;
  NFC_HDR* p_cmd_buf;
  uint8_t *p_cmd_start, *p;
  uint8_t blocks_per_update;
  uint32_t timeout;

  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    /* Construct T3T message */
    p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;

    /* Calculate number of ndef bytes remaining to write */
    ndef_bytes_remaining = p_cb->ndef_msg_len - p_cb->ndef_msg_bytes_sent;

    /* Calculate number of blocks remaining to write */
    ndef_blocks_remaining =
        (uint16_t)((ndef_bytes_remaining + 15) >>
                   4); /* ndef blocks remaining (rounded upward) */

    /* Calculate first NDEF block ID for this UPDATE command */
    first_block_to_write = (uint16_t)((p_cb->ndef_msg_bytes_sent >> 4) + 1);

    /* Calculate max number of blocks per write. */
    if ((first_block_to_write +
         RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT) < 0x100) {
      /* All block-numbers are < 0x100 (i.e. can be specified using one-byte
       * format) */
      blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT;
    } else {
      /* Block-numbers are >= 0x100 (i.e. need to be specified using two-byte
       * format) */
      blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_2_BYTE_FORMAT;
    }

    /* Check if blocks_per_update is bigger than what peer allows */
    if (blocks_per_update > p_cb->ndef_attrib.nbw)
      blocks_per_update = p_cb->ndef_attrib.nbw;

    /* Check if remaining blocks can fit into one UPDATE command */
    if (ndef_blocks_remaining <= blocks_per_update) {
      /* remaining blocks can fit into one UPDATE command */
      ndef_blocks_to_write = ndef_blocks_remaining;
    } else {
      /* Remaining blocks cannot fit into one UPDATE command */
      ndef_blocks_to_write = blocks_per_update;
    }

    /* Write to command header for UPDATE */

    /* Add UPDATE opcode to message  */
    UINT8_TO_STREAM(p, T3T_MSG_OPC_UPDATE_CMD);

    /* Add IDm to message */
    ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN);

    /* Add Service code list */
    UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */
    UINT16_TO_STREAM(
        p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */

    /* Add number of blocks in this UPDATE command */
    UINT8_TO_STREAM(
        p,
        ndef_blocks_to_write); /* Number of blocks to write in this command */
    timeout = rw_t3t_update_timeout(ndef_blocks_to_write);

    for (block_id = first_block_to_write;
         block_id < (first_block_to_write + ndef_blocks_to_write); block_id++) {
      if (block_id < 256) {
        /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0,
         * byte1=blocknumber */
        UINT8_TO_STREAM(
            p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte0: len=1;
                                                            access-mode=0;
                                                            service code list
                                                            order=0 */
        UINT8_TO_STREAM(p, block_id); /* byte1: block number */
      } else {
        /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h,
         * followed by blocknumber */
        UINT8_TO_STREAM(
            p,
            0x00); /* byte0: len=0; access-mode=0; service code list order=0 */
        UINT16_TO_STREAM(
            p, block_id); /* byte1-2: block number in little-endian format */
      }
    }

    /* Add NDEF payload */

    /* If this sending last block of NDEF,  check if padding is needed to make
     * payload a multiple of 16 bytes */
    if (ndef_blocks_to_write == ndef_blocks_remaining) {
      ndef_padding = (16 - (ndef_bytes_remaining & 0x0F)) & 0x0F;
      if (ndef_padding) {
        flags |= RW_T3T_FL_PADDING;
        ndef_blocks_to_write--; /* handle the last block separately if it needs
                                   padding */
      }
    }

    /* Add NDEF payload to the message */
    p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent];

    ARRAY_TO_STREAM(p, p_cur_ndef_src_offset, (ndef_blocks_to_write * 16));
    p_cb->ndef_msg_bytes_sent += ((uint32_t)ndef_blocks_to_write * 16);

    if (flags & RW_T3T_FL_PADDING) {
      /* Add last of the NDEF message */
      p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent];
      ARRAY_TO_STREAM(p, p_cur_ndef_src_offset, (int)(16 - ndef_padding));
      p_cb->ndef_msg_bytes_sent += (16 - ndef_padding);

      /* Add padding */
      memset(p, 0, ndef_padding);
      p += ndef_padding;
    }

    /* Calculate length of message */
    p_cmd_buf->len = (uint16_t)(p - p_cmd_start);

    /* Send the T3T message */
    retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf, timeout);
  } else {
    retval = NFC_STATUS_NO_BUFFERS;
  }

  return (retval);
}

/*****************************************************************************
**
** Function         rw_t3t_send_next_ndef_check_cmd
**
** Description      Send command for reading next segment of NDEF message
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_send_next_ndef_check_cmd(tRW_T3T_CB* p_cb) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  uint16_t block_id;
  uint16_t ndef_blocks_remaining, first_block_to_read, cur_blocks_to_read;
  uint32_t ndef_bytes_remaining;
  NFC_HDR* p_cmd_buf;
  uint8_t *p_cmd_start, *p;

  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    /* Construct T3T message */
    p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;

    /* Calculate number of ndef bytes remaining to read */
    ndef_bytes_remaining = p_cb->ndef_attrib.ln - p_cb->ndef_rx_offset;

    /* Calculate number of blocks remaining to read */
    ndef_blocks_remaining =
        (uint16_t)((ndef_bytes_remaining + 15) >>
                   4); /* ndef blocks remaining (rounded upward) */

    /* Calculate first NDEF block ID */
    first_block_to_read = (uint16_t)((p_cb->ndef_rx_offset >> 4) + 1);

    /* Check if remaining blocks can fit into one CHECK command */
    if (ndef_blocks_remaining <= p_cb->ndef_attrib.nbr) {
      /* remaining blocks can fit into one CHECK command */
      cur_blocks_to_read = ndef_blocks_remaining;
      p_cb->ndef_rx_readlen = ndef_bytes_remaining;
      p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT;
    } else {
      /* Remaining blocks cannot fit into one CHECK command */
      cur_blocks_to_read =
          p_cb->ndef_attrib
              .nbr; /* Read maximum number of blocks allowed by the peer */
      p_cb->ndef_rx_readlen = ((uint32_t)p_cb->ndef_attrib.nbr * 16);
    }

    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
        "bytes_remaining: %i, cur_blocks_to_read: %i, is_final: %i",
        ndef_bytes_remaining, cur_blocks_to_read,
        (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT));

    /* Add CHECK opcode to message  */
    UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD);

    /* Add IDm to message */
    ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN);

    /* Add Service code list */
    UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */

    /* Service code (little-endian format) . If NDEF is read-only, then use
     * T3T_MSG_NDEF_SC_RO, otherwise use T3T_MSG_NDEF_SC_RW */
    if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO) {
      UINT16_TO_STREAM(p, T3T_MSG_NDEF_SC_RO);
    } else {
      UINT16_TO_STREAM(p, T3T_MSG_NDEF_SC_RW);
    }

    /* Add number of blocks in this CHECK command */
    UINT8_TO_STREAM(
        p, cur_blocks_to_read); /* Number of blocks to check in this command */

    for (block_id = first_block_to_read;
         block_id < (first_block_to_read + cur_blocks_to_read); block_id++) {
      if (block_id < 256) {
        /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0,
         * byte1=blocknumber */
        UINT8_TO_STREAM(
            p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte1: len=0;
                                                            access-mode=0;
                                                            service code list
                                                            order=0 */
        UINT8_TO_STREAM(p, block_id); /* byte1: block number */
      } else {
        /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h,
         * followed by blocknumber */
        UINT8_TO_STREAM(
            p,
            0x00); /* byte0: len=1; access-mode=0; service code list order=0 */
        UINT16_TO_STREAM(
            p, block_id); /* byte1-2: block number in little-endian format */
      }
    }

    /* Calculate length of message */
    p_cmd_buf->len = (uint16_t)(p - p_cmd_start);

    /* Send the T3T message */
    retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_CHECK_NDEF, p_cmd_buf,
                             rw_t3t_check_timeout(cur_blocks_to_read));
  } else {
    retval = NFC_STATUS_NO_BUFFERS;
  }

  return (retval);
}

/*****************************************************************************
**
** Function         rw_t3t_message_set_block_list
**
** Description      Add block list to T3T message
**
** Returns          Number of bytes added to message
**
*****************************************************************************/
void rw_t3t_message_set_block_list(tRW_T3T_CB* p_cb, uint8_t** p,
                                   uint8_t num_blocks,
                                   tT3T_BLOCK_DESC* p_t3t_blocks) {
  uint16_t i, cur_service_code;
  uint8_t service_code_idx, num_services = 0;
  uint8_t* p_msg_num_services;
  uint16_t service_list[T3T_MSG_SERVICE_LIST_MAX];

  /* Add CHECK or UPDATE opcode to message  */
  UINT8_TO_STREAM(
      (*p), ((p_cb->cur_cmd == RW_T3T_CMD_CHECK) ? T3T_MSG_OPC_CHECK_CMD
                                                 : T3T_MSG_OPC_UPDATE_CMD));

  /* Add IDm to message */
  ARRAY_TO_STREAM((*p), p_cb->peer_nfcid2, NCI_NFCID2_LEN);

  /* Skip over Number of Services field */
  p_msg_num_services = (*p); /* pointer to Number of Services offset */
  (*p)++;

  /* Count number of different services are specified in the list, and add
   * services to Service Code list */
  for (i = 0; i < num_blocks; i++) {
    cur_service_code = p_t3t_blocks[i].service_code;

    /* Check if current service_code is already in the service_list */
    for (service_code_idx = 0; service_code_idx < num_services;
         service_code_idx++) {
      if (service_list[service_code_idx] == cur_service_code) break;
    }

    if (service_code_idx == num_services) {
      /* Service not in the list yet. Add it. */
      service_list[service_code_idx] = cur_service_code;
      num_services++;

      /* Add service code to T3T message */
      UINT16_TO_STREAM((*p), cur_service_code);

      /* Validate num_services */
      if (num_services >= T3T_MSG_SERVICE_LIST_MAX) {
        LOG(ERROR) << StringPrintf(
            "RW T3T: num_services (%i) reaches maximum (%i)", num_services,
            T3T_MSG_SERVICE_LIST_MAX);
        break;
      }
    }
  }

  /* Add 'Number of Sservices' to the message */
  *p_msg_num_services = num_services;

  /* Add 'number of blocks' to the message */
  UINT8_TO_STREAM((*p), num_blocks);

  /* Add block descriptors */
  for (i = 0; i < num_blocks; i++) {
    cur_service_code = p_t3t_blocks[i].service_code;

    /* Check if current service_code is already in the service_list */
    for (service_code_idx = 0; service_code_idx < num_services;
         service_code_idx++) {
      if (service_list[service_code_idx] == cur_service_code) break;
    }

    /* Add decriptor to T3T message */
    if (p_t3t_blocks[i].block_number > 0xFF) {
      UINT8_TO_STREAM((*p), service_code_idx);
      UINT16_TO_STREAM((*p), p_t3t_blocks[i].block_number);
    } else {
      service_code_idx |= T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT;
      UINT8_TO_STREAM((*p), service_code_idx);
      UINT8_TO_STREAM((*p), p_t3t_blocks[i].block_number);
    }
  }
}

/*****************************************************************************
**
** Function         rw_t3t_send_check_cmd
**
** Description      Send CHECK command
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_send_check_cmd(tRW_T3T_CB* p_cb, uint8_t num_blocks,
                                  tT3T_BLOCK_DESC* p_t3t_blocks) {
  NFC_HDR* p_cmd_buf;
  uint8_t *p, *p_cmd_start;
  tNFC_STATUS retval = NFC_STATUS_OK;

  p_cb->cur_cmd = RW_T3T_CMD_CHECK;
  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    /* Construct T3T message */
    p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;
    rw_t3t_message_set_block_list(p_cb, &p, num_blocks, p_t3t_blocks);

    /* Calculate length of message */
    p_cmd_buf->len = (uint16_t)(p - p_cmd_start);

    /* Send the T3T message */
    retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_CHECK, p_cmd_buf,
                             rw_t3t_check_timeout(num_blocks));
  } else {
    retval = NFC_STATUS_NO_BUFFERS;
  }

  return (retval);
}

/*****************************************************************************
**
** Function         rw_t3t_send_update_cmd
**
** Description      Send UPDATE command
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_send_update_cmd(tRW_T3T_CB* p_cb, uint8_t num_blocks,
                                   tT3T_BLOCK_DESC* p_t3t_blocks,
                                   uint8_t* p_data) {
  NFC_HDR* p_cmd_buf;
  uint8_t *p, *p_cmd_start;
  tNFC_STATUS retval = NFC_STATUS_OK;

  p_cb->cur_cmd = RW_T3T_CMD_UPDATE;
  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    /* Construct T3T message */
    p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;
    rw_t3t_message_set_block_list(p_cb, &p, num_blocks, p_t3t_blocks);

    /* Add data blocks to the message */
    ARRAY_TO_STREAM(p, p_data, num_blocks * 16);

    /* Calculate length of message */
    p_cmd_buf->len = (uint16_t)(p - p_cmd_start);

    /* Send the T3T message */
    retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE, p_cmd_buf,
                             rw_t3t_update_timeout(num_blocks));
  } else {
    retval = NFC_STATUS_NO_BUFFERS;
  }

  return (retval);
}

/*****************************************************************************
**
** Function         rw_t3t_check_mc_block
**
** Description      Send command to check Memory Configuration Block
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_check_mc_block(tRW_T3T_CB* p_cb) {
  NFC_HDR* p_cmd_buf;
  uint8_t *p, *p_cmd_start;

  /* Read Memory Configuration block */
  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    /* Construct T3T message */
    p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;

    /* Add CHECK opcode to message  */
    UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD);

    /* Add IDm to message */
    ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN);

    /* Add Service code list */
    UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */
    UINT16_TO_STREAM(
        p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */

    /* Number of blocks */
    UINT8_TO_STREAM(p, 1); /* Number of blocks (only 1 block: Memory
                              Configuration Information ) */

    /* Block List element: the Memory Configuration block (block 0x88) */
    UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT);
    UINT8_TO_STREAM(p, T3T_MSG_FELICALITE_BLOCK_ID_MC);

    /* Calculate length of message */
    p_cmd_buf->len = (uint16_t)(p - p_cmd_start);

    /* Send the T3T message */
    return rw_t3t_send_cmd(p_cb, p_cb->cur_cmd, p_cmd_buf,
                           rw_t3t_check_timeout(1));
  } else {
    LOG(ERROR) << StringPrintf("Unable to allocate buffer to read MC block");
    return (NFC_STATUS_NO_BUFFERS);
  }
}

/*****************************************************************************
**
** Function         rw_t3t_send_raw_frame
**
** Description      Send raw frame
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_send_raw_frame(tRW_T3T_CB* p_cb, uint16_t len,
                                  uint8_t* p_data) {
  NFC_HDR* p_cmd_buf;
  uint8_t* p;
  tNFC_STATUS retval = NFC_STATUS_OK;

  /* GKI_BUF2 is used for NFC_RW_POOL */
  if (len > GKI_BUF2_SIZE - NCI_MSG_OFFSET_SIZE - NCI_DATA_HDR_SIZE - 2) {
    android_errorWriteLog(0x534e4554, "157649467");
    return NFC_STATUS_NO_BUFFERS;
  }

  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    /* Construct T3T message */
    p = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;

    /* Add data blocks to the message */
    ARRAY_TO_STREAM(p, p_data, len);

    /* Calculate length of message */
    p_cmd_buf->len = len;

    /* Send the T3T message */
    retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_SEND_RAW_FRAME, p_cmd_buf,
                             RW_T3T_RAW_FRAME_CMD_TIMEOUT_TICKS);
  } else {
    retval = NFC_STATUS_NO_BUFFERS;
  }

  return (retval);
}

/*****************************************************************************
**  TAG RESPONSE HANDLERS
*****************************************************************************/

/*****************************************************************************
**
** Function         rw_t3t_act_handle_ndef_detect_rsp
**
** Description      Handle response to NDEF detection
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_ndef_detect_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
  uint8_t* p;
  uint32_t temp;
  uint8_t i;
  uint16_t checksum_calc, checksum_rx;
  tRW_DETECT_NDEF_DATA evt_data = tRW_DETECT_NDEF_DATA();
  uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;

  evt_data.status = NFC_STATUS_FAILED;
  evt_data.flags = RW_NDEF_FL_UNKNOWN;

  /* Check if response code is CHECK resp (for reading NDEF attribute block) */
  if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
    LOG(ERROR) << StringPrintf(
        "Response error: expecting rsp_code %02X, but got %02X",
        T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
    evt_data.status = NFC_STATUS_FAILED;
  }
  /* Validate status code and NFCID2 response from tag */
  else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] !=
            T3T_MSG_RSP_STATUS_OK) /* verify response status code */
           || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM],
                      NCI_NFCID2_LEN) != 0)) /* verify response IDm */
  {
    evt_data.status = NFC_STATUS_FAILED;
  } else if (p_msg_rsp->len <
             (T3T_MSG_RSP_OFFSET_CHECK_DATA + T3T_MSG_BLOCKSIZE)) {
    evt_data.status = NFC_STATUS_FAILED;
    android_errorWriteLog(0x534e4554, "120428041");
  } else {
    /* Get checksum from received ndef attribute msg */
    p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA + T3T_MSG_NDEF_ATTR_INFO_SIZE];
    BE_STREAM_TO_UINT16(checksum_rx, p);

    /* Calculate checksum - move check for checsum to beginning */
    checksum_calc = 0;
    p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA];
    for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) {
      checksum_calc += p[i];
    }

    /* Validate checksum */
    if (checksum_calc != checksum_rx) {
      p_cb->ndef_attrib.status =
          NFC_STATUS_FAILED; /* only ok or failed passed to the app. can be
                                boolean*/

      LOG(ERROR) << StringPrintf("RW_T3tDetectNDEF checksum failed");
    } else {
      p_cb->ndef_attrib.status = NFC_STATUS_OK;

      /* Validate version number */
      STREAM_TO_UINT8(p_cb->ndef_attrib.version, p);

      if (T3T_GET_MAJOR_VERSION(T3T_MSG_NDEF_VERSION) <
          T3T_GET_MAJOR_VERSION(p_cb->ndef_attrib.version)) {
        /* Remote tag's MajorVer is newer than our's. Reject NDEF as per T3TOP
         * RQ_T3T_NDA_024 */
        LOG(ERROR) << StringPrintf(
            "RW_T3tDetectNDEF: incompatible NDEF version. Local=0x%02x, "
            "Remote=0x%02x",
            T3T_MSG_NDEF_VERSION, p_cb->ndef_attrib.version);
        p_cb->ndef_attrib.status = NFC_STATUS_FAILED;
        evt_data.status = NFC_STATUS_BAD_RESP;
      } else {
        /* Remote tag's MajorVer is equal or older than our's. NDEF is
         * compatible with our version. */

        /* Update NDEF info */
        STREAM_TO_UINT8(
            p_cb->ndef_attrib.nbr,
            p); /* NBr: number of blocks that can be read using one Check
                   command */
        STREAM_TO_UINT8(p_cb->ndef_attrib.nbw,
                        p); /* Nbw: number of blocks that can be written using
                               one Update command */
        BE_STREAM_TO_UINT16(
            p_cb->ndef_attrib.nmaxb,
            p); /* Nmaxb: maximum number of blocks available for NDEF data */
        BE_STREAM_TO_UINT32(temp, p);
        STREAM_TO_UINT8(p_cb->ndef_attrib.writef,
                        p); /* WriteFlag: 00h if writing data finished; 0Fh if
                               writing data in progress */
        STREAM_TO_UINT8(
            p_cb->ndef_attrib.rwflag,
            p); /* RWFlag: 00h NDEF is read-only; 01h if read/write available */

        /* Get length (3-byte, big-endian) */
        STREAM_TO_UINT8(temp, p);                     /* Ln: high-byte */
        BE_STREAM_TO_UINT16(p_cb->ndef_attrib.ln, p); /* Ln: lo-word */
        p_cb->ndef_attrib.ln += (temp << 16);

        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
            "Detected NDEF Ver: 0x%02x", p_cb->ndef_attrib.version);
        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
            "Detected NDEF Attributes: Nbr=%i, Nbw=%i, Nmaxb=%i, WriteF=%i, "
            "RWFlag=%i, Ln=%i",
            p_cb->ndef_attrib.nbr, p_cb->ndef_attrib.nbw,
            p_cb->ndef_attrib.nmaxb, p_cb->ndef_attrib.writef,
            p_cb->ndef_attrib.rwflag, p_cb->ndef_attrib.ln);
        if (p_cb->ndef_attrib.nbr > T3T_MSG_NUM_BLOCKS_CHECK_MAX ||
            p_cb->ndef_attrib.nbw > T3T_MSG_NUM_BLOCKS_UPDATE_MAX) {
          /* It would result in CHECK Responses exceeding the maximum length
           * of an NFC-F Frame */
          LOG(ERROR) << StringPrintf(
              "Unsupported NDEF Attributes value: Nbr=%i, Nbw=%i, Nmaxb=%i,"
              "WriteF=%i, RWFlag=%i, Ln=%i",
              p_cb->ndef_attrib.nbr, p_cb->ndef_attrib.nbw,
              p_cb->ndef_attrib.nmaxb, p_cb->ndef_attrib.writef,
              p_cb->ndef_attrib.rwflag, p_cb->ndef_attrib.ln);
          p_cb->ndef_attrib.status = NFC_STATUS_FAILED;
          evt_data.status = NFC_STATUS_BAD_RESP;
        } else {
          /* Set data for RW_T3T_NDEF_DETECT_EVT */
          evt_data.status = p_cb->ndef_attrib.status;
          evt_data.cur_size = p_cb->ndef_attrib.ln;
          evt_data.max_size = (uint32_t)p_cb->ndef_attrib.nmaxb * 16;
          evt_data.protocol = NFC_PROTOCOL_T3T;
          evt_data.flags = (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED);
          if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO)
            evt_data.flags |= RW_NDEF_FL_READ_ONLY;
        }
      }
    }
  }

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("RW_T3tDetectNDEF response: %i", evt_data.status);

  p_cb->rw_state = RW_T3T_STATE_IDLE;
  rw_t3t_update_ndef_flag(&evt_data.flags);
  /* Notify app of NDEF detection result */
  tRW_DATA rw_data;
  rw_data.ndef = evt_data;
  (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, &rw_data);

  GKI_freebuf(p_msg_rsp);
}

/*****************************************************************************
**
** Function         rw_t3t_act_handle_check_rsp
**
** Description      Handle response to CHECK command
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_check_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
  uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;
  tRW_READ_DATA evt_data;
  tNFC_STATUS nfc_status = NFC_STATUS_OK;

  /* Validate response from tag */
  if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] !=
       T3T_MSG_RSP_STATUS_OK) /* verify response status code */
      || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM],
                 NCI_NFCID2_LEN) != 0)) /* verify response IDm */
  {
    nfc_status = NFC_STATUS_FAILED;
    GKI_freebuf(p_msg_rsp);
  } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
    LOG(ERROR) << StringPrintf(
        "Response error: expecting rsp_code %02X, but got %02X",
        T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
    nfc_status = NFC_STATUS_FAILED;
    GKI_freebuf(p_msg_rsp);
  } else if (p_msg_rsp->len >= T3T_MSG_RSP_OFFSET_CHECK_DATA) {
    /* Copy incoming data into buffer */
    p_msg_rsp->offset +=
        T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header */
    p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA;
    evt_data.status = NFC_STATUS_OK;
    evt_data.p_data = p_msg_rsp;
    tRW_DATA rw_data;
    rw_data.data = evt_data;
    (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, &rw_data);
  } else {
    android_errorWriteLog(0x534e4554, "120503926");
    nfc_status = NFC_STATUS_FAILED;
    GKI_freebuf(p_msg_rsp);
  }

  p_cb->rw_state = RW_T3T_STATE_IDLE;

  tRW_DATA rw_data;
  rw_data.status = nfc_status;
  (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, &rw_data);
}

/*****************************************************************************
**
** Function         rw_t3t_act_handle_update_rsp
**
** Description      Handle response to UPDATE command
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_update_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
  uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;
  tRW_READ_DATA evt_data = tRW_READ_DATA();

  /* Validate response from tag */
  if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] !=
       T3T_MSG_RSP_STATUS_OK) /* verify response status code */
      || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM],
                 NCI_NFCID2_LEN) != 0)) /* verify response IDm */
  {
    evt_data.status = NFC_STATUS_FAILED;
  } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) {
    LOG(ERROR) << StringPrintf(
        "Response error: expecting rsp_code %02X, but got %02X",
        T3T_MSG_OPC_UPDATE_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
    evt_data.status = NFC_STATUS_FAILED;
  } else {
    /* Copy incoming data into buffer */
    evt_data.status = NFC_STATUS_OK;
  }

  p_cb->rw_state = RW_T3T_STATE_IDLE;

  tRW_DATA rw_data;
  rw_data.data = evt_data;
  (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, &rw_data);

  GKI_freebuf(p_msg_rsp);
}

/*****************************************************************************
**
** Function         rw_t3t_act_handle_raw_senddata_rsp
**
** Description      Handle response to NDEF detection
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_raw_senddata_rsp(tRW_T3T_CB* p_cb,
                                        tNFC_DATA_CEVT* p_data) {
  tRW_READ_DATA evt_data;
  NFC_HDR* p_pkt = p_data->p_data;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("RW T3T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len,
                      NFC_GetStatusName(p_data->status).c_str());

  /* Copy incoming data into buffer */
  evt_data.status = p_data->status;
  evt_data.p_data = p_pkt;

  p_cb->rw_state = RW_T3T_STATE_IDLE;

  tRW_DATA rw_data;
  rw_data.data = evt_data;
  (*(rw_cb.p_cback))(RW_T3T_RAW_FRAME_EVT, &rw_data);
}

/*****************************************************************************
**
** Function         rw_t3t_act_handle_check_ndef_rsp
**
** Description      Handle response to NDEF read segment
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_check_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
  bool check_complete = true;
  tNFC_STATUS nfc_status = NFC_STATUS_OK;
  uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;
  uint8_t rsp_num_bytes_rx;

  if (p_msg_rsp->len < T3T_MSG_RSP_OFFSET_CHECK_DATA) {
    LOG(ERROR) << StringPrintf("%s invalid len", __func__);
    nfc_status = NFC_STATUS_FAILED;
    GKI_freebuf(p_msg_rsp);
    android_errorWriteLog(0x534e4554, "120428637");
    /* Validate response from tag */
  } else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] !=
              T3T_MSG_RSP_STATUS_OK) /* verify response status code */
             || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM],
                        NCI_NFCID2_LEN) != 0) /* verify response IDm */
             || (p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] !=
                 ((p_cb->ndef_rx_readlen + 15) >>
                  4))) /* verify length of response */
  {
    LOG(ERROR) << StringPrintf(
        "Response error: bad status, nfcid2, or invalid len: %i %i",
        p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS],
        ((p_cb->ndef_rx_readlen + 15) >> 4));
    nfc_status = NFC_STATUS_FAILED;
    GKI_freebuf(p_msg_rsp);
  } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
    LOG(ERROR) << StringPrintf(
        "Response error: expecting rsp_code %02X, but got %02X",
        T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
    nfc_status = NFC_STATUS_FAILED;
    GKI_freebuf(p_msg_rsp);
  } else if (p_msg_rsp->len >= T3T_MSG_RSP_OFFSET_CHECK_DATA &&
             p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] > 0) {
    /* Notify app of NDEF segment received */
    /* Number of bytes received, according to header */
    rsp_num_bytes_rx = p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] * 16;
    p_cb->ndef_rx_offset += p_cb->ndef_rx_readlen;
    p_msg_rsp->offset +=
        T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header (point to block
                                          data) */
    p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA;

    /* Verify that the bytes received is really the amount indicated in the
     * check-response header */
    if (rsp_num_bytes_rx > p_msg_rsp->len) {
      LOG(ERROR) << StringPrintf(
          "Response error: CHECK rsp header indicates %i bytes, but only "
          "received %i bytes",
          rsp_num_bytes_rx, p_msg_rsp->len);
      nfc_status = NFC_STATUS_FAILED;
      GKI_freebuf(p_msg_rsp);
    } else {
      /* If this is the the final block, then set len to reflect only valid
       * bytes (do not include padding to 16-byte boundary) */
      if ((p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) &&
          (p_cb->ndef_attrib.ln & 0x000F)) {
        if (rsp_num_bytes_rx < (16 - (p_cb->ndef_attrib.ln & 0x000F))) {
          nfc_status = NFC_STATUS_FAILED;
          GKI_freebuf(p_msg_rsp);
          android_errorWriteLog(0x534e4554, "224002331");
          return;
        }
        rsp_num_bytes_rx -= (16 - (p_cb->ndef_attrib.ln & 0x000F));
      }

      p_msg_rsp->len = rsp_num_bytes_rx;
      tRW_DATA rw_data;
      rw_data.data.status = NFC_STATUS_OK;
      rw_data.data.p_data = p_msg_rsp;
      (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, &rw_data);

      /* Send CHECK cmd for next NDEF segment, if needed */
      if (!(p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)) {
        nfc_status = rw_t3t_send_next_ndef_check_cmd(p_cb);
        if (nfc_status == NFC_STATUS_OK) {
          /* Still getting more segments. Don't send RW_T3T_CHECK_CPLT_EVT yet
           */
          check_complete = false;
        }
      }
    }
  } else {
    android_errorWriteLog(0x534e4554, "120502559");
    GKI_freebuf(p_msg_rsp);
    nfc_status = NFC_STATUS_FAILED;
    LOG(ERROR) << StringPrintf("Underflow in p_msg_rsp->len!");
  }

  /* Notify app of RW_T3T_CHECK_CPLT_EVT if entire NDEF has been read, or if
   * failure */
  if (check_complete) {
    p_cb->rw_state = RW_T3T_STATE_IDLE;
    tRW_DATA evt_data;
    evt_data.status = nfc_status;
    (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, &evt_data);
  }
}

/*****************************************************************************
**
** Function         rw_t3t_act_handle_update_ndef_rsp
**
** Description      Handle response to NDEF write segment
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_update_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
  bool update_complete = true;
  tNFC_STATUS nfc_status = NFC_STATUS_OK;
  uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;

  /* Check nfcid2 and status of response */
  if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] !=
       T3T_MSG_RSP_STATUS_OK) /* verify response status code */
      || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM],
                 NCI_NFCID2_LEN) != 0)) /* verify response IDm */
  {
    nfc_status = NFC_STATUS_FAILED;
  }
  /* Validate response opcode */
  else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) {
    LOG(ERROR) << StringPrintf(
        "Response error: expecting rsp_code %02X, but got %02X",
        T3T_MSG_OPC_UPDATE_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
    nfc_status = NFC_STATUS_FAILED;
  }
  /* If this is response to final UPDATE, then update NDEF local size */
  else if (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) {
    /* If successful, update current NDEF size */
    p_cb->ndef_attrib.ln = p_cb->ndef_msg_len;
  }
  /*  If any more NDEF bytes to update, then send next UPDATE command */
  else if (p_cb->ndef_msg_bytes_sent < p_cb->ndef_msg_len) {
    /* Send UPDATE command for next segment of NDEF */
    nfc_status = rw_t3t_send_next_ndef_update_cmd(p_cb);
    if (nfc_status == NFC_STATUS_OK) {
      /* Wait for update response */
      update_complete = false;
    }
  }
  /*  Otherwise, no more NDEF bytes. Send final UPDATE for Attribute Information
     block */
  else {
    p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT;
    nfc_status = rw_t3t_send_update_ndef_attribute_cmd(p_cb, false);
    if (nfc_status == NFC_STATUS_OK) {
      /* Wait for update response */
      update_complete = false;
    }
  }

  /* If update is completed, then notify app */
  if (update_complete) {
    p_cb->rw_state = RW_T3T_STATE_IDLE;
    tRW_DATA evt_data;
    evt_data.status = nfc_status;
    (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, &evt_data);
  }

  GKI_freebuf(p_msg_rsp);

  return;
}

/*****************************************************************************
**
** Function         rw_t3t_handle_get_sc_poll_rsp
**
** Description      Handle POLL response for getting system codes
**
** Returns          Nothing
**
*****************************************************************************/
static void rw_t3t_handle_get_sc_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
                                          uint8_t num_responses,
                                          uint8_t sensf_res_buf_size,
                                          uint8_t* p_sensf_res_buf) {
  uint8_t* p;
  uint16_t sc;

  /* Get the system code from the response */
  if ((nci_status == NCI_STATUS_OK) && (num_responses > 0) &&
      (sensf_res_buf_size >=
       (RW_T3T_SENSF_RES_RD_OFFSET + RW_T3T_SENSF_RES_RD_LEN))) {
    p = &p_sensf_res_buf[RW_T3T_SENSF_RES_RD_OFFSET];
    BE_STREAM_TO_UINT16(sc, p);

    DLOG_IF(INFO, nfc_debug_enabled)
        << StringPrintf("FeliCa detected (RD, system code %04X)", sc);
    if (p_cb->num_system_codes < T3T_MAX_SYSTEM_CODES) {
      p_cb->system_codes[p_cb->num_system_codes++] = sc;
    } else {
      LOG(ERROR) << StringPrintf("Exceed T3T_MAX_SYSTEM_CODES!");
      android_errorWriteLog(0x534e4554, "120499324");
    }
  }

  rw_t3t_handle_get_system_codes_cplt();
}

/*****************************************************************************
**
** Function         rw_t3t_handle_ndef_detect_poll_rsp
**
** Description      Handle POLL response for getting system codes
**
** Returns          Nothing
**
*****************************************************************************/
static void rw_t3t_handle_ndef_detect_poll_rsp(tRW_T3T_CB* p_cb,
                                               uint8_t nci_status,
                                               uint8_t num_responses) {
  NFC_HDR* p_cmd_buf;
  uint8_t *p, *p_cmd_start;
  tRW_DATA evt_data;

  /* Validate response for NDEF poll */
  if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) {
    /* Tag responded for NDEF poll */
    p_cb->cur_active_sc = T3T_SYSTEM_CODE_NDEF;

    /* Read NDEF attribute block */
    p_cmd_buf = rw_t3t_get_cmd_buf();
    if (p_cmd_buf != nullptr) {
      /* Construct T3T message */
      p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;

      /* Add CHECK opcode to message  */
      UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD);

      /* Add IDm to message */
      ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN);

      /* Add Service code list */
      UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */
      UINT16_TO_STREAM(
          p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */

      /* Number of blocks */
      UINT8_TO_STREAM(
          p,
          1); /* Number of blocks (only 1 block: NDEF Attribute Information ) */

      /* Block List element: the NDEF attribute information block (block 0) */
      UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT);
      UINT8_TO_STREAM(p, 0);

      /* Calculate length of message */
      p_cmd_buf->len = (uint16_t)(p - p_cmd_start);

      /* Send the T3T message */
      evt_data.status = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_DETECT_NDEF, p_cmd_buf,
                                        rw_t3t_check_timeout(1));
      if (evt_data.status == NFC_STATUS_OK) {
        /* CHECK command sent. Wait for response */
        return;
      }
    }
    nci_status = NFC_STATUS_FAILED;
  }

  /* NDEF detection failed */
  p_cb->rw_state = RW_T3T_STATE_IDLE;
  evt_data.ndef.status = nci_status;
  evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN;
  rw_t3t_update_ndef_flag(&evt_data.ndef.flags);
  (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, &evt_data);
}

/*****************************************************************************
**
** Function         rw_t3t_update_block
**
** Description      Send UPDATE command for single block
**                  (for formatting/configuring read only)
**
** Returns          tNFC_STATUS
**
*****************************************************************************/
tNFC_STATUS rw_t3t_update_block(tRW_T3T_CB* p_cb, uint8_t block_id,
                                uint8_t* p_block_data) {
  uint8_t *p_dst, *p_cmd_start;
  NFC_HDR* p_cmd_buf;
  tNFC_STATUS status;

  p_cmd_buf = rw_t3t_get_cmd_buf();
  if (p_cmd_buf != nullptr) {
    p_dst = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset;

    /* Add UPDATE opcode to message  */
    UINT8_TO_STREAM(p_dst, T3T_MSG_OPC_UPDATE_CMD);

    /* Add IDm to message */
    ARRAY_TO_STREAM(p_dst, p_cb->peer_nfcid2, NCI_NFCID2_LEN);

    /* Add Service code list */
    UINT8_TO_STREAM(p_dst, 1); /* Number of services (only 1 service: NDEF) */
    UINT16_TO_STREAM(
        p_dst, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */

    /* Number of blocks */
    UINT8_TO_STREAM(p_dst, 1);

    /* Add Block list element for MC */
    UINT8_TO_STREAM(p_dst, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT);
    UINT8_TO_STREAM(p_dst, block_id);

    /* Copy MC data to UPDATE message */
    ARRAY_TO_STREAM(p_dst, p_block_data, T3T_MSG_BLOCKSIZE);

    /* Calculate length of message */
    p_cmd_buf->len = (uint16_t)(p_dst - p_cmd_start);

    /* Send the T3T message */
    status = rw_t3t_send_cmd(p_cb, p_cb->cur_cmd, p_cmd_buf,
                             rw_t3t_update_timeout(1));
  } else {
    /* Unable to send UPDATE command */
    status = NFC_STATUS_NO_BUFFERS;
  }

  return (status);
}

/*****************************************************************************
**
** Function         rw_t3t_handle_fmt_poll_rsp
**
** Description      Handle POLL response for formatting felica-lite
**
** Returns          Nothing
**
*****************************************************************************/
static void rw_t3t_handle_fmt_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
                                       uint8_t num_responses) {
  tRW_DATA evt_data;

  evt_data.status = NFC_STATUS_OK;

  /* Validate response for poll response */
  if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) {
    /* Tag responded for Felica-Lite poll */
    p_cb->cur_active_sc = T3T_SYSTEM_CODE_FELICA_LITE;
    /* Get MemoryControl block */
    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
        "Felica-Lite tag detected...getting Memory Control block.");

    p_cb->rw_substate = RW_T3T_FMT_SST_CHECK_MC_BLK;

    /* Send command to check Memory Configuration block */
    evt_data.status = rw_t3t_check_mc_block(p_cb);
  } else {
    LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
    evt_data.status = NFC_STATUS_FAILED;
  }

  /* If error, notify upper layer */
  if (evt_data.status != NFC_STATUS_OK) {
    rw_t3t_format_cplt(evt_data.status);
  }
}

/*****************************************************************************
**
** Function         rw_t3t_act_handle_fmt_rsp
**
** Description      Handle response for formatting codes
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_fmt_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
  uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;
  uint8_t* p_mc;
  tRW_DATA evt_data;

  evt_data.status = NFC_STATUS_OK;

  /* Check tags's response for reading MemoryControl block */
  if (p_cb->rw_substate == RW_T3T_FMT_SST_CHECK_MC_BLK) {
    /* Validate response opcode */
    if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
      LOG(ERROR) << StringPrintf(
          "Response error: expecting rsp_code %02X, but got %02X",
          T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
      evt_data.status = NFC_STATUS_FAILED;
    }
    /* Validate status code and NFCID2 response from tag */
    else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] !=
              T3T_MSG_RSP_STATUS_OK) /* verify response status code */
             || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM],
                        NCI_NFCID2_LEN) != 0)) /* verify response IDm */
    {
      evt_data.status = NFC_STATUS_FAILED;
    } else if (p_msg_rsp->len <
               (T3T_MSG_RSP_OFFSET_CHECK_DATA + T3T_MSG_BLOCKSIZE)) {
      evt_data.status = NFC_STATUS_FAILED;
      android_errorWriteLog(0x534e4554, "120506143");
    } else {
      /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF
       * enabled) */
      p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of
                                                           CHECK response */

      if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] != 0x01) {
        /* Tag is not currently enabled for NDEF. Indicate that we need to
         * update the MC block */

        /* Set SYS_OP field to 0x01 (enable NDEF) */
        p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] = 0x01;

        /* Set RF_PRM field to 0x07 (procedure of issuance) */
        p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07;

        /* Construct and send UPDATE message to write MC block */
        p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_MC_BLK;
        evt_data.status =
            rw_t3t_update_block(p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc);
      } else {
        /* SYS_OP=1: ndef already enabled. Just need to update attribute
         * information block */
        p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB;
        evt_data.status =
            rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_default_attrib_info);
      }
    }

    /* If error, notify upper layer */
    if (evt_data.status != NFC_STATUS_OK) {
      rw_t3t_format_cplt(evt_data.status);
    }
  } else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_MC_BLK) {
    /* Validate response opcode */
    if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) ||
        (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))

    {
      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
      evt_data.status = NFC_STATUS_FAILED;
    } else {
      /* SYS_OP=1: ndef already enabled. Just need to update attribute
       * information block */
      p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB;
      evt_data.status =
          rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_default_attrib_info);
    }

    /* If error, notify upper layer */
    if (evt_data.status != NFC_STATUS_OK) {
      rw_t3t_format_cplt(evt_data.status);
    }
  } else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB) {
    /* Validate response opcode */
    if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) ||
        (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))

    {
      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
      evt_data.status = NFC_STATUS_FAILED;
    }

    rw_t3t_format_cplt(evt_data.status);
  }

  GKI_freebuf(p_msg_rsp);
}

/*****************************************************************************
**
** Function         rw_t3t_handle_sro_poll_rsp
**
** Description      Handle POLL response for configuring felica-lite read only
**
** Returns          Nothing
**
*****************************************************************************/
static void rw_t3t_handle_sro_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status,
                                       uint8_t num_responses) {
  tRW_DATA evt_data;
  uint8_t rw_t3t_ndef_attrib_info[T3T_MSG_BLOCKSIZE];
  uint8_t* p;
  uint8_t tempU8;
  uint16_t checksum, i;
  uint32_t tempU32 = 0;

  evt_data.status = NFC_STATUS_OK;

  /* Validate response for poll response */
  if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) {
    /* Tag responded for Felica-Lite poll */
    if (p_cb->ndef_attrib.rwflag != T3T_MSG_NDEF_RWFLAG_RO) {
      /* First update attribute information block */
      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
          "Felica-Lite tag detected...update NDef attribution block.");

      p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB;

      p = rw_t3t_ndef_attrib_info;

      UINT8_TO_STREAM(p, p_cb->ndef_attrib.version);

      /* Update NDEF info */
      UINT8_TO_STREAM(
          p, p_cb->ndef_attrib.nbr); /* NBr: number of blocks that can be read
                                        using one Check command */
      UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbw); /* Nbw: number of blocks that
                                                    can be written using one
                                                    Update command */
      UINT16_TO_BE_STREAM(
          p, p_cb->ndef_attrib.nmaxb); /* Nmaxb: maximum number of blocks
                                          available for NDEF data */
      UINT32_TO_BE_STREAM(p, tempU32);
      UINT8_TO_STREAM(p,
                      p_cb->ndef_attrib.writef); /* WriteFlag: 00h if writing
                                                    data finished; 0Fh if
                                                    writing data in progress */
      UINT8_TO_STREAM(p, 0x00); /* RWFlag: 00h NDEF is read-only */

      tempU8 = (uint8_t)(p_cb->ndef_attrib.ln >> 16);
      /* Get length (3-byte, big-endian) */
      UINT8_TO_STREAM(p, tempU8);                   /* Ln: high-byte */
      UINT16_TO_BE_STREAM(p, p_cb->ndef_attrib.ln); /* Ln: lo-word */

      /* Calculate and append Checksum */
      checksum = 0;
      for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) {
        checksum += rw_t3t_ndef_attrib_info[i];
      }
      UINT16_TO_BE_STREAM(p, checksum);

      evt_data.status =
          rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_ndef_attrib_info);
    } else if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) {
      /* NDEF is already read only, Read and update MemoryControl block */
      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
          "Felica-Lite tag detected...getting Memory Control block.");
      p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK;

      /* Send command to check Memory Configuration block */
      evt_data.status = rw_t3t_check_mc_block(p_cb);
    }
  } else {
    LOG(ERROR) << StringPrintf("Felica-Lite tag not detected");
    evt_data.status = NFC_STATUS_FAILED;
  }

  /* If error, notify upper layer */
  if (evt_data.status != NFC_STATUS_OK) {
    rw_t3t_set_readonly_cplt(evt_data.status);
  }
}

/*****************************************************************************
**
** Function         rw_t3t_act_handle_sro_rsp
**
** Description      Handle response for setting read only codes
**
** Returns          Nothing
**
*****************************************************************************/
void rw_t3t_act_handle_sro_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) {
  uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset;
  uint8_t* p_mc;
  tRW_DATA evt_data;

  evt_data.status = NFC_STATUS_OK;

  if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB) {
    /* Validate response opcode */
    if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) ||
        (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))

    {
      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
      evt_data.status = NFC_STATUS_FAILED;
    } else {
      p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RO;
      if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) {
        p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK;

        /* Send command to check Memory Configuration block */
        evt_data.status = rw_t3t_check_mc_block(p_cb);
      } else {
        rw_t3t_set_readonly_cplt(evt_data.status);
      }
    }
  } else if (p_cb->rw_substate == RW_T3T_SRO_SST_CHECK_MC_BLK) {
    /* Check tags's response for reading MemoryControl block, Validate response
     * opcode */
    if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) {
      LOG(ERROR) << StringPrintf(
          "Response error: expecting rsp_code %02X, but got %02X",
          T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]);
      evt_data.status = NFC_STATUS_FAILED;
    }
    /* Validate status code and NFCID2 response from tag */
    else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] !=
              T3T_MSG_RSP_STATUS_OK) /* verify response status code */
             || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM],
                        NCI_NFCID2_LEN) != 0)) /* verify response IDm */
    {
      evt_data.status = NFC_STATUS_FAILED;
    } else if (p_msg_rsp->len <
               (T3T_MSG_RSP_OFFSET_CHECK_DATA + T3T_MSG_BLOCKSIZE)) {
      evt_data.status = NFC_STATUS_FAILED;
      android_errorWriteLog(0x534e4554, "120506143");
    } else {
      /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF
       * enabled) */
      p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of
                                                           CHECK response */

      evt_data.status = NFC_STATUS_FAILED;
      if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] == 0x01) {
        /* Set MC_SP field with MC[0] = 0x00 & MC[1] = 0xC0 (Hardlock) to change
         * access permission from RW to RO */
        p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP] = 0x00;
        /* Not changing the access permission of Subtraction Register and
         * MC[0:1] */
        p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP + 1] = 0xC0;

        /* Set RF_PRM field to 0x07 (procedure of issuance) */
        p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07;

        /* Construct and send UPDATE message to write MC block */
        p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_MC_BLK;
        evt_data.status =
            rw_t3t_update_block(p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc);
      }
    }
  } else if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_MC_BLK) {
    /* Validate response opcode */
    if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) ||
        (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK))

    {
      LOG(ERROR) << StringPrintf("Response error: rsp_code=%02X, status=%02X",
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE],
                                 p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]);
      evt_data.status = NFC_STATUS_FAILED;
    } else {
      rw_t3t_set_readonly_cplt(evt_data.status);
    }
  }

  /* If error, notify upper layer */
  if (evt_data.status != NFC_STATUS_OK) {
    rw_t3t_set_readonly_cplt(evt_data.status);
  }

  GKI_freebuf(p_msg_rsp);
}

/*******************************************************************************
**
** Function         rw_t3t_data_cback
**
** Description      This callback function receives the data from NFCC.
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_data_cback(__attribute__((unused)) uint8_t conn_id,
                       tNFC_DATA_CEVT* p_data) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  NFC_HDR* p_msg = p_data->p_data;
  bool free_msg = false; /* if TRUE, free msg buffer before returning */
  uint8_t *p, sod;

  /* Stop rsponse timer */
  nfc_stop_quick_timer(&p_cb->timer);

#if (RW_STATS_INCLUDED == TRUE)
  /* Update rx stats */
  rw_main_update_rx_stats(p_msg->len);
#endif /* RW_STATS_INCLUDED */

  /* Check if we are expecting a response */
  if (p_cb->rw_state != RW_T3T_STATE_COMMAND_PENDING) {
    /*
    **  This must be raw frame response
    **  send raw frame to app with SoD
    */
    rw_t3t_act_handle_raw_senddata_rsp(p_cb, p_data);
  }
  /* Sanity check: verify msg len is big enough to contain t3t header */
  else if (p_msg->len < T3T_MSG_RSP_COMMON_HDR_LEN) {
    LOG(ERROR) << StringPrintf(
        "T3T: invalid Type3 Tag Message (invalid len: %i)", p_msg->len);
    free_msg = true;
    rw_t3t_process_frame_error();
  } else {
    /* Check for RF frame error */
    p = (uint8_t*)(p_msg + 1) + p_msg->offset;
    sod = p[0];

    if (p_msg->len < sod || p[sod] != NCI_STATUS_OK) {
      LOG(ERROR) << "T3T: rf frame error";
      GKI_freebuf(p_msg);
      rw_t3t_process_frame_error();
      return;
    }

    /* Skip over SoD */
    p_msg->offset++;
    p_msg->len--;

    /* Get response code */
    switch (p_cb->cur_cmd) {
      case RW_T3T_CMD_DETECT_NDEF:
        rw_t3t_act_handle_ndef_detect_rsp(p_cb, p_msg);
        break;

      case RW_T3T_CMD_CHECK_NDEF:
        rw_t3t_act_handle_check_ndef_rsp(p_cb, p_msg);
        break;

      case RW_T3T_CMD_UPDATE_NDEF:
        rw_t3t_act_handle_update_ndef_rsp(p_cb, p_msg);
        break;

      case RW_T3T_CMD_CHECK:
        rw_t3t_act_handle_check_rsp(p_cb, p_msg);
        break;

      case RW_T3T_CMD_UPDATE:
        rw_t3t_act_handle_update_rsp(p_cb, p_msg);
        break;

      case RW_T3T_CMD_SEND_RAW_FRAME:
        rw_t3t_act_handle_raw_senddata_rsp(p_cb, p_data);
        break;

      case RW_T3T_CMD_FORMAT:
        rw_t3t_act_handle_fmt_rsp(p_cb, p_msg);
        break;

      case RW_T3T_CMD_SET_READ_ONLY_SOFT:
      case RW_T3T_CMD_SET_READ_ONLY_HARD:
        rw_t3t_act_handle_sro_rsp(p_cb, p_msg);
        break;

      default:
        GKI_freebuf(p_msg);
        break;
    }
  }

  if (free_msg) {
    GKI_freebuf(p_msg);
  }
}

/*******************************************************************************
**
** Function         rw_t3t_conn_cback
**
** Description      This callback function receives the events/data from NFCC.
**
** Returns          none
**
*******************************************************************************/
void rw_t3t_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
                       tNFC_CONN* p_data) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
      "rw_t3t_conn_cback: conn_id=%i, evt=0x%02x", conn_id, event);

  /* Only handle NFC_RF_CONN_ID conn_id */
  if (conn_id != NFC_RF_CONN_ID) {
    return;
  }

  switch (event) {
    case NFC_DEACTIVATE_CEVT:
      rw_t3t_unselect();
      break;

    case NFC_DATA_CEVT: /* check for status in tNFC_CONN */
      if ((p_data != nullptr) && ((p_data->data.status == NFC_STATUS_OK) ||
                               (p_data->data.status == NFC_STATUS_CONTINUE))) {
        rw_t3t_data_cback(conn_id, &(p_data->data));
        break;
      } else if (p_data && p_data->data.p_data != nullptr) {
        /* Free the response buffer in case of error response */
        GKI_freebuf((NFC_HDR*)(p_data->data.p_data));
        p_data->data.p_data = nullptr;
      }
      /* Data event with error status...fall through to NFC_ERROR_CEVT case */
      FALLTHROUGH_INTENDED;

    case NFC_ERROR_CEVT:
      nfc_stop_quick_timer(&p_cb->timer);

#if (RW_STATS_INCLUDED == TRUE)
      rw_main_update_trans_error_stats();
#endif /* RW_STATS_INCLUDED */

      if (event == NFC_ERROR_CEVT)
        rw_t3t_process_error(NFC_STATUS_TIMEOUT);
      else if (p_data)
        rw_t3t_process_error(p_data->status);
      break;

    default:
      break;
  }
}

/*******************************************************************************
**
** Function         rw_t3t_mrti_to_a_b
**
** Description      Converts the given MRTI (Maximum Response Time Information)
**                  to the base to calculate timeout value.
**                  (The timeout value is a + b * number_blocks)
**
** Returns          NFC_STATUS_OK
**
*******************************************************************************/
static void rw_t3t_mrti_to_a_b(uint8_t mrti, uint32_t* p_a, uint32_t* p_b) {
  uint8_t a, b, e;

  a = (mrti & 0x7) + 1; /* A is bit 0 ~ bit 2 */
  mrti >>= 3;
  b = (mrti & 0x7) + 1; /* B is bit 3 ~ bit 5 */
  mrti >>= 3;
  e = mrti & 0x3;                 /* E is bit 6 ~ bit 7 */
  *p_a = rw_t3t_mrti_base[e] * a; /* (A+1) * base (i.e T/t3t * 4^E) */
  *p_b = rw_t3t_mrti_base[e] * b; /* (B+1) * base (i.e T/t3t * 4^E) */
}

/*******************************************************************************
**
** Function         rw_t3t_select
**
** Description      Called by NFC manager when a Type3 tag has been activated
**
** Returns          NFC_STATUS_OK
**
*******************************************************************************/
tNFC_STATUS rw_t3t_select(uint8_t peer_nfcid2[NCI_RF_F_UID_LEN],
                          uint8_t mrti_check, uint8_t mrti_update) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  memcpy(p_cb->peer_nfcid2, peer_nfcid2,
         NCI_NFCID2_LEN); /* Store tag's NFCID2 */
  p_cb->ndef_attrib.status =
      NFC_STATUS_NOT_INITIALIZED; /* Indicate that NDEF detection has not been
                                     performed yet */
  p_cb->rw_state = RW_T3T_STATE_IDLE;
  p_cb->flags = 0;
  rw_t3t_mrti_to_a_b(mrti_check, &p_cb->check_tout_a, &p_cb->check_tout_b);
  rw_t3t_mrti_to_a_b(mrti_update, &p_cb->update_tout_a, &p_cb->update_tout_b);

  /* Alloc cmd buf for retransmissions */
  if (p_cb->p_cur_cmd_buf == nullptr) {
    p_cb->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
    if (p_cb->p_cur_cmd_buf == nullptr) {
      LOG(ERROR) << StringPrintf(
          "rw_t3t_select: unable to allocate buffer for retransmission");
      p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED;
      return (NFC_STATUS_FAILED);
    }
  }

  NFC_SetStaticRfCback(rw_t3t_conn_cback);

  return NFC_STATUS_OK;
}

/*******************************************************************************
**
** Function         rw_t3t_unselect
**
** Description      Called by NFC manager when a Type3 tag has been de-activated
**
** Returns          NFC_STATUS_OK
**
*******************************************************************************/
static tNFC_STATUS rw_t3t_unselect() {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

#if (RW_STATS_INCLUDED == TRUE)
  /* Display stats */
  rw_main_log_stats();
#endif /* RW_STATS_INCLUDED */

  /* Stop t3t timer (if started) */
  nfc_stop_quick_timer(&p_cb->timer);

  /* Free cmd buf for retransmissions */
  if (p_cb->p_cur_cmd_buf) {
    GKI_freebuf(p_cb->p_cur_cmd_buf);
    p_cb->p_cur_cmd_buf = nullptr;
  }

  p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED;
  NFC_SetStaticRfCback(nullptr);

  return NFC_STATUS_OK;
}

/*******************************************************************************
**
** Function         rw_t3t_update_ndef_flag
**
** Description      set additional NDEF Flags for felica lite tag
**
** Returns          updated NDEF Flag value
**
*******************************************************************************/
static void rw_t3t_update_ndef_flag(uint8_t* p_flag) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  uint8_t xx;

  for (xx = 0; xx < p_cb->num_system_codes; xx++) {
    if (p_cb->system_codes[xx] == T3T_SYSTEM_CODE_FELICA_LITE) {
      *p_flag &= ~RW_NDEF_FL_UNKNOWN;
      *p_flag |= (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATABLE);
      break;
    }
  }
}

/*******************************************************************************
**
** Function         rw_t3t_cmd_str
**
** Description      Converts cmd_id to command string for logging
**
** Returns          command string
**
*******************************************************************************/
static std::string rw_t3t_cmd_str(uint8_t cmd_id) {
  switch (cmd_id) {
    case RW_T3T_CMD_DETECT_NDEF:
      return "RW_T3T_CMD_DETECT_NDEF";
    case RW_T3T_CMD_CHECK_NDEF:
      return "RW_T3T_CMD_CHECK_NDEF";
    case RW_T3T_CMD_UPDATE_NDEF:
      return "RW_T3T_CMD_UPDATE_NDEF";
    case RW_T3T_CMD_CHECK:
      return "RW_T3T_CMD_CHECK";
    case RW_T3T_CMD_UPDATE:
      return "RW_T3T_CMD_UPDATE";
    case RW_T3T_CMD_SEND_RAW_FRAME:
      return "RW_T3T_CMD_SEND_RAW_FRAME";
    case RW_T3T_CMD_GET_SYSTEM_CODES:
      return "RW_T3T_CMD_GET_SYSTEM_CODES";
    default:
      return "Unknown";
  }
}

/*******************************************************************************
**
** Function         rw_t3t_state_str
**
** Description      Converts state_id to command string for logging
**
** Returns          command string
**
*******************************************************************************/
static std::string rw_t3t_state_str(uint8_t state_id) {
  switch (state_id) {
    case RW_T3T_STATE_NOT_ACTIVATED:
      return "RW_T3T_STATE_NOT_ACTIVATED";
    case RW_T3T_STATE_IDLE:
      return "RW_T3T_STATE_IDLE";
    case RW_T3T_STATE_COMMAND_PENDING:
      return "RW_T3T_STATE_COMMAND_PENDING";
    default:
      return "Unknown";
  }
}

/*****************************************************************************
**  Type3 Tag API Functions
*****************************************************************************/

/*****************************************************************************
**
** Function         RW_T3tDetectNDef
**
** Description
**      This function is used to perform NDEF detection on a Type 3 tag, and
**      retrieve the tag's NDEF attribute information (block 0).
**
**      Before using this API, the application must call RW_SelectTagType to
**      indicate that a Type 3 tag has been activated, and to provide the
**      tag's Manufacture ID (IDm) .
**
** Returns
**      NFC_STATUS_OK: ndef detection procedure started
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tDetectNDef(void) {
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  tNFC_STATUS retval = NFC_STATUS_OK;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  }

  retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_NDEF, 0, 0);
  if (retval == NCI_STATUS_OK) {
    p_cb->cur_cmd = RW_T3T_CMD_DETECT_NDEF;
    p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS;
    p_cb->cur_poll_rc = 0;
    p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING;
    p_cb->flags |= RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP;

    /* start timer for waiting for responses */
    rw_t3t_start_poll_timer(p_cb);
  }

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tCheckNDef
**
** Description
**      Retrieve NDEF contents from a Type3 tag.
**
**      The RW_T3T_CHECK_EVT event is used to notify the application for each
**      segment of NDEF data received. The RW_T3T_CHECK_CPLT_EVT event is used
**      to notify the application all segments have been received.
**
**      Before using this API, the RW_T3tDetectNDef function must be called to
**      verify that the tag contains NDEF data, and to retrieve the NDEF
**      attributes.
**
**      Internally, this command will be separated into multiple Tag 3 Check
**      commands (if necessary) - depending on the tag's Nbr (max number of
**      blocks per read) attribute.
**
** Returns
**      NFC_STATUS_OK: check command started
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tCheckNDef(void) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  } else if (p_cb->ndef_attrib.status !=
             NFC_STATUS_OK) /* NDEF detection not performed yet? */
  {
    LOG(ERROR) << StringPrintf("Error: NDEF detection not performed yet");
    return (NFC_STATUS_NOT_INITIALIZED);
  } else if (p_cb->ndef_attrib.ln == 0) {
    LOG(ERROR) << StringPrintf("Type 3 tag contains empty NDEF message");
    return (NFC_STATUS_FAILED);
  } else if (p_cb->ndef_attrib.writef ==
             T3T_MSG_NDEF_WRITEF_ON) /* Tag's NDEF memory write in progress? */
  {
    LOG(ERROR) << StringPrintf(
        "%s - WriteFlag ON: NDEF data may be inconsistent, "
        "conclude NDEF Read procedure",
        __func__);
    return (NFC_STATUS_FAILED);
  }

  /* Check number of blocks needed for this update */
  p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT;
  p_cb->ndef_rx_offset = 0;
  retval = rw_t3t_send_next_ndef_check_cmd(p_cb);

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tUpdateNDef
**
** Description
**      Write NDEF contents to a Type3 tag.
**
**      The RW_T3T_UPDATE_CPLT_EVT callback event will be used to notify the
**      application of the response.
**
**      Before using this API, the RW_T3tDetectNDef function must be called to
**      verify that the tag contains NDEF data, and to retrieve the NDEF
**      attributes.
**
**      Internally, this command will be separated into multiple Tag 3 Update
**      commands (if necessary) - depending on the tag's Nbw (max number of
**      blocks per write) attribute.
**
** Returns
**      NFC_STATUS_OK: check command started
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_REFUSED: tag is read-only
**      NFC_STATUS_BUFFER_FULL: len exceeds tag's maximum size
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tUpdateNDef(uint32_t len, uint8_t* p_data) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("RW_T3tUpdateNDef (len=%i)", len);

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  } else if (p_cb->ndef_attrib.status !=
             NFC_STATUS_OK) /* NDEF detection not performed yet? */
  {
    LOG(ERROR) << StringPrintf("Error: NDEF detection not performed yet");
    return (NFC_STATUS_NOT_INITIALIZED);
  } else if (len > (((uint32_t)p_cb->ndef_attrib.nmaxb) *
                    16)) /* Len exceed's tag's NDEF memory? */
  {
    return (NFC_STATUS_BUFFER_FULL);
  } else if (p_cb->ndef_attrib.rwflag ==
             T3T_MSG_NDEF_RWFLAG_RO) /* Tag's NDEF memory is read-only? */
  {
    return (NFC_STATUS_REFUSED);
  }

  /* Check number of blocks needed for this update */
  p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT;
  p_cb->ndef_msg_bytes_sent = 0;
  p_cb->ndef_msg_len = len;
  p_cb->ndef_msg = p_data;

  /* Send initial UPDATE command for NDEF Attribute Info */
  retval = rw_t3t_send_update_ndef_attribute_cmd(p_cb, true);

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tCheck
**
** Description
**      Read (non-NDEF) contents from a Type3 tag.
**
**      The RW_READ_EVT event is used to notify the application for each
**      segment of NDEF data received. The RW_READ_CPLT_EVT event is used to
**      notify the application all segments have been received.
**
**      Before using this API, the application must call RW_SelectTagType to
**      indicate that a Type 3 tag has been activated, and to provide the
**      tag's Manufacture ID (IDm) .
**
** Returns
**      NFC_STATUS_OK: check command started
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tCheck(uint8_t num_blocks, tT3T_BLOCK_DESC* t3t_blocks) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("RW_T3tCheck (num_blocks = %i)", num_blocks);

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  }

  /* Send the CHECK command */
  retval = rw_t3t_send_check_cmd(p_cb, num_blocks, t3t_blocks);

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tUpdate
**
** Description
**      Write (non-NDEF) contents to a Type3 tag.
**
**      The RW_WRITE_CPLT_EVT event is used to notify the application all
**      segments have been received.
**
**      Before using this API, the application must call RW_SelectTagType to
**      indicate that a Type 3 tag has been activated, and to provide the tag's
**      Manufacture ID (IDm) .
**
** Returns
**      NFC_STATUS_OK: check command started
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tUpdate(uint8_t num_blocks, tT3T_BLOCK_DESC* t3t_blocks,
                         uint8_t* p_data) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("RW_T3tUpdate (num_blocks = %i)", num_blocks);

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  }

  /* Send the UPDATE command */
  retval = rw_t3t_send_update_cmd(p_cb, num_blocks, t3t_blocks, p_data);

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tPresenceCheck
**
** Description
**      Check if the tag is still in the field.
**
**      The RW_T3T_PRESENCE_CHECK_EVT w/ status is used to indicate presence
**      or non-presence.
**
** Returns
**      NFC_STATUS_OK, if raw data frame sent
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tPresenceCheck(void) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_DATA evt_data;
  tRW_CB* p_rw_cb = &rw_cb;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  /* If RW_SelectTagType was not called (no conn_callback) return failure */
  if (!(p_rw_cb->p_cback)) {
    retval = NFC_STATUS_FAILED;
  }
  /* If we are not activated, then RW_T3T_PRESENCE_CHECK_EVT status=FAIL */
  else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_NOT_ACTIVATED) {
    evt_data.status = NFC_STATUS_FAILED;
    (*p_rw_cb->p_cback)(RW_T3T_PRESENCE_CHECK_EVT, &evt_data);
  }
  /* If command is pending */
  else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_COMMAND_PENDING) {
    /* If already performing presence check, return error */
    if (p_rw_cb->tcb.t3t.flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) {
      DLOG_IF(INFO, nfc_debug_enabled)
          << StringPrintf("RW_T3tPresenceCheck already in progress");
      retval = NFC_STATUS_FAILED;
    }
    /* If busy with any other command, assume that the tag is present */
    else {
      evt_data.status = NFC_STATUS_OK;
      (*p_rw_cb->p_cback)(RW_T3T_PRESENCE_CHECK_EVT, &evt_data);
    }
  } else {
    /* IDLE state: send POLL command */
    retval = (tNFC_STATUS)nci_snd_t3t_polling(0xFFFF, T3T_POLL_RC_SC, 0x03);
    if (retval == NCI_STATUS_OK) {
      p_rw_cb->tcb.t3t.flags |= RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP;
      p_rw_cb->tcb.t3t.rw_state = RW_T3T_STATE_COMMAND_PENDING;
      p_rw_cb->tcb.t3t.cur_poll_rc = 0;

      /* start timer for waiting for responses */
      rw_t3t_start_poll_timer(&p_rw_cb->tcb.t3t);
    } else {
      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
          "RW_T3tPresenceCheck error sending NCI_RF_T3T_POLLING cmd (status = "
          "0x%0x)",
          retval);
    }
  }

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tPoll
**
** Description
**      Send POLL command
**
** Returns
**      NFC_STATUS_OK, if raw data frame sent
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tPoll(uint16_t system_code, tT3T_POLL_RC rc, uint8_t tsn) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  }

  retval = (tNFC_STATUS)nci_snd_t3t_polling(system_code, (uint8_t)rc, tsn);
  if (retval == NCI_STATUS_OK) {
    /* start timer for waiting for responses */
    p_cb->cur_poll_rc = rc;
    p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING;
    p_cb->flags |= RW_T3T_FL_W4_USER_POLL_RSP;
    rw_t3t_start_poll_timer(p_cb);
  }

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tSendRawFrame
**
** Description
**      This function is called to send a raw data frame to the peer device.
**      When type 3 tag receives response from peer, the callback function
**      will be called with a RW_T3T_RAW_FRAME_EVT [Table 6].
**
**      Before using this API, the application must call RW_SelectTagType to
**      indicate that a Type 3 tag has been activated.
**
**      The raw frame should be a properly formatted Type 3 tag message.
**
** Returns
**      NFC_STATUS_OK, if raw data frame sent
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tSendRawFrame(uint16_t len, uint8_t* p_data) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("RW_T3tSendRawFrame (len = %i)", len);

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  }

  /* Send the UPDATE command */
  retval = rw_t3t_send_raw_frame(p_cb, len, p_data);

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tGetSystemCodes
**
** Description
**      Get systems codes supported by the activated tag:
**              Poll for wildcard (FFFF, RC=1):
**
**      Before using this API, the application must call RW_SelectTagType to
**      indicate that a Type 3 tag has been activated.
**
** Returns
**      NFC_STATUS_OK, if raw data frame sent
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tGetSystemCodes(void) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  } else {
    /* Until the card answers properly to SC=12FCh, by default, consider
       the card as a Felica card not NDEF compatible, answering to SC=0x88B4
       possibly */
    p_cb->cur_active_sc = T3T_SYSTEM_CODE_FELICA_LITE;

    retval = (tNFC_STATUS)nci_snd_t3t_polling(0xFFFF, T3T_POLL_RC_SC, 0x0F);
    if (retval == NCI_STATUS_OK) {
      p_cb->cur_cmd = RW_T3T_CMD_GET_SYSTEM_CODES;
      p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS;
      p_cb->cur_poll_rc = T3T_POLL_RC_SC;
      p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING;
      p_cb->flags |= RW_T3T_FL_W4_GET_SC_POLL_RSP;
      p_cb->num_system_codes = 0;

      /* start timer for waiting for responses */
      rw_t3t_start_poll_timer(p_cb);
    }
  }

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tFormatNDef
**
** Description
**      Format a type-3 tag for NDEF.
**
**      Only Felica-Lite tags are supported by this API. The
**      RW_T3T_FORMAT_CPLT_EVT is used to notify the status of the operation.
**
** Returns
**      NFC_STATUS_OK: ndef detection procedure started
**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
**      NFC_STATUS_FAILED: other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tFormatNDef(void) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  } else {
    /* Poll tag, to see if Felica-Lite system is supported */
    retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_FELICA_LITE,
                                              T3T_POLL_RC_SC, 0);
    if (retval == NCI_STATUS_OK) {
      p_cb->cur_cmd = RW_T3T_CMD_FORMAT;
      p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS;
      p_cb->cur_poll_rc = T3T_POLL_RC_SC;
      p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING;
      p_cb->rw_substate = RW_T3T_FMT_SST_POLL_FELICA_LITE;
      p_cb->flags |= RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP;

      /* start timer for waiting for responses */
      rw_t3t_start_poll_timer(p_cb);
    }
  }

  return (retval);
}

/*****************************************************************************
**
** Function         RW_T3tSetReadOnly
**
** Description      This function performs NDEF read-only procedure
**                  Note: Both NFC Forum and Felica-Lite tags are supported by
**                        this API.
**                        RW_T3tDetectNDef() must be called before using this
**
**                  The RW_T3T_SET_READ_ONLY_CPLT_EVT event will be returned.
**
** Returns          NFC_STATUS_OK if success
**                  NFC_STATUS_FAILED if T3T is busy or other error
**
*****************************************************************************/
tNFC_STATUS RW_T3tSetReadOnly(bool b_hard_lock) {
  tNFC_STATUS retval = NFC_STATUS_OK;
  tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
  tRW_DATA evt_data;
  uint8_t rw_t3t_ndef_attrib_info[T3T_MSG_BLOCKSIZE];
  uint8_t* p;
  uint32_t tempU32 = 0;
  uint16_t checksum, i;
  uint8_t tempU8;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("b_hard_lock=%d", b_hard_lock);

  /* Check if we are in valid state to handle this API */
  if (p_cb->rw_state != RW_T3T_STATE_IDLE) {
    LOG(ERROR) << StringPrintf("Error: invalid state to handle API (0x%x)",
                               p_cb->rw_state);
    return (NFC_STATUS_FAILED);
  }

  if (p_cb->ndef_attrib.status !=
      NFC_STATUS_OK) /* NDEF detection not performed yet? */
  {
    LOG(ERROR) << StringPrintf("Error: NDEF detection not performed yet");
    return (NFC_STATUS_NOT_INITIALIZED);
  }

  if ((!b_hard_lock) &&
      (p_cb->ndef_attrib.rwflag ==
       T3T_MSG_NDEF_RWFLAG_RO)) /* Tag's NDEF memory is read-only already */
  {
    evt_data.status = NFC_STATUS_OK;
    (*(rw_cb.p_cback))(RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data);
    return (retval);
  } else {
    if (p_cb->cur_active_sc == T3T_SYSTEM_CODE_NDEF) {
      /* Tag previously responded for NDEF poll */
      if (p_cb->ndef_attrib.rwflag != T3T_MSG_NDEF_RWFLAG_RO) {
        /* First update attribute information block */
        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
            "%s - NDEF tag detected...update NDef attribution block.",
            __func__);
        p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_SOFT;

        p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB;

        p = rw_t3t_ndef_attrib_info;

        UINT8_TO_STREAM(p, p_cb->ndef_attrib.version);

        /* Update NDEF info */
        UINT8_TO_STREAM(
            p, p_cb->ndef_attrib.nbr); /* NBr: number of blocks that can be read
                                          using one Check command */
        UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbw); /* Nbw: number of blocks that
                                                      can be written using one
                                                      Update command */
        UINT16_TO_BE_STREAM(
            p, p_cb->ndef_attrib.nmaxb); /* Nmaxb: maximum number of blocks
                                            available for NDEF data */
        UINT32_TO_BE_STREAM(p, tempU32);
        UINT8_TO_STREAM(
            p, p_cb->ndef_attrib.writef); /* WriteFlag: 00h if writing
                                             data finished; 0Fh if
                                             writing data in progress */
        UINT8_TO_STREAM(p, 0x00);         /* RWFlag: 00h NDEF is read-only */

        tempU8 = (uint8_t)(p_cb->ndef_attrib.ln >> 16);
        /* Get length (3-byte, big-endian) */
        UINT8_TO_STREAM(p, tempU8);                   /* Ln: high-byte */
        UINT16_TO_BE_STREAM(p, p_cb->ndef_attrib.ln); /* Ln: lo-word */

        /* Calculate and append Checksum */
        checksum = 0;
        for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) {
          checksum += rw_t3t_ndef_attrib_info[i];
        }
        UINT16_TO_BE_STREAM(p, checksum);

        retval =
            rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_ndef_attrib_info);
      }
    } else {
      /* Poll tag, to see if Felica-Lite system is supported */
      retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_FELICA_LITE,
                                                T3T_POLL_RC_SC, 0);
      if (retval == NCI_STATUS_OK) {
        if (b_hard_lock)
          p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_HARD;
        else
          p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_SOFT;
        p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS;
        p_cb->cur_poll_rc = T3T_POLL_RC_SC;
        p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING;
        p_cb->rw_substate = RW_T3T_SRO_SST_POLL_FELICA_LITE;
        p_cb->flags |= RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP;

        /* start timer for waiting for responses */
        rw_t3t_start_poll_timer(p_cb);
      }
    }
  }
  return (retval);
}
