1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2012-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Vendor-specific handler for HCI events
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
26a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#include "nfc_hal_target.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_api.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
29a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
30a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE))
31a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_nv_ci.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_nv_co.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
36a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFC_HAL_HCI_NV_READ_TIMEOUT
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_HCI_NV_READ_TIMEOUT    1000
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFC_HAL_HCI_NFCC_RSP_TIMEOUT
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_HCI_NFCC_RSP_TIMEOUT   3000
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET    0x0C
475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET    0x32
485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET   0x7F
495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET    0xB4
505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_PIPE_VALID_MASK                         0x80
525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
53a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL             0xFF
54a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL              0xFE
55a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
56a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/* Version string for BCM20791B3 */
57a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuconst UINT8 NFC_HAL_DM_BCM20791B3_STR[]   = "20791B3";
58a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_DM_BCM20791B3_STR_LEN     (sizeof (NFC_HAL_DM_BCM20791B3_STR)-1)
59a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
60a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/* Version string for BCM20791B4 */
61a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuconst UINT8 NFC_HAL_DM_BCM20791B4_STR[]   = "20791B4";
62a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_DM_BCM20791B4_STR_LEN     (sizeof (NFC_HAL_DM_BCM20791B4_STR)-1)
63a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
64a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/* Version string for BCM43341B0 */
65a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuconst UINT8 NFC_HAL_DM_BCM43341B0_STR[]   = "43341B0";
66a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_DM_BCM43341B0_STR_LEN     (sizeof (NFC_HAL_DM_BCM43341B0_STR)-1)
67a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern tNFC_HAL_CFG *p_nfc_hal_cfg;
695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/****************************************************************************
705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Internal function prototypes
715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen****************************************************************************/
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_set_next_hci_netwk_config (UINT8 block);
735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void nfc_hal_hci_remove_dyn_pipe_to_uicc1 (void);
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 size);
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_init_complete (tHAL_NFC_STATUS status);
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_vsc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data);
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_hci_evt_hdlr
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing event for NFA HCI
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_evt_hdlr (tNFC_HAL_HCI_EVENT_DATA *p_evt_data)
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
89df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG0 ("nfc_hal_hci_evt_hdlr ()");
90df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_evt_data->hdr.event)
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_HCI_RSP_NV_READ_EVT:
94a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (  (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf && (p_evt_data->nv_read.block == HC_F3_NV_BLOCK || p_evt_data->nv_read.block == HC_F4_NV_BLOCK || p_evt_data->nv_read.block == HC_F5_NV_BLOCK))
955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ||(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf && p_evt_data->nv_read.block == HC_F2_NV_BLOCK)  )
965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
97a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status, p_evt_data->nv_read.size);
985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
1005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
1015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* Invalid block or no buffer, Ignore */
1025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_ERROR1 ("nfc_hal_hci_evt_hdlr: No buffer for handling read NV block: 0x%02x", p_evt_data->nv_read.block);
1035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_HCI_RSP_NV_WRITE_EVT:
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NV Ram write completed - nothing to do... */
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_hci_enable
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Program nv data on to controller
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_enable (void)
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p_hci_netwk_cmd;
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
129df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG0 ("nfc_hal_hci_enable ()");
130df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
1315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_NONE)
1325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_DEBUG1 ("nfc_hal_hci_enable (): No HCI NETWK CMD to send for NVM Type: 0x%02x", nfc_hal_cb.nvm_cb.nvm_type);
1345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfc_hal_hci_init_complete (HAL_NFC_STATUS_OK);
1355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
1365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
1375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf)
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE);
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_hci_netwk_cmd);
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf = NULL;
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf)
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE);
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_hci_netwk_cmd);
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.hci_cb.p_hci_netwk_info_buf = NULL;
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (  (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC0_HOST)
153a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        ||((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST) && ((!nfc_hal_cb.hci_cb.hci_fw_workaround) || (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM)))
154a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        ||(p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST)  )
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ((p_hci_netwk_cmd = (UINT8 *) GKI_getbuf (NCI_MSG_HDR_SIZE + NFC_HAL_HCI_NETWK_INFO_SIZE)) == NULL)
1575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
1585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_ERROR0 ("nfc_hal_hci_enable: unable to allocate buffer for reading hci network info from nvram");
1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED);
1605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
1635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfc_hal_cb.hci_cb.p_hci_netwk_info_buf   = (UINT8 *) (p_hci_netwk_cmd + NCI_MSG_HDR_SIZE);
1645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfc_hal_cb.hci_cb.hci_netwk_config_block = 0;
1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC0_HOST)
1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
1675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE);
1685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F3_NV_BLOCK);
1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT);
1705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
1715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else
1725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
1735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                HAL_TRACE_DEBUG1 ("nfc_hal_hci_enable (): Skip send F3 HCI NETWK CMD for UICC Mask: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support);
1745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_hci_set_next_hci_netwk_config (HC_F3_NV_BLOCK);
1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_DEBUG2 ("nfc_hal_hci_enable (): No HCI NETWK CMD to send for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type);
1825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfc_hal_hci_set_next_hci_netwk_config (HC_F2_NV_BLOCK);
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
188a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function         nfc_hal_hci_handle_build_info
189a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
190a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description      handle build info evt
191a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
192a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns          void
193a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
194a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/
195a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuvoid nfc_hal_hci_handle_build_info (UINT8 chipverlen, UINT8 *p_chipverstr)
196a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu{
197a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_build_info ()");
198a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
199a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if ((chipverlen == NFC_HAL_DM_BCM20791B3_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B3_STR, p_chipverstr, NFC_HAL_DM_BCM20791B3_STR_LEN) == 0))
200a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
201a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        /* BCM2079B3 FW - eSE restarted for patch download */
202a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_cb.hci_cb.hci_fw_workaround         = TRUE;
203a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = TRUE;
204a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
205a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    else if (  ((chipverlen == NFC_HAL_DM_BCM20791B4_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B4_STR, p_chipverstr, NFC_HAL_DM_BCM20791B4_STR_LEN) == 0))
206a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu             ||((chipverlen == NFC_HAL_DM_BCM43341B0_STR_LEN) && (memcmp (NFC_HAL_DM_BCM43341B0_STR, p_chipverstr, NFC_HAL_DM_BCM43341B0_STR_LEN) == 0))  )
207a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
208a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        /* BCM43341B0/BCM2079B4 FW - eSE restarted for patch download */
209a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_cb.hci_cb.hci_fw_workaround         = TRUE;
210a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE;
211a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
212a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    else
213a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
214a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        /* BCM2079B5 FW - eSE not be restarted for patch download from UICC */
215a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_cb.hci_cb.hci_fw_workaround         = FALSE;
216a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE;
217a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
218a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu}
219a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
220a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/*******************************************************************************
221a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_hci_handle_hci_netwk_info
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handler function for HCI Network Notification
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_handle_hci_netwk_info (UINT8 *p_data)
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  *p = p_data;
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 data_len;
233a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8  target_handle = 0;
234a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8  hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN];
235a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8  block = 0;
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
237df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hci_netwk_info ()");
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* skip NCI header byte0 (MT,GID), byte1 (OID) */
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p += 2;
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    STREAM_TO_UINT8 (data_len, p);
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    target_handle = *(UINT8 *) p;
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (target_handle == NFC_HAL_HCI_DH_TARGET_HANDLE)
246a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
247a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        /* Correct the session id assigned by DH */
248a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        *(p+1) = nfc_hal_cb.hci_cb.dh_session_id[0];
2495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfc_hal_nv_co_write (p, data_len, HC_F2_NV_BLOCK);
250a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        return;
251a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
253a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if (target_handle == NFC_HAL_HCI_UICC0_TARGET_HANDLE)
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
255a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        block = HC_F3_NV_BLOCK;
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (target_handle == NFC_HAL_HCI_UICC1_TARGET_HANDLE)
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
259a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        block = HC_F4_NV_BLOCK;
260a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
261a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    else if (target_handle == NFC_HAL_HCI_UICC2_TARGET_HANDLE)
262a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
263a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        block = HC_F5_NV_BLOCK;
264a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
265a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    else
266a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
267a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Invalid Target handle: 0x%02x", target_handle);
268a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        return;
269a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
270a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
271a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if (  (!nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd)
272a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK)
273a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK)
274a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK)
275a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK)  )
276a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
277a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        /* HCI Network notification received for UICC0/UICC1/UICC2, Update nv data */
278a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_nv_co_write (p, data_len, block);
279a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
280a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    else
281a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
282a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Type A Card Emulation invalid, Reset nv file: 0x%02x", p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET]);
283a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        hci_netwk_cmd[0] = target_handle;
284a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN);
285a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_nv_co_write (hci_netwk_cmd, 1, block);
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh
2925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
2935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task
2945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
2955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          None
2965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
2975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
2985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh (void)
2995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
3005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFC_HDR  *p_msg;
3015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8 *p, *ps;
3025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG1 ("nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh (): Fake ADM_NOTIFY_ALL_PIPE_CLEARED (0x%02x) from HAL", NFC_HAL_HCI_HOST_ID_UICC1);
3045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Start of new message. Allocate a buffer for message */
3065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ((p_msg = (NFC_HDR *) GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
3075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
3085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Initialize NFC_HDR */
3095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->len    = NCI_DATA_HDR_SIZE + 0x03;
3105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->event  = 0;
3115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->offset = 0;
3125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->layer_specific = 0;
3135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p = (UINT8 *) (p_msg + 1) + p_msg->offset;
3155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ps = p;
3165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        NCI_DATA_BLD_HDR (p, nfc_hal_cb.hci_cb.hcp_conn_id, 0x03);
3175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* HCP header with ADMIN pipe id and chaining bit set */
3185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        *p++ = ((1 << 0x07) | (NFC_HAL_HCI_ADMIN_PIPE & 0x7F));
3195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* HCP Message header with Command type instruction and ADM_NOTIFY_ALL_PIPE_CLEARED command */
3205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        *p++ = ((NFC_HAL_HCI_COMMAND_TYPE << 6) | (NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED & 0x3F));
3215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* HCP Data with UICC1 host id */
3225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        *p = NFC_HAL_HCI_HOST_ID_UICC1;
3235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifdef DISP_NCI
3255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        DISP_NCI (ps, (UINT16) p_msg->len, TRUE);
3265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
3275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfc_hal_send_nci_msg_to_nfc_task (p_msg);
3285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
3305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
3315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
3325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_ERROR0 ("Unable to allocate buffer for faking ADM_NOTIFY_ALL_PIPE_CLEARED cmd from HAL to stack");
3335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
3345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
3355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
3375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
3385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_hci_handle_hcp_pkt_to_hc
3395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
3405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Handle HCP Packet from NFC task to Host Controller
3415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
3425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          FALSE to send the packet to host controller
3435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  TRUE to drop the packet and fake credit ntf for hcp connection
3445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
3455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
3465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenenBOOLEAN nfc_hal_hci_handle_hcp_pkt_to_hc (UINT8 *p_data)
3475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
3485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8   chaining_bit;
3495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8   pipe;
3505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8   type;
3515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8   inst;
3525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8   index;
3535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hcp_pkt_to_hc ()");
3555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    chaining_bit = ((*p_data) >> 0x07) & 0x01;
3575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    pipe = (*p_data++) & 0x7F;
3585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (  (chaining_bit)
3605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        &&(pipe == NFC_HAL_HCI_ADMIN_PIPE)  )
3615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
3625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        type  = ((*p_data) >> 0x06) & 0x03;
3635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (type == NFC_HAL_HCI_COMMAND_TYPE)
3655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
3665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            inst  = (*p_data++ & 0x3F);
367a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if (inst == NFC_HAL_HCI_ANY_GET_PARAMETER)
3685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
3695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                index = *(p_data++);
370a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX)
3715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
372a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    /* Set flag to modify session id[0] on response
373a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                     * from host controller to set session id cmd
3745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                     */
375a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    nfc_hal_cb.hci_cb.update_session_id = TRUE;
376a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                }
377a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            }
378a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            else if (inst == NFC_HAL_HCI_ANY_SET_PARAMETER)
379a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            {
380a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                index = *(p_data++);
381a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                if (index == NFC_HAL_HCI_WHITELIST_INDEX)
382a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                {
383a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    if (  (nfc_hal_cb.hci_cb.hci_fw_workaround)
384a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                        &&(nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC)  )
385a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    {
386a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                        /* Set flag to fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task after
387a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                         * response from host controller to set whitelist cmd
388a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                         */
389a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                        nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = TRUE;
390a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    }
391a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                }
392a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                else if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX)
393a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                {
394a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    nfc_hal_cb.hci_cb.dh_session_id[0] = *p_data;
395a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    if (p_nfc_hal_cfg->nfc_hal_first_boot)
396a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                        *p_data = NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL;
397a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    else
398a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                        *p_data = NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL;
3995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
4005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
4015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
4025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if (type == NFC_HAL_HCI_RESPONSE_TYPE)
4035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
404a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if (  (nfc_hal_cb.hci_cb.hci_fw_workaround)
405a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                &&(nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC)
406a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                &&(nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1)  )
4075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
4085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* Got response to the fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd sent by HAL to nfc task */
4095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 =  FALSE;
4105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* return TRUE to drop this hcp without forwarding to host controller */
4115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                return TRUE;
4125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
4135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
4145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
4155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    return FALSE;
4175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
4185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
4205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_hci_handle_hcp_pkt_from_hc
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
4235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Handle HCP Packet from Host controller to Terminal Host
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_hci_handle_hcp_pkt_from_hc (UINT8 *p_data)
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   chaining_bit;
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   pipe;
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   type;
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   inst;
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN];
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   source_host;
436a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8   block = 0;
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
438df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hcp_pkt_from_hc ()");
439df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    chaining_bit = ((*p_data) >> 0x07) & 0x01;
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pipe = (*p_data++) & 0x7F;
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (chaining_bit)
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(pipe == NFC_HAL_HCI_ADMIN_PIPE)  )
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        type  = ((*p_data) >> 0x06) & 0x03;
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (type == NFC_HAL_HCI_COMMAND_TYPE)
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
450a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if (!nfc_hal_cb.hci_cb.hci_fw_workaround)
451a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                return;
452a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            inst  = (*p_data++ & 0x3F);
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (inst == NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED)
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                STREAM_TO_UINT8 (source_host, p_data);
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Received ADM_NOTIFY_ALL_PIPE_CLEARED command for UICC: 0x%02x", source_host);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (source_host == NFC_HAL_HCI_HOST_ID_UICC0)
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
462a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    block            = HC_F3_NV_BLOCK;
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    hci_netwk_cmd[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE;
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (source_host == NFC_HAL_HCI_HOST_ID_UICC1)
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
467a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    block            = HC_F4_NV_BLOCK;
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    hci_netwk_cmd[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE;
469a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                }
470a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                else if (source_host == NFC_HAL_HCI_HOST_ID_UICC2)
471a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                {
472a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    block            = HC_F5_NV_BLOCK;
473a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    hci_netwk_cmd[0] = NFC_HAL_HCI_UICC2_TARGET_HANDLE;
474a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                }
475a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
476a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                if (source_host >= NFC_HAL_HCI_HOST_ID_UICC0)
477a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                {
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Reset Session ID */
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN);
480a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    nfc_hal_nv_co_write (hci_netwk_cmd, 1, block);
481a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Sent command to reset nv file for block: 0x%02x", block);
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
4855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if (type == NFC_HAL_HCI_RESPONSE_TYPE)
4865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
487a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if (nfc_hal_cb.hci_cb.update_session_id)
488a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            {
489a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                nfc_hal_cb.hci_cb.update_session_id = FALSE;
490a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                inst  = (*p_data++ & 0x3F);
491a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                if (inst == NFC_HAL_HCI_ANY_OK)
492a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                {
493a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    /* Correct the session id assigned by DH */
494a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    *p_data = nfc_hal_cb.hci_cb.dh_session_id[0];
495a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                }
496a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            }
497a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            else if (nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1)
4985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
4995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* NVM Type is UICC and got response from host controller
5005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                 * to Set whitelist command. Now fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to
5015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                 * NFC Task and then forward the whitelist cmd response
5025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                 */
5035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh ();
5045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
5055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_hci_handle_nv_read
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      handler function for nv read complete event
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 size)
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p;
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p_hci_netwk_info = NULL;
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
523df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG3 ("nfc_hal_hci_handle_nv_read (): Block: [0x%02x], Status: [0x%02x], Size: [0x%04x]", block, status, size);
524df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Stop timer as NVDATA Read Completed */
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.hci_cb.hci_timer);
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (block)
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HC_F3_NV_BLOCK:
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HC_F4_NV_BLOCK:
532a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    case HC_F5_NV_BLOCK:
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (status != HAL_NFC_STATUS_OK)
5345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ||(size > NFC_HAL_HCI_NETWK_INFO_SIZE)
5355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ||(size < NFC_HAL_HCI_MIN_NETWK_INFO_SIZE)
5365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ||((nfc_hal_cb.hci_cb.hci_fw_workaround) && (block == HC_F4_NV_BLOCK) && (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC))  )
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
5385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set DEFAULT Configuration for block:0x%02x", block);
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE);
540a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if (block == HC_F3_NV_BLOCK)
541a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE;
542a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            else if (block == HC_F4_NV_BLOCK)
543a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE;
544a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            else
545a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC2_TARGET_HANDLE;
546a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memset (&nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN);
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            size = NFC_HAL_HCI_NETWK_INFO_SIZE;
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_hci_netwk_info = (UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE;
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case HC_F2_NV_BLOCK:
555a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        nfc_hal_cb.hci_cb.dh_session_id[0] = nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1];
556a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (p_nfc_hal_cfg->nfc_hal_first_boot)
557a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] = NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL;
558a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        else
559a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] = NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL;
5605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (  (status != HAL_NFC_STATUS_OK)
5625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ||(size > NFC_HAL_HCI_DH_NETWK_INFO_SIZE)
5635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ||(size < NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE)  )
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
5655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set DEFAULT Configuration for block:0x%02x", block);
5665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[0] = NFC_HAL_HCI_DH_TARGET_HANDLE;
567a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_cb.hci_cb.dh_session_id[0] = 0xFF;
568a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            memset (&nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[2], 0xFF, (NFC_HAL_HCI_SESSION_ID_LEN - 1));
569a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            memset ((nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf + NFC_HAL_HCI_SESSION_ID_LEN + 1), 0, (NFC_HAL_HCI_DH_NETWK_INFO_SIZE - NFC_HAL_HCI_SESSION_ID_LEN - 1));
5705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            size = NFC_HAL_HCI_DH_NETWK_INFO_SIZE;
5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            p_hci_netwk_info = (UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE;
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
5755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if ((nfc_hal_cb.hci_cb.hci_fw_workaround) && (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC))
5765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
5775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* if NVM Type is UICC, then UICC1 will find session id mismatch when activated for patch download,
5785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                 * and will remove pipes connected to DH even before DH is enabled, So DH will update NFCC
5795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                 * control block by removing all dynamic pipes connected to UICC1 */
5805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_hci_remove_dyn_pipe_to_uicc1 ();
5825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                size = NFC_HAL_HCI_DH_NETWK_INFO_SIZE;
5835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
5845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            p_hci_netwk_info = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE);
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
592a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    p = p_hci_netwk_info;
593a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    /* Send HCI Network ntf command using nv data */
594a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_PROP);
595a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    NCI_MSG_BLD_HDR1 (p, NCI_MSG_HCI_NETWK);
596a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8_TO_STREAM (p, (UINT8) size);
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
598a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    nfc_hal_dm_send_nci_cmd (p_hci_netwk_info, (UINT16) (NCI_MSG_HDR_SIZE + size), nfc_hal_hci_vsc_cback);
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
600a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    nfc_hal_cb.hci_cb.hci_netwk_config_block = block;
6015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
6025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
6045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_hci_remove_dyn_pipe_to_uicc1
6065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Prepare hci network command read from nv file removing
6085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  all pipes connected to UICC1
6095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          None
6115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
6135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_hci_remove_dyn_pipe_to_uicc1 (void)
6145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
6155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8 *p, *np;
6165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8 num_dyn_pipes = 0, new_num_dyn_pipes = 0;
6175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8 xx;
6185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8 source_host, dest_host, pipe_id;
6195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
620df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG0 ("nfc_hal_hci_remove_dyn_pipe_to_uicc1 ()");
621df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
6225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p  = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf + NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE);
6235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    np = p;
6245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    num_dyn_pipes = *(p - 1);
6255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    for (xx = 0; xx < num_dyn_pipes; xx++,p += NFC_HAL_HCI_PIPE_INFO_SIZE)
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
6285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        source_host = *(UINT8 *) (p);
6295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        dest_host   = *(UINT8 *) (p + 1);
6305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        pipe_id     = *(UINT8 *) (p + 4);
6315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ((source_host != NFC_HAL_HCI_HOST_ID_UICC1) && (dest_host != NFC_HAL_HCI_HOST_ID_UICC1))
6335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
6345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            memcpy (np, p, NFC_HAL_HCI_PIPE_INFO_SIZE);
6355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            np += NFC_HAL_HCI_PIPE_INFO_SIZE;
6365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            new_num_dyn_pipes++;
6375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset ((UINT8 *) (np), 0, NFC_HAL_HCI_PIPE_INFO_SIZE * (20 - new_num_dyn_pipes));
6415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Update number of pipes after removing pipes connected to UICC1 */
6435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf + NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE);
6445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    *(p - 1) = new_num_dyn_pipes;
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_hci_init_complete
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Notify VSC initialization is complete
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_init_complete (tHAL_NFC_STATUS status)
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p_hci_netwk_cmd;
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
660df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG1 ("nfc_hal_hci_init_complete (): Status: [0x%02x]", status);
661df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf)
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE);
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_hci_netwk_cmd);
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf = NULL;
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf)
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE);
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_hci_netwk_cmd);
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.hci_cb.p_hci_netwk_info_buf = NULL;
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
6775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
678df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, status);
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_hci_set_next_hci_netwk_config
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      set next hci network configuration
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_set_next_hci_netwk_config (UINT8 block)
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p_hci_netwk_cmd;
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
694df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG1 ("nfc_hal_hci_set_next_hci_netwk_config (): Block: [0x%02x]", block);
695df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (block)
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HC_F3_NV_BLOCK:
6995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (  (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST)
700df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu            &&(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf)
7015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            &&((!nfc_hal_cb.hci_cb.hci_fw_workaround) || (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM))  )
7025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
7035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* Send command to read nvram data for 0xF4 */
7045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE);
7055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F4_NV_BLOCK);
7065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT);
7075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            break;
7085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
7095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_DEBUG2 ("nfc_hal_hci_set_next_hci_netwk_config (): Skip send F4 HCI NETWK CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type);
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HC_F4_NV_BLOCK:
712a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (  (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST)
713a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            &&(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf)  )
714a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
715a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            /* Send command to read nvram data for 0xF5 */
716a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE);
717a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F5_NV_BLOCK);
718a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT);
719a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            break;
720a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
721a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        HAL_TRACE_DEBUG2 ("nfc_hal_hci_set_next_hci_netwk_config (): Skip send F5 HCI NETWK CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type);
722a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
723a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    case HC_F5_NV_BLOCK:
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_hci_netwk_cmd = (UINT8 *) GKI_getbuf (NCI_MSG_HDR_SIZE + NFC_HAL_HCI_DH_NETWK_INFO_SIZE)) == NULL)
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
7265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_ERROR0 ("nfc_hal_hci_set_next_hci_netwk_config: unable to allocate buffer for reading hci network info from nvram");
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED);
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf   = (UINT8 *) (p_hci_netwk_cmd + NCI_MSG_HDR_SIZE);
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Send command to read nvram data for 0xF2 */
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memset (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf, 0, NFC_HAL_HCI_DH_NETWK_INFO_SIZE);
7345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf, NFC_HAL_HCI_DH_NETWK_INFO_SIZE, HC_F2_NV_BLOCK);
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT);
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case HC_F2_NV_BLOCK:
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_hci_init_complete (HAL_NFC_STATUS_OK);
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
7445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_ERROR1 ("nfc_hal_hci_set_next_hci_netwk_config: unable to allocate buffer to send VSC 0x%02x", block);
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Brcm initialization failed */
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED);
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_hci_vsc_cback
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process VS callback event from stack
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_vsc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data)
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p_ret = NULL;
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 status;
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_ret  = p_data + NCI_MSG_HDR_SIZE;
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = *p_ret;
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
768df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    HAL_TRACE_DEBUG3 ("nfc_hal_hci_vsc_cback (): Event: [0x%02x], Data length: [0x%04x], Status: [0x%02x]", event, data_len, status);
769df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event  != NFC_VS_HCI_NETWK_RSP)
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status != HAL_NFC_STATUS_OK)
774df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    {
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED);
776df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu        return;
777df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    }
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (nfc_hal_cb.hci_cb.hci_netwk_config_block)
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HC_F3_NV_BLOCK:
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HC_F4_NV_BLOCK:
783a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    case HC_F5_NV_BLOCK:
7845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case HC_F2_NV_BLOCK:
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_hci_set_next_hci_netwk_config (nfc_hal_cb.hci_cb.hci_netwk_config_block);
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Ignore the event */
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_nci_cmd_timeout_cback
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      callback function for timeout
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_timeout_cback (void *p_tle)
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    TIMER_LIST_ENT  *p_tlent = (TIMER_LIST_ENT *)p_tle;
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG0 ("nfc_hal_hci_timeout_cback ()");
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_tlent->event == NFC_HAL_HCI_VSC_TIMEOUT_EVT)
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
8115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_ERROR0 ("nfc_hal_hci_timeout_cback: Timeout - NFC HAL HCI BRCM Initialization Failed!");
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED);
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
816a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif
817a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
818