Home | History | Annotate | Download | only in nfc
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-2014 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains functions that interface with the NFC NCI transport.
     22  *  On the receive side, it routes events to the appropriate handler
     23  *  (callback). On the transmit side, it manages the command transmission.
     24  *
     25  ******************************************************************************/
     26 #include <string.h>
     27 
     28 #include <android-base/stringprintf.h>
     29 #include <android/hardware/nfc/1.1/types.h>
     30 #include <base/logging.h>
     31 
     32 #include "nfc_target.h"
     33 
     34 #include "bt_types.h"
     35 #include "ce_int.h"
     36 #include "gki.h"
     37 #include "nci_hmsgs.h"
     38 #include "nfc_int.h"
     39 #include "rw_int.h"
     40 
     41 #if (NFC_RW_ONLY == FALSE)
     42 
     43 #include "llcp_int.h"
     44 
     45 /* NFC mandates support for at least one logical connection;
     46  * Update max_conn to the NFCC capability on InitRsp */
     47 #define NFC_SET_MAX_CONN_DEFAULT() \
     48   { nfc_cb.max_conn = 1; }
     49 
     50 #else /* NFC_RW_ONLY */
     51 #define ce_init()
     52 #define llcp_init()
     53 
     54 #define NFC_SET_MAX_CONN_DEFAULT()
     55 
     56 #endif /* NFC_RW_ONLY */
     57 
     58 using android::base::StringPrintf;
     59 using android::hardware::nfc::V1_1::NfcEvent;
     60 
     61 extern bool nfc_debug_enabled;
     62 extern void delete_stack_non_volatile_store(bool forceDelete);
     63 
     64 /****************************************************************************
     65 ** Declarations
     66 ****************************************************************************/
     67 tNFC_CB nfc_cb;
     68 
     69 #if (NFC_RW_ONLY == FALSE)
     70 #define NFC_NUM_INTERFACE_MAP 2
     71 #else
     72 #define NFC_NUM_INTERFACE_MAP 1
     73 #endif
     74 
     75 static const tNCI_DISCOVER_MAPS nfc_interface_mapping[NFC_NUM_INTERFACE_MAP] = {
     76     /* Protocols that use Frame Interface do not need to be included in the
     77        interface mapping */
     78     {NCI_PROTOCOL_ISO_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
     79      NCI_INTERFACE_ISO_DEP}
     80 #if (NFC_RW_ONLY == FALSE)
     81     ,
     82     /* this can not be set here due to 2079xB0 NFCC issues */
     83     {NCI_PROTOCOL_NFC_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
     84      NCI_INTERFACE_NFC_DEP}
     85 #endif
     86 };
     87 
     88 /*******************************************************************************
     89 **
     90 ** Function         nfc_state_name
     91 **
     92 ** Description      This function returns the state name.
     93 **
     94 ** NOTE             conditionally compiled to save memory.
     95 **
     96 ** Returns          pointer to the name
     97 **
     98 *******************************************************************************/
     99 static std::string nfc_state_name(uint8_t state) {
    100   switch (state) {
    101     case NFC_STATE_NONE:
    102       return "NONE";
    103     case NFC_STATE_W4_HAL_OPEN:
    104       return "W4_HAL_OPEN";
    105     case NFC_STATE_CORE_INIT:
    106       return "CORE_INIT";
    107     case NFC_STATE_W4_POST_INIT_CPLT:
    108       return "W4_POST_INIT_CPLT";
    109     case NFC_STATE_IDLE:
    110       return "IDLE";
    111     case NFC_STATE_OPEN:
    112       return "OPEN";
    113     case NFC_STATE_CLOSING:
    114       return "CLOSING";
    115     case NFC_STATE_W4_HAL_CLOSE:
    116       return "W4_HAL_CLOSE";
    117     case NFC_STATE_NFCC_POWER_OFF_SLEEP:
    118       return "NFCC_POWER_OFF_SLEEP";
    119     default:
    120       return "???? UNKNOWN STATE";
    121   }
    122 }
    123 
    124 /*******************************************************************************
    125 **
    126 ** Function         nfc_hal_event_name
    127 **
    128 ** Description      This function returns the HAL event name.
    129 **
    130 ** NOTE             conditionally compiled to save memory.
    131 **
    132 ** Returns          pointer to the name
    133 **
    134 *******************************************************************************/
    135 static std::string nfc_hal_event_name(uint8_t event) {
    136   switch (event) {
    137     case HAL_NFC_OPEN_CPLT_EVT:
    138       return "HAL_NFC_OPEN_CPLT_EVT";
    139     case HAL_NFC_CLOSE_CPLT_EVT:
    140       return "HAL_NFC_CLOSE_CPLT_EVT";
    141     case HAL_NFC_POST_INIT_CPLT_EVT:
    142       return "HAL_NFC_POST_INIT_CPLT_EVT";
    143     case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
    144       return "HAL_NFC_PRE_DISCOVER_CPLT_EVT";
    145     case HAL_NFC_REQUEST_CONTROL_EVT:
    146       return "HAL_NFC_REQUEST_CONTROL_EVT";
    147     case HAL_NFC_RELEASE_CONTROL_EVT:
    148       return "HAL_NFC_RELEASE_CONTROL_EVT";
    149     case HAL_NFC_ERROR_EVT:
    150       return "HAL_NFC_ERROR_EVT";
    151     case (uint32_t)NfcEvent::HCI_NETWORK_RESET:
    152       return "HCI_NETWORK_RESET";
    153     default:
    154       return "???? UNKNOWN EVENT";
    155   }
    156 }
    157 
    158 /*******************************************************************************
    159 **
    160 ** Function         nfc_main_notify_enable_status
    161 **
    162 ** Description      Notify status of Enable/PowerOffSleep/PowerCycle
    163 **
    164 *******************************************************************************/
    165 static void nfc_main_notify_enable_status(tNFC_STATUS nfc_status) {
    166   tNFC_RESPONSE evt_data;
    167 
    168   evt_data.status = nfc_status;
    169 
    170   if (nfc_cb.p_resp_cback) {
    171     /* if getting out of PowerOffSleep mode or restarting NFCC */
    172     if (nfc_cb.flags & (NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC)) {
    173       nfc_cb.flags &= ~(NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC);
    174       if (nfc_status != NFC_STATUS_OK) {
    175         nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
    176       }
    177       (*nfc_cb.p_resp_cback)(NFC_NFCC_RESTART_REVT, &evt_data);
    178     } else {
    179       (*nfc_cb.p_resp_cback)(NFC_ENABLE_REVT, &evt_data);
    180     }
    181   }
    182 }
    183 
    184 /*******************************************************************************
    185 **
    186 ** Function         nfc_enabled
    187 **
    188 ** Description      NFCC enabled, proceed with stack start up.
    189 **
    190 ** Returns          void
    191 **
    192 *******************************************************************************/
    193 void nfc_enabled(tNFC_STATUS nfc_status, NFC_HDR* p_init_rsp_msg) {
    194   tNFC_RESPONSE evt_data;
    195   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
    196   uint8_t* p;
    197   uint8_t num_interfaces = 0, xx;
    198   uint8_t num_interface_extensions = 0, zz;
    199   uint8_t interface_type;
    200   int yy = 0;
    201   memset(&evt_data, 0, sizeof(tNFC_RESPONSE));
    202 
    203   if (nfc_status == NCI_STATUS_OK) {
    204     nfc_set_state(NFC_STATE_IDLE);
    205 
    206     p = (uint8_t*)(p_init_rsp_msg + 1) + p_init_rsp_msg->offset +
    207         NCI_MSG_HDR_SIZE + 1;
    208     /* we currently only support NCI of the same version.
    209     * We may need to change this, when we support multiple version of NFCC */
    210 
    211     evt_data.enable.nci_version = nfc_cb.nci_version;
    212     STREAM_TO_UINT32(evt_data.enable.nci_features, p);
    213     if (nfc_cb.nci_version == NCI_VERSION_1_0) {
    214       STREAM_TO_UINT8(num_interfaces, p);
    215       evt_data.enable.nci_interfaces = 0;
    216       for (xx = 0; xx < num_interfaces; xx++) {
    217         if ((*p) <= NCI_INTERFACE_MAX)
    218           evt_data.enable.nci_interfaces |= (1 << (*p));
    219         else if (((*p) >= NCI_INTERFACE_FIRST_VS) &&
    220                  (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) {
    221           /* save the VS RF interface in control block, if there's still room */
    222           nfc_cb.vs_interface[yy++] = *p;
    223         }
    224         p++;
    225       }
    226       nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces;
    227       memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface,
    228              NFC_NFCC_MAX_NUM_VS_INTERFACE);
    229     }
    230     evt_data.enable.max_conn = *p++;
    231     STREAM_TO_UINT16(evt_data.enable.max_ce_table, p);
    232 #if (NFC_RW_ONLY == FALSE)
    233     nfc_cb.max_ce_table = evt_data.enable.max_ce_table;
    234     nfc_cb.nci_features = evt_data.enable.nci_features;
    235     nfc_cb.max_conn = evt_data.enable.max_conn;
    236 #endif
    237     nfc_cb.nci_ctrl_size = *p++; /* Max Control Packet Payload Length */
    238     p_cb->init_credits = p_cb->num_buff = 0;
    239     nfc_set_conn_id(p_cb, NFC_RF_CONN_ID);
    240     if (nfc_cb.nci_version == NCI_VERSION_2_0) {
    241       if (evt_data.enable.nci_features & NCI_FEAT_HCI_NETWORK) {
    242         p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
    243         nfc_set_conn_id(p_cb, NFC_HCI_CONN_ID);
    244         p_cb->id = NFC_HCI_CONN_ID;
    245         STREAM_TO_UINT8(p_cb->buff_size, p);
    246         STREAM_TO_UINT8(p_cb->num_buff, p);
    247         p_cb->init_credits = p_cb->num_buff;
    248         evt_data.enable.hci_packet_size = p_cb->buff_size;
    249         evt_data.enable.hci_conn_credits = p_cb->init_credits;
    250         DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
    251             "hci num_buf=%d buf_size=%d", p_cb->num_buff, p_cb->buff_size);
    252       } else {
    253         /*HCI n/w not enabled skip data buff size and data credit HCI conn */
    254         p += 2;
    255       }
    256       STREAM_TO_UINT16(evt_data.enable.max_nfc_v_size, p);
    257       STREAM_TO_UINT8(num_interfaces, p);
    258 #if (NFC_RW_ONLY == FALSE)
    259       nfc_cb.hci_packet_size = evt_data.enable.hci_packet_size;
    260       nfc_cb.hci_conn_credits = evt_data.enable.hci_conn_credits;
    261       nfc_cb.nci_max_v_size = evt_data.enable.max_nfc_v_size;
    262 #endif
    263       evt_data.enable.nci_interfaces = 0;
    264 
    265       for (xx = 0; xx < num_interfaces; xx++) {
    266         if ((*p) <= NCI_INTERFACE_MAX)
    267           evt_data.enable.nci_interfaces |= (1 << (*p));
    268         else if (((*p) >= NCI_INTERFACE_FIRST_VS) &&
    269                  (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) {
    270           /* save the VS RF interface in control block, if there's still room */
    271           nfc_cb.vs_interface[yy++] = *p;
    272         }
    273         interface_type = *p++;
    274         num_interface_extensions = *p++;
    275         for (zz = 0; zz < num_interface_extensions; zz++) {
    276           if (((*p) < NCI_INTERFACE_EXTENSION_MAX) &&
    277               (interface_type <= NCI_INTERFACE_MAX)) {
    278             nfc_cb.nci_intf_extensions |= (1 << (*p));
    279             nfc_cb.nci_intf_extension_map[*p] = (1 << interface_type);
    280           }
    281           p++;
    282         }
    283       }
    284 
    285       nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces;
    286       memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface,
    287              NFC_NFCC_MAX_NUM_VS_INTERFACE);
    288     } else {
    289       STREAM_TO_UINT16(evt_data.enable.max_param_size, p);
    290       evt_data.enable.manufacture_id = *p++;
    291       STREAM_TO_ARRAY(evt_data.enable.nfcc_info, p, NFC_NFCC_INFO_LEN);
    292     }
    293     NFC_DiscoveryMap(nfc_cb.num_disc_maps,
    294                      (tNCI_DISCOVER_MAPS*)nfc_cb.p_disc_maps, NULL);
    295   }
    296   /* else not successful. the buffers will be freed in nfc_free_conn_cb () */
    297   else {
    298     if (nfc_cb.flags & NFC_FL_RESTARTING) {
    299       nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP);
    300     } else {
    301       nfc_free_conn_cb(p_cb);
    302 
    303       /* if NFCC didn't respond to CORE_RESET or CORE_INIT */
    304       if (nfc_cb.nfc_state == NFC_STATE_CORE_INIT) {
    305         /* report status after closing HAL */
    306         nfc_cb.p_hal->close();
    307         return;
    308       } else
    309         nfc_set_state(NFC_STATE_NONE);
    310     }
    311   }
    312 
    313   nfc_main_notify_enable_status(nfc_status);
    314 }
    315 
    316 /*******************************************************************************
    317 **
    318 ** Function         nfc_set_state
    319 **
    320 ** Description      Set the state of NFC stack
    321 **
    322 ** Returns          void
    323 **
    324 *******************************************************************************/
    325 void nfc_set_state(tNFC_STATE nfc_state) {
    326   DLOG_IF(INFO, nfc_debug_enabled)
    327       << StringPrintf("nfc_set_state %d (%s)->%d (%s)", nfc_cb.nfc_state,
    328                       nfc_state_name(nfc_cb.nfc_state).c_str(), nfc_state,
    329                       nfc_state_name(nfc_state).c_str());
    330   nfc_cb.nfc_state = nfc_state;
    331 }
    332 
    333 /*******************************************************************************
    334 **
    335 ** Function         nfc_gen_cleanup
    336 **
    337 ** Description      Clean up for both going into low power mode and disabling
    338 **                  NFC
    339 **
    340 *******************************************************************************/
    341 void nfc_gen_cleanup(void) {
    342   nfc_cb.flags &= ~NFC_FL_DEACTIVATING;
    343 
    344   /* the HAL pre-discover is still active - clear the pending flag/free the
    345    * buffer */
    346   if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
    347     nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
    348     GKI_freebuf(nfc_cb.p_disc_pending);
    349     nfc_cb.p_disc_pending = NULL;
    350   }
    351 
    352   nfc_cb.flags &= ~(NFC_FL_CONTROL_REQUESTED | NFC_FL_CONTROL_GRANTED |
    353                     NFC_FL_HAL_REQUESTED);
    354 
    355   nfc_stop_timer(&nfc_cb.deactivate_timer);
    356 
    357   /* Reset the connection control blocks */
    358   nfc_reset_all_conn_cbs();
    359 
    360   if (nfc_cb.p_nci_init_rsp) {
    361     GKI_freebuf(nfc_cb.p_nci_init_rsp);
    362     nfc_cb.p_nci_init_rsp = NULL;
    363   }
    364 
    365   /* clear any pending CMD/RSP */
    366   nfc_main_flush_cmd_queue();
    367 }
    368 
    369 /*******************************************************************************
    370 **
    371 ** Function         nfc_main_handle_hal_evt
    372 **
    373 ** Description      Handle BT_EVT_TO_NFC_MSGS
    374 **
    375 *******************************************************************************/
    376 void nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG* p_msg) {
    377   uint8_t* ps;
    378 
    379   DLOG_IF(INFO, nfc_debug_enabled)
    380       << StringPrintf("HAL event=0x%x", p_msg->hal_evt);
    381 
    382   switch (p_msg->hal_evt) {
    383     case HAL_NFC_OPEN_CPLT_EVT: /* only for failure case */
    384       nfc_enabled(NFC_STATUS_FAILED, NULL);
    385       break;
    386 
    387     case HAL_NFC_CLOSE_CPLT_EVT:
    388       if (nfc_cb.p_resp_cback) {
    389         if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) {
    390           if (nfc_cb.flags & NFC_FL_POWER_OFF_SLEEP) {
    391             nfc_cb.flags &= ~NFC_FL_POWER_OFF_SLEEP;
    392             nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP);
    393             (*nfc_cb.p_resp_cback)(NFC_NFCC_POWER_OFF_REVT, NULL);
    394           } else {
    395             nfc_set_state(NFC_STATE_NONE);
    396             (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, NULL);
    397             nfc_cb.p_resp_cback = NULL;
    398           }
    399         } else {
    400           /* found error during initialization */
    401           nfc_set_state(NFC_STATE_NONE);
    402           nfc_main_notify_enable_status(NFC_STATUS_FAILED);
    403         }
    404       }
    405       break;
    406 
    407     case HAL_NFC_POST_INIT_CPLT_EVT:
    408       if (nfc_cb.p_nci_init_rsp) {
    409         /*
    410         ** if NFC_Disable() is called before receiving
    411         ** HAL_NFC_POST_INIT_CPLT_EVT, then wait for HAL_NFC_CLOSE_CPLT_EVT.
    412         */
    413         if (nfc_cb.nfc_state == NFC_STATE_W4_POST_INIT_CPLT) {
    414           if (p_msg->status == HAL_NFC_STATUS_OK) {
    415             nfc_enabled(NCI_STATUS_OK, nfc_cb.p_nci_init_rsp);
    416           } else /* if post initailization failed */
    417           {
    418             nfc_enabled(NCI_STATUS_FAILED, NULL);
    419           }
    420         }
    421 
    422         GKI_freebuf(nfc_cb.p_nci_init_rsp);
    423         nfc_cb.p_nci_init_rsp = NULL;
    424       }
    425       break;
    426 
    427     case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
    428       /* restore the command window, no matter if the discover command is still
    429        * pending */
    430       nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
    431       nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED;
    432       if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
    433         /* issue the discovery command now, if it is still pending */
    434         nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
    435         ps = (uint8_t*)nfc_cb.p_disc_pending;
    436         nci_snd_discover_cmd(*ps, (tNFC_DISCOVER_PARAMS*)(ps + 1));
    437         GKI_freebuf(nfc_cb.p_disc_pending);
    438         nfc_cb.p_disc_pending = NULL;
    439       } else {
    440         /* check if there's other pending commands */
    441         nfc_ncif_check_cmd_queue(NULL);
    442       }
    443 
    444       if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
    445         nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
    446       break;
    447 
    448     case HAL_NFC_REQUEST_CONTROL_EVT:
    449       nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED;
    450       nfc_cb.flags |= NFC_FL_HAL_REQUESTED;
    451       nfc_ncif_check_cmd_queue(NULL);
    452       break;
    453 
    454     case HAL_NFC_RELEASE_CONTROL_EVT:
    455       if (nfc_cb.flags & NFC_FL_CONTROL_GRANTED) {
    456         nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED;
    457         nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
    458         nfc_ncif_check_cmd_queue(NULL);
    459 
    460         if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
    461           nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
    462       }
    463       break;
    464 
    465     case HAL_NFC_ERROR_EVT:
    466       switch (p_msg->status) {
    467         case HAL_NFC_STATUS_ERR_TRANSPORT:
    468           /* Notify app of transport error */
    469           if (nfc_cb.p_resp_cback) {
    470             (*nfc_cb.p_resp_cback)(NFC_NFCC_TRANSPORT_ERR_REVT, NULL);
    471 
    472             /* if enabling NFC, notify upper layer of failure after closing HAL
    473              */
    474             if (nfc_cb.nfc_state < NFC_STATE_IDLE) {
    475               nfc_enabled(NFC_STATUS_FAILED, NULL);
    476             }
    477           }
    478           break;
    479 
    480         case HAL_NFC_STATUS_ERR_CMD_TIMEOUT:
    481           nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
    482 
    483           /* if enabling NFC, notify upper layer of failure after closing HAL */
    484           if (nfc_cb.nfc_state < NFC_STATE_IDLE) {
    485             nfc_enabled(NFC_STATUS_FAILED, NULL);
    486             return;
    487           }
    488           break;
    489 
    490         case (uint32_t)NfcEvent::HCI_NETWORK_RESET:
    491           delete_stack_non_volatile_store(true);
    492           break;
    493 
    494         default:
    495           break;
    496       }
    497       break;
    498 
    499     default:
    500       LOG(ERROR) << StringPrintf("unhandled event (0x%x).", p_msg->hal_evt);
    501       break;
    502   }
    503 }
    504 
    505 /*******************************************************************************
    506 **
    507 ** Function         nfc_main_flush_cmd_queue
    508 **
    509 ** Description      This function is called when setting power off sleep state.
    510 **
    511 ** Returns          void
    512 **
    513 *******************************************************************************/
    514 void nfc_main_flush_cmd_queue(void) {
    515   NFC_HDR* p_msg;
    516 
    517   DLOG_IF(INFO, nfc_debug_enabled) << __func__;
    518 
    519   /* initialize command window */
    520   nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
    521 
    522   /* Stop command-pending timer */
    523   nfc_stop_timer(&nfc_cb.nci_wait_rsp_timer);
    524 
    525   /* dequeue and free buffer */
    526   while ((p_msg = (NFC_HDR*)GKI_dequeue(&nfc_cb.nci_cmd_xmit_q)) != NULL) {
    527     GKI_freebuf(p_msg);
    528   }
    529 }
    530 
    531 /*******************************************************************************
    532 **
    533 ** Function         nfc_main_post_hal_evt
    534 **
    535 ** Description      This function posts HAL event to NFC_TASK
    536 **
    537 ** Returns          void
    538 **
    539 *******************************************************************************/
    540 void nfc_main_post_hal_evt(uint8_t hal_evt, tHAL_NFC_STATUS status) {
    541   tNFC_HAL_EVT_MSG* p_msg;
    542 
    543   p_msg = (tNFC_HAL_EVT_MSG*)GKI_getbuf(sizeof(tNFC_HAL_EVT_MSG));
    544   if (p_msg != NULL) {
    545     /* Initialize NFC_HDR */
    546     p_msg->hdr.len = 0;
    547     p_msg->hdr.event = BT_EVT_TO_NFC_MSGS;
    548     p_msg->hdr.offset = 0;
    549     p_msg->hdr.layer_specific = 0;
    550     p_msg->hal_evt = hal_evt;
    551     p_msg->status = status;
    552     GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
    553   } else {
    554     LOG(ERROR) << StringPrintf("No buffer");
    555   }
    556 }
    557 
    558 /*******************************************************************************
    559 **
    560 ** Function         nfc_main_hal_cback
    561 **
    562 ** Description      HAL event handler
    563 **
    564 ** Returns          void
    565 **
    566 *******************************************************************************/
    567 static void nfc_main_hal_cback(uint8_t event, tHAL_NFC_STATUS status) {
    568   DLOG_IF(INFO, nfc_debug_enabled)
    569       << StringPrintf("nfc_main_hal_cback event: %s(0x%x), status=%d",
    570                       nfc_hal_event_name(event).c_str(), event, status);
    571 
    572   switch (event) {
    573     case HAL_NFC_OPEN_CPLT_EVT:
    574       /*
    575       ** if NFC_Disable() is called before receiving HAL_NFC_OPEN_CPLT_EVT,
    576       ** then wait for HAL_NFC_CLOSE_CPLT_EVT.
    577       */
    578       if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_OPEN) {
    579         if (status == HAL_NFC_STATUS_OK) {
    580           /* Notify NFC_TASK that NCI tranport is initialized */
    581           GKI_send_event(NFC_TASK, NFC_TASK_EVT_TRANSPORT_READY);
    582         } else {
    583           nfc_main_post_hal_evt(event, status);
    584         }
    585       }
    586       break;
    587 
    588     case HAL_NFC_CLOSE_CPLT_EVT:
    589     case HAL_NFC_POST_INIT_CPLT_EVT:
    590     case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
    591     case HAL_NFC_REQUEST_CONTROL_EVT:
    592     case HAL_NFC_RELEASE_CONTROL_EVT:
    593     case HAL_NFC_ERROR_EVT:
    594     case (uint32_t)NfcEvent::HCI_NETWORK_RESET:
    595       nfc_main_post_hal_evt(event, status);
    596       break;
    597 
    598     default:
    599       DLOG_IF(INFO, nfc_debug_enabled)
    600           << StringPrintf("nfc_main_hal_cback unhandled event %x", event);
    601       break;
    602   }
    603 }
    604 
    605 /*******************************************************************************
    606 **
    607 ** Function         nfc_main_hal_data_cback
    608 **
    609 ** Description      HAL data event handler
    610 **
    611 ** Returns          void
    612 **
    613 *******************************************************************************/
    614 static void nfc_main_hal_data_cback(uint16_t data_len, uint8_t* p_data) {
    615   NFC_HDR* p_msg;
    616 
    617   /* ignore all data while shutting down NFCC */
    618   if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) {
    619     return;
    620   }
    621 
    622   if (p_data) {
    623     p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_NCI_POOL_ID);
    624     if (p_msg != NULL) {
    625       /* Initialize NFC_HDR */
    626       p_msg->len = data_len;
    627       p_msg->event = BT_EVT_TO_NFC_NCI;
    628       p_msg->offset = NFC_RECEIVE_MSGS_OFFSET;
    629 
    630       /* no need to check length, it always less than pool size */
    631       memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, p_data, p_msg->len);
    632 
    633       GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
    634     } else {
    635       LOG(ERROR) << StringPrintf("No buffer");
    636     }
    637   }
    638 }
    639 
    640 /*******************************************************************************
    641 **
    642 ** Function         NFC_Enable
    643 **
    644 ** Description      This function enables NFC. Prior to calling NFC_Enable:
    645 **                  - the NFCC must be powered up, and ready to receive
    646 **                    commands.
    647 **                  - GKI must be enabled
    648 **                  - NFC_TASK must be started
    649 **                  - NCIT_TASK must be started (if using dedicated NCI
    650 **                    transport)
    651 **
    652 **                  This function opens the NCI transport (if applicable),
    653 **                  resets the NFC controller, and initializes the NFC
    654 **                  subsystems.
    655 **
    656 **                  When the NFC startup procedure is completed, an
    657 **                  NFC_ENABLE_REVT is returned to the application using the
    658 **                  tNFC_RESPONSE_CBACK.
    659 **
    660 ** Returns          tNFC_STATUS
    661 **
    662 *******************************************************************************/
    663 tNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback) {
    664   DLOG_IF(INFO, nfc_debug_enabled) << __func__;
    665 
    666   /* Validate callback */
    667   if (!p_cback) {
    668     return (NFC_STATUS_INVALID_PARAM);
    669   }
    670   nfc_cb.p_resp_cback = p_cback;
    671 
    672   /* Open HAL transport. */
    673   nfc_set_state(NFC_STATE_W4_HAL_OPEN);
    674   nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback);
    675 
    676   return (NFC_STATUS_OK);
    677 }
    678 
    679 /*******************************************************************************
    680 **
    681 ** Function         NFC_Disable
    682 **
    683 ** Description      This function performs clean up routines for shutting down
    684 **                  NFC and closes the NCI transport (if using dedicated NCI
    685 **                  transport).
    686 **
    687 **                  When the NFC shutdown procedure is completed, an
    688 **                  NFC_DISABLED_REVT is returned to the application using the
    689 **                  tNFC_RESPONSE_CBACK.
    690 **
    691 ** Returns          nothing
    692 **
    693 *******************************************************************************/
    694 void NFC_Disable(void) {
    695   DLOG_IF(INFO, nfc_debug_enabled)
    696       << StringPrintf("nfc_state = %d", nfc_cb.nfc_state);
    697 
    698   if ((nfc_cb.nfc_state == NFC_STATE_NONE) ||
    699       (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
    700     nfc_set_state(NFC_STATE_NONE);
    701     if (nfc_cb.p_resp_cback) {
    702       (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, NULL);
    703       nfc_cb.p_resp_cback = NULL;
    704     }
    705     return;
    706   }
    707 
    708   /* Close transport and clean up */
    709   nfc_task_shutdown_nfcc();
    710 }
    711 
    712 /*******************************************************************************
    713 **
    714 ** Function         NFC_Init
    715 **
    716 ** Description      This function initializes control block for NFC
    717 **
    718 ** Returns          nothing
    719 **
    720 *******************************************************************************/
    721 void NFC_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl) {
    722   int xx;
    723 
    724   /* Clear nfc control block */
    725   memset(&nfc_cb, 0, sizeof(tNFC_CB));
    726 
    727   /* Reset the nfc control block */
    728   for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++) {
    729     nfc_cb.conn_cb[xx].conn_id = NFC_ILLEGAL_CONN_ID;
    730   }
    731 
    732   /* NCI init */
    733   nfc_cb.p_hal = p_hal_entry_tbl;
    734   nfc_cb.nfc_state = NFC_STATE_NONE;
    735   nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
    736   nfc_cb.nci_wait_rsp_tout = NFC_CMD_CMPL_TIMEOUT;
    737   nfc_cb.p_disc_maps = nfc_interface_mapping;
    738   nfc_cb.num_disc_maps = NFC_NUM_INTERFACE_MAP;
    739   nfc_cb.nci_ctrl_size = NCI_CTRL_INIT_SIZE;
    740   nfc_cb.reassembly = true;
    741   nfc_cb.nci_version = NCI_VERSION_UNKNOWN;
    742   rw_init();
    743   ce_init();
    744   llcp_init();
    745   NFC_SET_MAX_CONN_DEFAULT();
    746 }
    747 
    748 /*******************************************************************************
    749 **
    750 ** Function         NFC_GetLmrtSize
    751 **
    752 ** Description      Called by application wto query the Listen Mode Routing
    753 **                  Table size supported by NFCC
    754 **
    755 ** Returns          Listen Mode Routing Table size
    756 **
    757 *******************************************************************************/
    758 uint16_t NFC_GetLmrtSize(void) {
    759   uint16_t size = 0;
    760 #if (NFC_RW_ONLY == FALSE)
    761   size = nfc_cb.max_ce_table;
    762 #endif
    763   return size;
    764 }
    765 
    766 /*******************************************************************************
    767 **
    768 ** Function         NFC_SetConfig
    769 **
    770 ** Description      This function is called to send the configuration parameter
    771 **                  TLV to NFCC. The response from NFCC is reported by
    772 **                  tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT.
    773 **
    774 ** Parameters       tlv_size - the length of p_param_tlvs.
    775 **                  p_param_tlvs - the parameter ID/Len/Value list
    776 **
    777 ** Returns          tNFC_STATUS
    778 **
    779 *******************************************************************************/
    780 tNFC_STATUS NFC_SetConfig(uint8_t tlv_size, uint8_t* p_param_tlvs) {
    781   return nci_snd_core_set_config(p_param_tlvs, tlv_size);
    782 }
    783 
    784 /*******************************************************************************
    785 **
    786 ** Function         NFC_GetConfig
    787 **
    788 ** Description      This function is called to retrieve the parameter TLV from
    789 **                  NFCC. The response from NFCC is reported by
    790 **                  tNFC_RESPONSE_CBACK as NFC_GET_CONFIG_REVT.
    791 **
    792 ** Parameters       num_ids - the number of parameter IDs
    793 **                  p_param_ids - the parameter ID list.
    794 **
    795 ** Returns          tNFC_STATUS
    796 **
    797 *******************************************************************************/
    798 tNFC_STATUS NFC_GetConfig(uint8_t num_ids, uint8_t* p_param_ids) {
    799   return nci_snd_core_get_config(p_param_ids, num_ids);
    800 }
    801 
    802 /*******************************************************************************
    803 **
    804 ** Function         NFC_DiscoveryMap
    805 **
    806 ** Description      This function is called to set the discovery interface
    807 **                  mapping. The response from NFCC is reported by
    808 **                  tNFC_DISCOVER_CBACK as NFC_MAP_DEVT.
    809 **
    810 ** Parameters       num - the number of items in p_params.
    811 **                  p_maps - the discovery interface mappings
    812 **                  p_cback - the discovery callback function
    813 **
    814 ** Returns          tNFC_STATUS
    815 **
    816 *******************************************************************************/
    817 tNFC_STATUS NFC_DiscoveryMap(uint8_t num, tNFC_DISCOVER_MAPS* p_maps,
    818                              tNFC_DISCOVER_CBACK* p_cback) {
    819   uint8_t num_disc_maps = num;
    820   uint8_t xx, yy, num_intf, intf_mask;
    821   tNFC_DISCOVER_MAPS
    822       max_maps[NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX];
    823   bool is_supported;
    824 
    825   nfc_cb.p_discv_cback = p_cback;
    826   num_intf = 0;
    827   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
    828       "nci_interfaces supported by NFCC: 0x%x", nfc_cb.nci_interfaces);
    829 
    830   for (xx = 0; xx < NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX; xx++) {
    831     memset(&max_maps[xx], 0x00, sizeof(tNFC_DISCOVER_MAPS));
    832   }
    833 
    834   for (xx = 0; xx < num_disc_maps; xx++) {
    835     is_supported = false;
    836     if (p_maps[xx].intf_type > NCI_INTERFACE_MAX) {
    837       for (yy = 0; yy < NFC_NFCC_MAX_NUM_VS_INTERFACE; yy++) {
    838         if (nfc_cb.vs_interface[yy] == p_maps[xx].intf_type)
    839           is_supported = true;
    840       }
    841       DLOG_IF(INFO, nfc_debug_enabled)
    842           << StringPrintf("[%d]: vs intf_type:0x%x is_supported:%d", xx,
    843                           p_maps[xx].intf_type, is_supported);
    844     } else {
    845       intf_mask = (1 << (p_maps[xx].intf_type));
    846       if (intf_mask & nfc_cb.nci_interfaces) {
    847         is_supported = true;
    848       }
    849       DLOG_IF(INFO, nfc_debug_enabled)
    850           << StringPrintf("[%d]: intf_type:%d intf_mask: 0x%x is_supported:%d",
    851                           xx, p_maps[xx].intf_type, intf_mask, is_supported);
    852     }
    853     if (is_supported)
    854       memcpy(&max_maps[num_intf++], &p_maps[xx], sizeof(tNFC_DISCOVER_MAPS));
    855     else {
    856       LOG(WARNING) << StringPrintf(
    857           "NFC_DiscoveryMap interface=0x%x is not supported by NFCC",
    858           p_maps[xx].intf_type);
    859     }
    860   }
    861 
    862   return nci_snd_discover_map_cmd(num_intf, (tNCI_DISCOVER_MAPS*)max_maps);
    863 }
    864 
    865 /*******************************************************************************
    866 **
    867 ** Function         NFC_DiscoveryStart
    868 **
    869 ** Description      This function is called to start Polling and/or Listening.
    870 **                  The response from NFCC is reported by tNFC_DISCOVER_CBACK as
    871 **                  NFC_START_DEVT. The notification from NFCC is reported by
    872 **                  tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT.
    873 **
    874 ** Parameters       num_params - the number of items in p_params.
    875 **                  p_params - the discovery parameters
    876 **                  p_cback - the discovery callback function
    877 **
    878 ** Returns          tNFC_STATUS
    879 **
    880 *******************************************************************************/
    881 tNFC_STATUS NFC_DiscoveryStart(uint8_t num_params,
    882                                tNFC_DISCOVER_PARAMS* p_params,
    883                                tNFC_DISCOVER_CBACK* p_cback) {
    884   uint8_t* p;
    885   int params_size;
    886   tNFC_STATUS status = NFC_STATUS_NO_BUFFERS;
    887 
    888   DLOG_IF(INFO, nfc_debug_enabled) << __func__;
    889   if (nfc_cb.p_disc_pending) {
    890     LOG(ERROR) << StringPrintf("There's pending NFC_DiscoveryStart");
    891     status = NFC_STATUS_BUSY;
    892   } else {
    893     nfc_cb.p_discv_cback = p_cback;
    894     nfc_cb.flags |= NFC_FL_DISCOVER_PENDING;
    895     nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED;
    896     params_size = sizeof(tNFC_DISCOVER_PARAMS) * num_params;
    897     nfc_cb.p_disc_pending =
    898         GKI_getbuf((uint16_t)(NFC_HDR_SIZE + 1 + params_size));
    899     if (nfc_cb.p_disc_pending) {
    900       p = (uint8_t*)nfc_cb.p_disc_pending;
    901       *p++ = num_params;
    902       memcpy(p, p_params, params_size);
    903       status = NFC_STATUS_CMD_STARTED;
    904       nfc_ncif_check_cmd_queue(NULL);
    905     }
    906   }
    907 
    908   DLOG_IF(INFO, nfc_debug_enabled)
    909       << StringPrintf("NFC_DiscoveryStart status: 0x%x", status);
    910   return status;
    911 }
    912 
    913 /*******************************************************************************
    914 **
    915 ** Function         NFC_DiscoverySelect
    916 **
    917 ** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
    918 **                  the application needs to use this function to select the
    919 **                  the logical endpoint to continue. The response from NFCC is
    920 **                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
    921 **
    922 ** Parameters       rf_disc_id - The ID identifies the remote device.
    923 **                  protocol - the logical endpoint on the remote devide
    924 **                  rf_interface - the RF interface to communicate with NFCC
    925 **
    926 ** Returns          tNFC_STATUS
    927 **
    928 *******************************************************************************/
    929 tNFC_STATUS NFC_DiscoverySelect(uint8_t rf_disc_id, uint8_t protocol,
    930                                 uint8_t rf_interface) {
    931   return nci_snd_discover_select_cmd(rf_disc_id, protocol, rf_interface);
    932 }
    933 
    934 /*******************************************************************************
    935 **
    936 ** Function         NFC_ConnCreate
    937 **
    938 ** Description      This function is called to create a logical connection with
    939 **                  NFCC for data exchange.
    940 **
    941 ** Parameters       dest_type - the destination type
    942 **                  id   - the NFCEE ID or RF Discovery ID .
    943 **                  protocol   - the protocol.
    944 **                  p_cback - the connection callback function
    945 **
    946 ** Returns          tNFC_STATUS
    947 **
    948 *******************************************************************************/
    949 tNFC_STATUS NFC_ConnCreate(uint8_t dest_type, uint8_t id, uint8_t protocol,
    950                            tNFC_CONN_CBACK* p_cback) {
    951   tNFC_STATUS status = NFC_STATUS_FAILED;
    952   tNFC_CONN_CB* p_cb;
    953   uint8_t num_tlv = 0, tlv_size = 0;
    954   uint8_t param_tlvs[4], *pp;
    955 
    956   p_cb = nfc_alloc_conn_cb(p_cback);
    957   if (p_cb) {
    958     p_cb->id = id;
    959     pp = param_tlvs;
    960     if (dest_type == NCI_DEST_TYPE_NFCEE) {
    961       num_tlv = 1;
    962       UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_NFCEE_VAL);
    963       UINT8_TO_STREAM(pp, 2);
    964       UINT8_TO_STREAM(pp, id);
    965       UINT8_TO_STREAM(pp, protocol);
    966       tlv_size = 4;
    967     } else if (dest_type == NCI_DEST_TYPE_REMOTE) {
    968       num_tlv = 1;
    969       UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_RF_DISC_ID);
    970       UINT8_TO_STREAM(pp, 1);
    971       UINT8_TO_STREAM(pp, id);
    972       tlv_size = 3;
    973     } else if (dest_type == NCI_DEST_TYPE_NFCC) {
    974       p_cb->id = NFC_TEST_ID;
    975     }
    976     /* Add handling of NCI_DEST_TYPE_REMOTE when more RF interface definitions
    977      * are added */
    978     p_cb->act_protocol = protocol;
    979     p_cb->p_cback = p_cback;
    980     status = nci_snd_core_conn_create(dest_type, num_tlv, tlv_size, param_tlvs);
    981     if (status == NFC_STATUS_FAILED) nfc_free_conn_cb(p_cb);
    982   }
    983   return status;
    984 }
    985 
    986 /*******************************************************************************
    987 **
    988 ** Function         NFC_ConnClose
    989 **
    990 ** Description      This function is called to close a logical connection with
    991 **                  NFCC.
    992 **
    993 ** Parameters       conn_id - the connection id.
    994 **
    995 ** Returns          tNFC_STATUS
    996 **
    997 *******************************************************************************/
    998 tNFC_STATUS NFC_ConnClose(uint8_t conn_id) {
    999   tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
   1000   tNFC_STATUS status = NFC_STATUS_FAILED;
   1001 
   1002   if (p_cb) {
   1003     status = nci_snd_core_conn_close(conn_id);
   1004   }
   1005   return status;
   1006 }
   1007 
   1008 /*******************************************************************************
   1009 **
   1010 ** Function         NFC_SetStaticRfCback
   1011 **
   1012 ** Description      This function is called to update the data callback function
   1013 **                  to receive the data for the given connection id.
   1014 **
   1015 ** Parameters       p_cback - the connection callback function
   1016 **
   1017 ** Returns          Nothing
   1018 **
   1019 *******************************************************************************/
   1020 void NFC_SetStaticRfCback(tNFC_CONN_CBACK* p_cback) {
   1021   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
   1022 
   1023   p_cb->p_cback = p_cback;
   1024   /* just in case DH has received NCI data before the data callback is set
   1025    * check if there's any data event to report on this connection id */
   1026   nfc_data_event(p_cb);
   1027 }
   1028 
   1029 /*******************************************************************************
   1030 **
   1031 ** Function         NFC_SetReassemblyFlag
   1032 **
   1033 ** Description      This function is called to set if nfc will reassemble
   1034 **                  nci packet as much as its buffer can hold or it should not
   1035 **                  reassemble but forward the fragmented nci packet to layer
   1036 **                  above. If nci data pkt is fragmented, nfc may send multiple
   1037 **                  NFC_DATA_CEVT with status NFC_STATUS_CONTINUE before sending
   1038 **                  NFC_DATA_CEVT with status NFC_STATUS_OK based on reassembly
   1039 **                  configuration and reassembly buffer size
   1040 **
   1041 ** Parameters       reassembly - flag to indicate if nfc may reassemble or not
   1042 **
   1043 ** Returns          Nothing
   1044 **
   1045 *******************************************************************************/
   1046 void NFC_SetReassemblyFlag(bool reassembly) { nfc_cb.reassembly = reassembly; }
   1047 
   1048 /*******************************************************************************
   1049 **
   1050 ** Function         NFC_SendData
   1051 **
   1052 ** Description      This function is called to send the given data packet
   1053 **                  to the connection identified by the given connection id.
   1054 **
   1055 ** Parameters       conn_id - the connection id.
   1056 **                  p_data - the data packet.
   1057 **                  p_data->offset must be >= NCI_MSG_OFFSET_SIZE +
   1058 **                  NCI_DATA_HDR_SIZE
   1059 **                  The data payload starts at
   1060 **                  ((uint8_t *) (p_data + 1) + p_data->offset)
   1061 **
   1062 ** Returns          tNFC_STATUS
   1063 **
   1064 *******************************************************************************/
   1065 tNFC_STATUS NFC_SendData(uint8_t conn_id, NFC_HDR* p_data) {
   1066   tNFC_STATUS status = NFC_STATUS_FAILED;
   1067   tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
   1068 
   1069   if (p_cb && p_data &&
   1070       p_data->offset >= NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE) {
   1071     status = nfc_ncif_send_data(p_cb, p_data);
   1072   }
   1073 
   1074   if (status != NFC_STATUS_OK) GKI_freebuf(p_data);
   1075 
   1076   return status;
   1077 }
   1078 
   1079 /*******************************************************************************
   1080 **
   1081 ** Function         NFC_FlushData
   1082 **
   1083 ** Description      This function is called to discard the tx data queue of
   1084 **                  the given connection id.
   1085 **
   1086 ** Parameters       conn_id - the connection id.
   1087 **
   1088 ** Returns          tNFC_STATUS
   1089 **
   1090 *******************************************************************************/
   1091 tNFC_STATUS NFC_FlushData(uint8_t conn_id) {
   1092   tNFC_STATUS status = NFC_STATUS_FAILED;
   1093   tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
   1094   void* p_buf;
   1095 
   1096   if (p_cb) {
   1097     status = NFC_STATUS_OK;
   1098     while ((p_buf = GKI_dequeue(&p_cb->tx_q)) != NULL) GKI_freebuf(p_buf);
   1099   }
   1100 
   1101   return status;
   1102 }
   1103 
   1104 /*******************************************************************************
   1105 **
   1106 ** Function         NFC_Deactivate
   1107 **
   1108 ** Description      This function is called to stop the discovery process or
   1109 **                  put the listen device in sleep mode or terminate the NFC
   1110 **                  link.
   1111 **
   1112 **                  The response from NFCC is reported by tNFC_DISCOVER_CBACK
   1113 **                  as NFC_DEACTIVATE_DEVT.
   1114 **
   1115 ** Parameters       deactivate_type - NFC_DEACTIVATE_TYPE_IDLE, to IDLE mode.
   1116 **                                    NFC_DEACTIVATE_TYPE_SLEEP to SLEEP mode.
   1117 **                                    NFC_DEACTIVATE_TYPE_SLEEP_AF to SLEEP_AF
   1118 **                                    mode.
   1119 **
   1120 ** Returns          tNFC_STATUS
   1121 **
   1122 *******************************************************************************/
   1123 tNFC_STATUS NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type) {
   1124   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
   1125   tNFC_STATUS status = NFC_STATUS_OK;
   1126 
   1127   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
   1128       "NFC_Deactivate %d (%s) deactivate_type:%d", nfc_cb.nfc_state,
   1129       nfc_state_name(nfc_cb.nfc_state).c_str(), deactivate_type);
   1130 
   1131   if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
   1132     /* the HAL pre-discover is still active - clear the pending flag */
   1133     nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
   1134     if (!(nfc_cb.flags & NFC_FL_HAL_REQUESTED)) {
   1135       /* if HAL did not request for control, clear this bit now */
   1136       nfc_cb.flags &= ~NFC_FL_CONTROL_REQUESTED;
   1137     }
   1138     GKI_freebuf(nfc_cb.p_disc_pending);
   1139     nfc_cb.p_disc_pending = NULL;
   1140     return NFC_STATUS_OK;
   1141   }
   1142 
   1143   if (nfc_cb.nfc_state == NFC_STATE_OPEN) {
   1144     nfc_set_state(NFC_STATE_CLOSING);
   1145     DLOG_IF(INFO, nfc_debug_enabled)
   1146         << StringPrintf("act_protocol %d credits:%d/%d", p_cb->act_protocol,
   1147                         p_cb->init_credits, p_cb->num_buff);
   1148     if ((p_cb->act_protocol == NCI_PROTOCOL_NFC_DEP) &&
   1149         (p_cb->init_credits != p_cb->num_buff)) {
   1150       nfc_cb.flags |= NFC_FL_DEACTIVATING;
   1151       nfc_cb.deactivate_timer.param = (uintptr_t)deactivate_type;
   1152       nfc_start_timer(&nfc_cb.deactivate_timer,
   1153                       (uint16_t)(NFC_TTYPE_WAIT_2_DEACTIVATE),
   1154                       NFC_DEACTIVATE_TIMEOUT);
   1155       return status;
   1156     }
   1157   }
   1158 
   1159   status = nci_snd_deactivate_cmd(deactivate_type);
   1160   return status;
   1161 }
   1162 /*******************************************************************************
   1163 **
   1164 ** Function         NFC_SetPowerSubState
   1165 **
   1166 ** Description      This function is called to send the power sub state (screen
   1167 **                  state) to NFCC. The response from NFCC is reported by
   1168 **                  tNFC_RESPONSE_CBACK as NFC_SET_POWER_STATE_REVT.
   1169 **
   1170 ** Parameters       scree_state
   1171 **
   1172 ** Returns          tNFC_STATUS
   1173 **
   1174 *******************************************************************************/
   1175 tNFC_STATUS NFC_SetPowerSubState(uint8_t screen_state) {
   1176   return nci_snd_core_set_power_sub_state(screen_state);
   1177 }
   1178 /*******************************************************************************
   1179 **
   1180 ** Function         NFC_UpdateRFCommParams
   1181 **
   1182 ** Description      This function is called to update RF Communication
   1183 **                  parameters once the Frame RF Interface has been activated.
   1184 **
   1185 **                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
   1186 **                  as NFC_RF_COMM_PARAMS_UPDATE_REVT.
   1187 **
   1188 ** Returns          tNFC_STATUS
   1189 **
   1190 *******************************************************************************/
   1191 tNFC_STATUS NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS* p_params) {
   1192   uint8_t tlvs[12];
   1193   uint8_t* p = tlvs;
   1194   uint8_t data_exch_config;
   1195 
   1196   /* RF Technology and Mode */
   1197   if (p_params->include_rf_tech_mode) {
   1198     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TECH_N_MODE);
   1199     UINT8_TO_STREAM(p, 1);
   1200     UINT8_TO_STREAM(p, p_params->rf_tech_n_mode);
   1201   }
   1202 
   1203   /* Transmit Bit Rate */
   1204   if (p_params->include_tx_bit_rate) {
   1205     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TX_BIT_RATE);
   1206     UINT8_TO_STREAM(p, 1);
   1207     UINT8_TO_STREAM(p, p_params->tx_bit_rate);
   1208   }
   1209 
   1210   /* Receive Bit Rate */
   1211   if (p_params->include_tx_bit_rate) {
   1212     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_RX_BIT_RATE);
   1213     UINT8_TO_STREAM(p, 1);
   1214     UINT8_TO_STREAM(p, p_params->rx_bit_rate);
   1215   }
   1216 
   1217   /* NFC-B Data Exchange Configuration */
   1218   if (p_params->include_nfc_b_config) {
   1219     UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_B_DATA_EX_PARAM);
   1220     UINT8_TO_STREAM(p, 1);
   1221 
   1222     data_exch_config = (p_params->min_tr0 & 0x03) << 6; /* b7b6 : Mininum TR0 */
   1223     data_exch_config |= (p_params->min_tr1 & 0x03)
   1224                         << 4; /* b5b4 : Mininum TR1 */
   1225     data_exch_config |= (p_params->suppression_eos & 0x01)
   1226                         << 3; /* b3 :   Suppression of EoS */
   1227     data_exch_config |= (p_params->suppression_sos & 0x01)
   1228                         << 2; /* b2 :   Suppression of SoS */
   1229     data_exch_config |= (p_params->min_tr2 & 0x03); /* b1b0 : Mininum TR2 */
   1230 
   1231     UINT8_TO_STREAM(p, data_exch_config);
   1232   }
   1233 
   1234   return nci_snd_parameter_update_cmd(tlvs, (uint8_t)(p - tlvs));
   1235 }
   1236 
   1237 /*******************************************************************************
   1238 **
   1239 ** Function         NFC_SetPowerOffSleep
   1240 **
   1241 ** Description      This function closes/opens transport and turns off/on NFCC.
   1242 **
   1243 ** Returns          tNFC_STATUS
   1244 **
   1245 *******************************************************************************/
   1246 tNFC_STATUS NFC_SetPowerOffSleep(bool enable) {
   1247   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("enable = %d", enable);
   1248 
   1249   if ((enable == false) &&
   1250       (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
   1251     nfc_cb.flags |= NFC_FL_RESTARTING;
   1252 
   1253     /* open transport */
   1254     nfc_set_state(NFC_STATE_W4_HAL_OPEN);
   1255     nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback);
   1256 
   1257     return NFC_STATUS_OK;
   1258   } else if ((enable == true) && (nfc_cb.nfc_state == NFC_STATE_IDLE)) {
   1259     /* close transport to turn off NFCC and clean up */
   1260     nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
   1261     nfc_task_shutdown_nfcc();
   1262 
   1263     return NFC_STATUS_OK;
   1264   }
   1265 
   1266   LOG(ERROR) << StringPrintf("invalid state = %d", nfc_cb.nfc_state);
   1267   return NFC_STATUS_FAILED;
   1268 }
   1269 
   1270 /*******************************************************************************
   1271 **
   1272 ** Function         NFC_PowerCycleNFCC
   1273 **
   1274 ** Description      This function turns off and then on NFCC.
   1275 **
   1276 ** Returns          tNFC_STATUS
   1277 **
   1278 *******************************************************************************/
   1279 tNFC_STATUS NFC_PowerCycleNFCC(void) {
   1280   DLOG_IF(INFO, nfc_debug_enabled) << __func__;
   1281 
   1282   if (nfc_cb.nfc_state == NFC_STATE_IDLE) {
   1283     /* power cycle NFCC */
   1284     nfc_cb.flags |= NFC_FL_POWER_CYCLE_NFCC;
   1285     nfc_task_shutdown_nfcc();
   1286 
   1287     return NFC_STATUS_OK;
   1288   }
   1289 
   1290   LOG(ERROR) << StringPrintf("invalid state = %d", nfc_cb.nfc_state);
   1291   return NFC_STATUS_FAILED;
   1292 }
   1293 
   1294 /*******************************************************************************
   1295 **
   1296 ** Function         NFC_GetNCIVersion
   1297 **
   1298 ** Description      Called by higher layer to get the current nci
   1299 **                  version of nfc.
   1300 **
   1301 ** Returns          NCI version NCI2.0 / NCI1.0
   1302 **
   1303 *******************************************************************************/
   1304 uint8_t NFC_GetNCIVersion() { return nfc_cb.nci_version; }
   1305 
   1306 /*******************************************************************************
   1307 **
   1308 ** Function         NFC_ISODEPNakPresCheck
   1309 **
   1310 ** Description      This function is called to send the ISO DEP nak presenc
   1311 **                  check cmd to check that the remote end point in RF field.
   1312 **
   1313 **                  The response from NFCC is reported by call back.The ntf
   1314 **                  indicates success if card is present in field or failed
   1315 **                  if card is lost.
   1316 **
   1317 ** Returns          tNFC_STATUS
   1318 **
   1319 *******************************************************************************/
   1320 tNFC_STATUS NFC_ISODEPNakPresCheck() {
   1321   return nci_snd_iso_dep_nak_presence_check_cmd();
   1322 }
   1323 
   1324 /*******************************************************************************
   1325 **
   1326 ** Function         NFC_SetStaticHciCback
   1327 **
   1328 ** Description      This function is called to update the data callback function
   1329 **                  to receive the data for the static Hci connection id.
   1330 **
   1331 ** Parameters       p_cback - the connection callback function
   1332 **
   1333 ** Returns          Nothing
   1334 **
   1335 *******************************************************************************/
   1336 void NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback) {
   1337   DLOG_IF(INFO, nfc_debug_enabled)
   1338       << StringPrintf("%s dest: %d", __func__, NCI_DEST_TYPE_NFCEE);
   1339   tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
   1340   tNFC_CONN evt_data;
   1341 
   1342   p_cb->p_cback = p_cback;
   1343   if (p_cback && p_cb->buff_size && p_cb->num_buff) {
   1344     DLOG_IF(INFO, nfc_debug_enabled)
   1345         << StringPrintf("%s dest: %d", __func__, NCI_DEST_TYPE_NFCEE);
   1346     evt_data.conn_create.status = NFC_STATUS_OK;
   1347     evt_data.conn_create.dest_type = NCI_DEST_TYPE_NFCEE;
   1348     evt_data.conn_create.id = p_cb->id;
   1349     evt_data.conn_create.buff_size = p_cb->buff_size;
   1350     evt_data.conn_create.num_buffs = p_cb->num_buff;
   1351     (*p_cback)(NFC_HCI_CONN_ID, NFC_CONN_CREATE_CEVT, &evt_data);
   1352   }
   1353 }
   1354 
   1355 /*******************************************************************************
   1356 **
   1357 ** Function         NFC_GetStatusName
   1358 **
   1359 ** Description      This function returns the status name.
   1360 **
   1361 ** NOTE             conditionally compiled to save memory.
   1362 **
   1363 ** Returns          pointer to the name
   1364 **
   1365 *******************************************************************************/
   1366 std::string NFC_GetStatusName(tNFC_STATUS status) {
   1367   switch (status) {
   1368     case NFC_STATUS_OK:
   1369       return "OK";
   1370     case NFC_STATUS_REJECTED:
   1371       return "REJECTED";
   1372     case NFC_STATUS_MSG_CORRUPTED:
   1373       return "CORRUPTED";
   1374     case NFC_STATUS_BUFFER_FULL:
   1375       return "BUFFER_FULL";
   1376     case NFC_STATUS_FAILED:
   1377       return "FAILED";
   1378     case NFC_STATUS_NOT_INITIALIZED:
   1379       return "NOT_INITIALIZED";
   1380     case NFC_STATUS_SYNTAX_ERROR:
   1381       return "SYNTAX_ERROR";
   1382     case NFC_STATUS_SEMANTIC_ERROR:
   1383       return "SEMANTIC_ERROR";
   1384     case NFC_STATUS_UNKNOWN_GID:
   1385       return "UNKNOWN_GID";
   1386     case NFC_STATUS_UNKNOWN_OID:
   1387       return "UNKNOWN_OID";
   1388     case NFC_STATUS_INVALID_PARAM:
   1389       return "INVALID_PARAM";
   1390     case NFC_STATUS_MSG_SIZE_TOO_BIG:
   1391       return "MSG_SIZE_TOO_BIG";
   1392     case NFC_STATUS_ALREADY_STARTED:
   1393       return "ALREADY_STARTED";
   1394     case NFC_STATUS_ACTIVATION_FAILED:
   1395       return "ACTIVATION_FAILED";
   1396     case NFC_STATUS_TEAR_DOWN:
   1397       return "TEAR_DOWN";
   1398     case NFC_STATUS_RF_TRANSMISSION_ERR:
   1399       return "RF_TRANSMISSION_ERR";
   1400     case NFC_STATUS_RF_PROTOCOL_ERR:
   1401       return "RF_PROTOCOL_ERR";
   1402     case NFC_STATUS_TIMEOUT:
   1403       return "TIMEOUT";
   1404     case NFC_STATUS_EE_INTF_ACTIVE_FAIL:
   1405       return "EE_INTF_ACTIVE_FAIL";
   1406     case NFC_STATUS_EE_TRANSMISSION_ERR:
   1407       return "EE_TRANSMISSION_ERR";
   1408     case NFC_STATUS_EE_PROTOCOL_ERR:
   1409       return "EE_PROTOCOL_ERR";
   1410     case NFC_STATUS_EE_TIMEOUT:
   1411       return "EE_TIMEOUT";
   1412     case NFC_STATUS_CMD_STARTED:
   1413       return "CMD_STARTED";
   1414     case NFC_STATUS_HW_TIMEOUT:
   1415       return "HW_TIMEOUT";
   1416     case NFC_STATUS_CONTINUE:
   1417       return "CONTINUE";
   1418     case NFC_STATUS_REFUSED:
   1419       return "REFUSED";
   1420     case NFC_STATUS_BAD_RESP:
   1421       return "BAD_RESP";
   1422     case NFC_STATUS_CMD_NOT_CMPLTD:
   1423       return "CMD_NOT_CMPLTD";
   1424     case NFC_STATUS_NO_BUFFERS:
   1425       return "NO_BUFFERS";
   1426     case NFC_STATUS_WRONG_PROTOCOL:
   1427       return "WRONG_PROTOCOL";
   1428     case NFC_STATUS_BUSY:
   1429       return "BUSY";
   1430     case NFC_STATUS_LINK_LOSS:
   1431       return "LINK_LOSS";
   1432     case NFC_STATUS_BAD_LENGTH:
   1433       return "BAD_LENGTH";
   1434     case NFC_STATUS_BAD_HANDLE:
   1435       return "BAD_HANDLE";
   1436     case NFC_STATUS_CONGESTED:
   1437       return "CONGESTED";
   1438     default:
   1439       return "UNKNOWN";
   1440   }
   1441 }
   1442