1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/******************************************************************************
2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Copyright (C) 2012 Broadcom Corporation
4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Licensed under the Apache License, Version 2.0 (the "License");
6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  you may not use this file except in compliance with the License.
7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  You may obtain a copy of the License at:
8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  http://www.apache.org/licenses/LICENSE-2.0
10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Unless required by applicable law or agreed to in writing, software
12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  distributed under the License is distributed on an "AS IS" BASIS,
13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  See the License for the specific language governing permissions and
15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  limitations under the License.
16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
18eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <string.h>
19eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "nfc_hal_int.h"
20eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "userial.h"
21eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
22eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*****************************************************************************
23eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu* Definitions
24eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*****************************************************************************/
25eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
26eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Internal flags */
27eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF  0x01    /* Application provided patchram in a single buffer */
28eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_RFU               0x02    /* Reserved for future use */
29eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_SIGNATURE_SENT    0x04    /* Signature sent to NFCC */
30eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED  0x08    /* PreI2C patch required */
31eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_NO_NVM            0x10    /* Not NVM available (patch downloaded to SRAM) */
32eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF 0x20    /* Support RESET_NTF from NFCC after sending signature */
33eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED 0x40    /* FPM patch in NVM failed CRC check */
34eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_NVM_LPM_CORRUPTED 0x80    /* LPM patch in NVM failed CRC check */
35eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
36eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Secure patch download definitions */
37eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN  7       /* PRJID + MAJORVER + MINORVER + COUNT */
38eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_NCD_PATCH_VERSION_LEN  16
39eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
40eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_PRE_DOWNLOAD_DELAY (500)   /* Delay before starting to patch download (in ms) */
41eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
42eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Enumeration of power modes IDs */
43eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_POWER_MODE_LPM     0
44eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_POWER_MODE_FPM     1
45eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
46eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Version string for BCM20791B3 */
47eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuconst UINT8 NFC_HAL_PRM_BCM20791B3_STR[]   = "20791B3";
48eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_BCM20791B3_STR_LEN     (sizeof (NFC_HAL_PRM_BCM20791B3_STR)-1)
49eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
50eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_TOUT                   (6000)  /* timeout for SPD events (in ms)   */
51eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_END_DELAY                  (250)   /* delay before sending any new command (ms)*/
52eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
53eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* command to get currently downloaded patch version */
54eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic UINT8 nfc_hal_prm_get_patch_version_cmd [NCI_MSG_HDR_SIZE] =
55eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
56eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NCI_MTS_CMD|NCI_GID_PROP,
57eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NCI_MSG_GET_PATCH_VERSION,
58eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    0x00
59eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu};
60eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
61eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (NFC_HAL_PRM_DEBUG == TRUE)
62eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_STATE(str)  NCI_TRACE_DEBUG2 ("%s st: %d", str, nfc_hal_cb.prm.state)
63eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#else
64eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_STATE(str)
65eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif
66eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
67eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_post_baud_update (tHAL_NFC_STATUS status);
68eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
69794a3220e013b6c679f2127792859e6b751ee280Evan Chu/*****************************************************************************
70794a3220e013b6c679f2127792859e6b751ee280Evan Chu** Extern variable from nfc_hal_dm_cfg.c
71794a3220e013b6c679f2127792859e6b751ee280Evan Chu*****************************************************************************/
72794a3220e013b6c679f2127792859e6b751ee280Evan Chuextern BOOLEAN nfc_hal_prm_nvm_required;
73794a3220e013b6c679f2127792859e6b751ee280Evan Chu
74eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
75eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
76eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_spd_handle_download_complete
77eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
78eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Patch download complete (for secure patch download)
79eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
80eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
81eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
82eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
83eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_handle_download_complete (UINT8 event)
84eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
85eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_IDLE;
86eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
87eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Notify application now */
88eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.p_cback)
89eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        (nfc_hal_cb.prm.p_cback) (event);
90eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
91eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
92eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
93eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
94eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_spd_send_next_segment
95eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
96eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Send next patch segment (for secure patch download)
97eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
98eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
99eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_send_next_segment (void)
102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   *p_src;
104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16  len, offset = nfc_hal_cb.prm.cur_patch_offset;
105eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   hcit, oid, hdr0, type;
106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   chipverlen;
107eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   chipverstr[NCI_SPD_HEADER_CHIPVER_LEN];
108eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8   patch_hdr_size = NCI_MSG_HDR_SIZE + 1; /* 1 is for HCIT */
109eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
110eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Validate that segment is at least big enought to have NCI_MSG_HDR_SIZE + 1 (hcit) */
111eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.cur_patch_len_remaining < patch_hdr_size)
112eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
113eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR0 ("Unexpected end of patch.");
114eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
115eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        return;
116eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
117eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
118eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Parse NCI command header */
119eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    p_src = (UINT8*) (nfc_hal_cb.prm.p_cur_patch_data + offset);
120eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    STREAM_TO_UINT8 (hcit, p_src);
121eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    STREAM_TO_UINT8 (hdr0, p_src);
122eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    STREAM_TO_UINT8 (oid,  p_src);
123eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    STREAM_TO_UINT8 (len,  p_src);
124eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    STREAM_TO_UINT8 (type, p_src);
125eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
126eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
127eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Update number of bytes comsumed */
128eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.cur_patch_offset += (len + patch_hdr_size);
129eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.cur_patch_len_remaining -=  (len + patch_hdr_size);
130eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
131eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Check if sending signature byte */
132eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (  (oid == NCI_MSG_SECURE_PATCH_DOWNLOAD )
133eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        &&(type == NCI_SPD_TYPE_SIGNATURE)  )
134eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
135eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_SIGNATURE_SENT;
136eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
137eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Check for header */
138eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else if (  (oid == NCI_MSG_SECURE_PATCH_DOWNLOAD )
139eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu             &&(type == NCI_SPD_TYPE_HEADER)  )
140eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
141eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Check if patch is for BCM20791B3 */
142eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_src += NCI_SPD_HEADER_OFFSET_CHIPVERLEN;
143eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (chipverlen, p_src);
144eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_ARRAY (chipverstr, p_src, NCI_SPD_HEADER_CHIPVER_LEN);
145eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
146eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (memcmp (NFC_HAL_PRM_BCM20791B3_STR, chipverstr, NFC_HAL_PRM_BCM20791B3_STR_LEN) == 0)
147eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
148eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Patch is for BCM2079B3 - do not wait for RESET_NTF after patch download */
149eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF;
150eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
151eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
152eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
153eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Patch is for BCM2079B4 or newer - wait for RESET_NTF after patch download */
154eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF;
155eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
156eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
157eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
158eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Send the command (not including HCIT here) */
159eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_dm_send_nci_cmd ((UINT8*) (nfc_hal_cb.prm.p_cur_patch_data + offset + 1), (UINT8) (len + NCI_MSG_HDR_SIZE),
160eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                             nfc_hal_prm_nci_command_complete_cback);
161eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
162eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
163eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
164eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
165eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_spd_handle_next_patch_start
166eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
167eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Handle start of next patch (for secure patch download)
168eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
169eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
170eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
171eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
172eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_handle_next_patch_start (void)
173eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
174eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT32  cur_patch_mask;
175eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT32  cur_patch_len;
176eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    BOOLEAN found_patch_to_download = FALSE;
177eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
178eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    while (!found_patch_to_download)
179eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
180eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get length of current patch */
181eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        cur_patch_len = nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].len;
182eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
183eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Check if this is a patch we need to download */
184eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        cur_patch_mask = ((UINT32) 1 << nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode);
185eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfc_hal_cb.prm.spd_patch_needed_mask & cur_patch_mask)
186eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
187eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            found_patch_to_download = TRUE;
188eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
189eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
190eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
191eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Do not need to download this patch. Skip to next patch */
192eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_DEBUG1 ("Skipping patch for power_mode %i.", nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode);
193eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
194eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.spd_cur_patch_idx++;
195eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            if (nfc_hal_cb.prm.spd_cur_patch_idx >= nfc_hal_cb.prm.spd_patch_count)
196eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
197eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* No more to download */
198eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_COMPLETE_EVT);
199eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                return;
200eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
201eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            else if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF))
202eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
203eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* Notify adaptation layer to call HAL_NfcPrmDownloadContinue with the next patch header */
204eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_NEXT_PATCH);
205eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                return;
206eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
207eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            else
208eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
209eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* Patch in buffer. Skip over current patch. Check next patch */
210eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.cur_patch_len_remaining -= (UINT16) cur_patch_len;
211eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.cur_patch_offset += (UINT16) cur_patch_len;
212eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
213eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
214eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
215eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
216eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
217eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Begin downloading patch */
218eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NCI_TRACE_DEBUG1 ("Downloading patch for power_mode %i.", nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode);
219eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_DOWNLOADING;
220eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_prm_spd_send_next_segment ();
221eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
222eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
223eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE))
224eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
225eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
226eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_spd_download_i2c_fix
227eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
228eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Start downloading patch for i2c fix
229eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
230eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
231eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
232eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
233eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_download_i2c_fix (void)
234eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
235eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8 *p, *p_start;
236eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_project_id;
237eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_ver_major;
238eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_ver_minor;
239eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_patchsize;
240eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8 u8;
241eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
242eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NCI_TRACE_DEBUG0 ("Downloading I2C fix...");
243eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
244eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Save pointer and offset of patchfile, so we can resume after downloading the i2c fix */
245eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.spd_patch_offset = nfc_hal_cb.prm.cur_patch_offset;
246eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.spd_patch_len_remaining = nfc_hal_cb.prm.cur_patch_len_remaining;
247eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
248eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Initialize pointers for downloading i2c fix */
249eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.p_cur_patch_data = nfc_hal_cb.prm_i2c.p_patch;
250eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.cur_patch_offset = 0;
251eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.cur_patch_len_remaining = nfc_hal_cb.prm_i2c.len;
252eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
253eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Parse the i2c patchfile */
254eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.cur_patch_len_remaining >= NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN)
255eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
256eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Parse patchfile header */
257eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p = (UINT8 *) nfc_hal_cb.prm.p_cur_patch_data;
258eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_start = p;
259eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (patchfile_project_id, p);
260eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (patchfile_ver_major, p);
261eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (patchfile_ver_minor, p);
262eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
263eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* RFU */
264eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p++;
265eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
266eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Check how many patches are in the patch file */
267eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);
268eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
269eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Should only be one patch */
270eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (u8 > 1)
271eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
272eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_ERROR1 ("Invalid i2c fix: invalid number of patches (%i)", u8);
273eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
274eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            return;
275eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
276eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
277eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
278eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get info about the i2c patch*/
279eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);                     /* power mode (not needed for i2c patch)    */
280eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (patchfile_patchsize, p);   /* size of patch                            */
281eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
282eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* 5 byte RFU */
283eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p += 5;
284eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
285eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Adjust length to exclude patchfiloe header */
286eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.cur_patch_len_remaining -= (UINT16) (p - p_start);       /* Adjust size of patchfile                        */
287eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.cur_patch_offset += (UINT16) (p - p_start);              /* Bytes of patchfile transmitted/processed so far */
288eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
289eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Begin sending patch to the NFCC */
290eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_send_next_segment ();
291eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
292eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
293eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
294eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* ERROR: Bad length for patchfile */
295eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR0 ("Invalid i2c fix: unexpected end of patch");
296eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
297eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
298eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
299eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
300eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
301eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
302eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
303eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_spd_check_version
304eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
305eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Check patchfile version with current downloaded version
306eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
307eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
308eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
309eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
310eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_check_version (void)
311eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
312eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8 *p, *p_start, i;
313eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT32 patchfile_patch_present_mask;
314eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_project_id;
315eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_ver_major = 0;
316eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_ver_minor;
317eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT16 patchfile_patchsize;
318eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
319eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8  return_code = NFC_HAL_PRM_COMPLETE_EVT;
320eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
321eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Initialize patchfile offset pointers */
322eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    p = p_start = NULL;
323eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    patchfile_patchsize = 0;
324eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
325eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Get patchfile version */
326eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.cur_patch_len_remaining >= NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN)
327eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
328eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Parse patchfile header */
329eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p       = (UINT8 *) nfc_hal_cb.prm.p_cur_patch_data;
330eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_start = p;
331eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (patchfile_project_id, p);
332eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (patchfile_ver_major, p);
333eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (patchfile_ver_minor, p);
334eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
335eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* RFU */
336eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p++;
337eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
338eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Check how many patches are in the patch file */
339eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (nfc_hal_cb.prm.spd_patch_count, p);
340eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
341eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfc_hal_cb.prm.spd_patch_count > NFC_HAL_PRM_MAX_PATCH_COUNT)
342eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
343eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_ERROR2 ("Unsupported patchfile (number of patches (%i) exceeds maximum (%i)",
344eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                               nfc_hal_cb.prm.spd_patch_count, NFC_HAL_PRM_MAX_PATCH_COUNT);
345eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
346eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
347eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Mask of patches that are present in the patchfile */
348eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        patchfile_patch_present_mask = 0;
349eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
350eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get lengths for each patch */
351eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        for (i = 0; i < nfc_hal_cb.prm.spd_patch_count; i++)
352eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
353eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Get power mode for this patch */
354eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            STREAM_TO_UINT8 (nfc_hal_cb.prm.spd_patch_desc[i].power_mode, p);
355eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
356eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Update mask of power-modes present in the patchfile */
357eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            patchfile_patch_present_mask |= ((UINT32) 1 << nfc_hal_cb.prm.spd_patch_desc[i].power_mode);
358eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
359eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Get length of patch */
360eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_patch_desc[i].len, p);
361eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
362eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Add total size of patches */
363eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            patchfile_patchsize += nfc_hal_cb.prm.spd_patch_desc[i].len;
364eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
365eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* 5 byte RFU */
366eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            p += 5;
367eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
368eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
369eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Adjust offset to after the patch file header */
370eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.cur_patch_offset += (UINT16) (p - p_start);              /* Bytes of patchfile transmitted/processed so far */
371eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.cur_patch_len_remaining -= (UINT16) (p - p_start);       /* Adjust size of patchfile                        */
372eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
373eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
374eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_DEBUG6 ("Patchfile info: ProjID=0x%04x,  Ver=%i.%i, Num patches=%i, PatchMask=0x%08x, PatchSize=%i",
375eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                           patchfile_project_id, patchfile_ver_major, patchfile_ver_minor,
376eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                           nfc_hal_cb.prm.spd_patch_count, patchfile_patch_present_mask, patchfile_patchsize);
377eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
378eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /*********************************************************************
379eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        * Version check of patchfile against NVM
380eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        *********************************************************************/
381eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
382eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (!defined (NFC_HAL_PRM_SKIP_VERSION_CHECK) || (NFC_HAL_PRM_SKIP_VERSION_CHECK == FALSE))
383eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Download the patchfile if no patches in NVM */
384eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if ((nfc_hal_cb.prm.spd_project_id == 0) || (nfc_hal_cb.prm.spd_nvm_patch_mask == 0))
385eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
386eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* No patch in NVM, need to download all */
387eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask;
388eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
389eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_DEBUG2 ("No previous patch detected. Downloading patch %i.%i",
390eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                              patchfile_ver_major, patchfile_ver_minor);
391eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
392eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Skip download if project ID of patchfile does not match NVM */
393eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else if (nfc_hal_cb.prm.spd_project_id != patchfile_project_id)
394eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
395eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Project IDs mismatch */
396eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_DEBUG2 ("Patch download skipped: Mismatched Project ID (NVM ProjId: 0x%04x, Patchfile ProjId: 0x%04x)",
397eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                              nfc_hal_cb.prm.spd_project_id, patchfile_project_id);
398eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
399eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            return_code = NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT;
400eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
401eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Skip download if version of patchfile older or equal to version in NVM */
402eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* unless NVM is corrupted (then don't skip download if patchfile has the same major ver)*/
403eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else if (  (nfc_hal_cb.prm.spd_ver_major > patchfile_ver_major)
404eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                 ||(  (nfc_hal_cb.prm.spd_ver_major == patchfile_ver_major) && (nfc_hal_cb.prm.spd_ver_minor == patchfile_ver_minor)
405eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                    && !((patchfile_patch_present_mask & ( 1 << NFC_HAL_PRM_SPD_POWER_MODE_LPM)) && (nfc_hal_cb.prm.spd_lpm_patch_size == 0))  /* Do not skip download: patchfile has LPM, but NVM does not */
406eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                    && !((patchfile_patch_present_mask & ( 1 << NFC_HAL_PRM_SPD_POWER_MODE_FPM)) && (nfc_hal_cb.prm.spd_fpm_patch_size == 0))  /* Do not skip download: patchfile has FPM, but NVM does not */
407eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                    && !(nfc_hal_cb.prm.flags & (NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED |NFC_HAL_PRM_FLAGS_NVM_LPM_CORRUPTED))  )  )
408eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
409eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* NVM version is newer than patchfile */
410eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_DEBUG2 ("Patch download skipped. NVM patch (version %i.%i) is newer than the patchfile ",
411eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                              nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor);
412eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
413eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            return_code = NFC_HAL_PRM_COMPLETE_EVT;
414eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
415eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Remaining cases: patchfile major version is newer than NVM; or major version is the same with different minor version */
416eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Download all patches in the patchfile */
417eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
418eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
419eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask;
420eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
421eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_DEBUG4 ("Downloading patch version: %i.%i (previous version in NVM: %i.%i)...",
422eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                              patchfile_ver_major, patchfile_ver_minor,
423eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                              nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor);
424eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
425eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#else   /* NFC_HAL_PRM_SKIP_VERSION_CHECK */
426eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask;
427eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif
428eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
429eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
430eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
431eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Invalid patch file header */
432eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR0 ("Invalid patch file header.");
433eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
434eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        return_code = NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT;
435eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
436eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
437eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* If we need to download anything, get the first patch to download */
438eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.spd_patch_needed_mask)
439eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
44038666aab1397040df51ab6d28520b3930df1df3fEvan Chu        NCI_TRACE_ERROR4 ("Downloading patch version: %i.%i (previous version in NVM: %i.%i)...",
441794a3220e013b6c679f2127792859e6b751ee280Evan Chu                            patchfile_ver_major, patchfile_ver_minor,
442794a3220e013b6c679f2127792859e6b751ee280Evan Chu                            nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor);
443eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE))
444eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Check if I2C patch is needed: if                                     */
445eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /*      - I2C patch file was provided using HAL_NfcPrmSetI2cPatch, and        */
446eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /*      -   current patch in NVM has ProjectID=0, or                    */
447eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /*          FPM is not present or corrupted, or                         */
448eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /*          or patchfile is major-ver 76+                               */
449eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (  (nfc_hal_cb.prm_i2c.p_patch)
450eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            &&(  (nfc_hal_cb.prm.spd_project_id == 0)
451eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu               ||(nfc_hal_cb.prm.spd_fpm_patch_size == 0)
452eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu               ||(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED)
453eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu               ||(patchfile_ver_major >= 76)))
454eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
455eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_DEBUG0 ("I2C patch fix required.");
456eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED;
457eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
458eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Download i2c fix first */
459eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_download_i2c_fix ();
460eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            return;
461eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
462eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif  /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
463eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
464eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Download first segment */
465eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER;
466eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF))
467eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
468eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Notify adaptation layer to call HAL_NfcPrmDownloadContinue with the next patch segment */
469eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_NEXT_PATCH);
470eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
471eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
472eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
473eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_handle_next_patch_start ();
474eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
475eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
476eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
477eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
478794a3220e013b6c679f2127792859e6b751ee280Evan Chu        static BOOLEAN firstTime = TRUE;
479794a3220e013b6c679f2127792859e6b751ee280Evan Chu        if (firstTime) {
480794a3220e013b6c679f2127792859e6b751ee280Evan Chu            NCI_TRACE_ERROR2 ("BCM2079x: NVM patch version is %d.%d",
481794a3220e013b6c679f2127792859e6b751ee280Evan Chu                    nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor);
482794a3220e013b6c679f2127792859e6b751ee280Evan Chu            firstTime = FALSE;
483794a3220e013b6c679f2127792859e6b751ee280Evan Chu        }
484eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Download complete */
485eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_download_complete (return_code);
486eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
487eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
488eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
489eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (NFC_HAL_TRACE_VERBOSE == TRUE)
490eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
491eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
492eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_spd_status_str
493eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
494eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Return status string for a given spd status code
495eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
496eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          Status string
497eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
498eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
499eb190654c5fbaea2f396bb5523f57062f291879aEvan ChuUINT8 *nfc_hal_prm_spd_status_str (UINT8 spd_status_code)
500eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
501eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    char *p_str;
502eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
503eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    switch (spd_status_code)
504eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
505eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_DEST:
506eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_DEST";
507eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
508eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
509eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_PROJECTID:
510eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_PROJECTID";
511eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
512eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
513eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_CHIPVER:
514eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_CHIPVER";
515eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
516eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
517eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_MAJORVER:
518eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_MAJORVER";
519eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
520eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
521eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_INVALID_PARAM:
522eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_INVALID_PARAM";
523eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
524eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
525eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_INVALID_SIG:
526eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_INVALID_SIG";
527eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
528eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
529eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_NVM_CORRUPTED:
530eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_NVM_CORRUPTED";
531eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
532eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
533eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_PWR_MODE:
534eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_PWR_MODE";
535eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
536eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
537eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_MSG_LEN:
538eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_MSG_LEN";
539eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
540eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
541eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    case NCI_STATUS_SPD_ERROR_PATCHSIZE:
542eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "SPD_ERROR_PATCHSIZE";
543eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
544eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
545eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    default:
546eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p_str = "Unspecified Error";
547eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        break;
548eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
549eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
550eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
551eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return ((UINT8*) p_str);
552eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
553eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif  /* (NFC_HAL_TRACE_VERBOSE == TRUE) */
554eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
555eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
556eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
557eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_nci_command_complete_cback
558eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
559eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Callback for NCI vendor specific command complete
560eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  (for secure patch download)
561eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
562eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
563eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
564eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
565eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_nci_command_complete_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data)
566eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
567eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8 status, u8;
568eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT8 *p;
569eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    UINT32 post_signature_delay;
570eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
571eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NFC_HAL_PRM_STATE ("nfc_hal_prm_nci_command_complete_cback");
572eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
573eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Stop the command-timeout timer */
574eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer);
575eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
576eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Skip over NCI header */
577eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    p = p_data + NCI_MSG_HDR_SIZE;
578eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
579eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Handle GET_PATCH_VERSION Rsp */
580eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (event == NFC_VS_GET_PATCH_VERSION_EVT)
581eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
582eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get project id */
583eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_project_id, p);
584eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
585eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* RFU */
586eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p++;
587eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
588eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get chip version string */
589eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);
590eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        p += NFC_HAL_PRM_NCD_PATCH_VERSION_LEN;
591eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
592eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get major/minor version */
593eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_ver_major, p);
594eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_ver_minor, p);
595eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_nvm_max_size, p);
596eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_patch_max_size, p);
597eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_lpm_patch_size, p);
598eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_fpm_patch_size, p);
599eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
600eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* LPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */
601eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);
602eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (!u8)
603eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
604eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.spd_nvm_patch_mask |= (1 << NFC_HAL_PRM_SPD_POWER_MODE_LPM);
605eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
606eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
607eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
608eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* LPM patch in NVM fails CRC check */
609eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_NVM_LPM_CORRUPTED;
610eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
611eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
612eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
613eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* FPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */
614eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);
615eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (!u8)
616eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
617eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.spd_nvm_patch_mask |= (1 << NFC_HAL_PRM_SPD_POWER_MODE_FPM);
618eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
619eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
620eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
621eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* FPM patch in NVM fails CRC check */
622eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED;
623eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
624eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
625eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Check if downloading patch to RAM only (no NVM) */
626eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);
627eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (!u8)
628794a3220e013b6c679f2127792859e6b751ee280Evan Chu        {
629794a3220e013b6c679f2127792859e6b751ee280Evan Chu            if (nfc_hal_prm_nvm_required)
630794a3220e013b6c679f2127792859e6b751ee280Evan Chu            {
631794a3220e013b6c679f2127792859e6b751ee280Evan Chu                NCI_TRACE_ERROR0 ("This platform requires NVM and the NVM is not available - Abort");
632794a3220e013b6c679f2127792859e6b751ee280Evan Chu                nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_NO_NVM_EVT);
633794a3220e013b6c679f2127792859e6b751ee280Evan Chu                return;
634794a3220e013b6c679f2127792859e6b751ee280Evan Chu            }
635eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_NO_NVM;
636794a3220e013b6c679f2127792859e6b751ee280Evan Chu        }
637eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get patchfile version number */
638eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_COMPARE_VERSION;
639eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
640eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF)
641eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
642eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* If patch is in a buffer, get patch version from buffer */
643eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_check_version ();
644eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
645eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
646eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
647eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Notify adaptation layer to send patch version (via HAL_NfcPrmDownloadContinue) */
648eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_PATCHFILE_HDR_EVT);
649eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
650eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
651eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
652eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Handle SECURE_PATCH_DOWNLOAD Rsp */
653eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else if (event == NFC_VS_SEC_PATCH_DOWNLOAD_EVT)
654eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
655eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Status and error code */
656eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (status, p);
657eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);
658eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
659eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (status != NCI_STATUS_OK)
660eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
661eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (NFC_HAL_TRACE_VERBOSE == TRUE)
662eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_ERROR2 ("Patch download failed, reason code=0x%X (%s)", status, nfc_hal_prm_spd_status_str (status));
663eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#else
664eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_ERROR1 ("Patch download failed, reason code=0x%X", status);
665eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif
666eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
667eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Notify application */
668eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
669eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            return;
670eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
671eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
672eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* If last segment (SIGNATURE) sent */
673eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SIGNATURE_SENT)
674eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
675eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Wait for authentication complate (SECURE_PATCH_DOWNLOAD NTF) */
676eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_AUTHENTICATING;
677eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00,
678eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                            (NFC_HAL_PRM_SPD_TOUT * QUICK_TIMER_TICKS_PER_SEC) / 1000);
679eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            return;
680eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
681eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Download next segment */
682eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF)
683eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
684eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* If patch is in a buffer, get next patch from buffer */
685eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_send_next_segment ();
686eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
687eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
688eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
689eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Notify adaptation layer to get next patch segment (via HAL_NfcPrmDownloadContinue) */
690eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_CONTINUE_EVT);
691eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
692eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
693eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Handle SECURE_PATCH_DOWNLOAD NTF */
694eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else if (event == NFC_VS_SEC_PATCH_AUTH_EVT)
695eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
696eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_DEBUG1 ("prm flags:0x%x.", nfc_hal_cb.prm.flags);
697eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Status and error code */
698eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (status, p);
699eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        STREAM_TO_UINT8 (u8, p);
700eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
701eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Sanity check - should only get this NTF while in AUTHENTICATING stage */
702eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTHENTICATING)
703eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
704eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            if (status != NCI_STATUS_OK)
705eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
706eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                NCI_TRACE_ERROR0 ("Patch authentication failed");
707eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT);
708eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                return;
709eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
710eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
711eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE))
712eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED)
713eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
714eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                NCI_TRACE_DEBUG1 ("PreI2C patch downloaded...waiting %i ms for NFCC to reboot.", nfc_hal_cb.prm_i2c.prei2c_delay);
715eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
716eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* Restore pointers to patchfile */
717eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED;
718eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.p_cur_patch_data = nfc_hal_cb.prm.p_spd_patch;
719eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.cur_patch_offset = nfc_hal_cb.prm.spd_patch_offset;
720eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.cur_patch_len_remaining = nfc_hal_cb.prm.spd_patch_len_remaining;
721eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
722eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* Resume normal patch download */
723eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER;
724eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SIGNATURE_SENT;
725eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
726eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* Post PreI2C delay */
727eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00, (nfc_hal_cb.prm_i2c.prei2c_delay * QUICK_TIMER_TICKS_PER_SEC) / 1000);
728eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
729eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                return;
730eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
731eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif  /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
732eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
733eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
734eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Wait for NFCC to save the patch to NVM */
735eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF)
736eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
737eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* 20791B4 or newer - wait for RESET_NTF */
738eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                post_signature_delay = NFC_HAL_PRM_RESET_NTF_DELAY;
739eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                NCI_TRACE_DEBUG1 ("Patch downloaded and authenticated. Waiting %i ms for RESET NTF...", post_signature_delay);
740eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
741eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
742eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            else if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_NO_NVM)
743eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
744eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* No NVM. Wait for NFCC to restart */
745eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                post_signature_delay = NFC_HAL_PRM_END_DELAY;
746eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                NCI_TRACE_DEBUG1 ("Patch downloaded and authenticated. Waiting %i ms for NFCC to restart...", post_signature_delay);
747eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
748eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            else
749eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            {
750eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                /* Wait for NFCC to save the patch to NVM (need about 1 ms per byte) */
751eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                post_signature_delay = nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].len;
752eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                if (post_signature_delay < nfc_hal_cb.prm.patchram_delay)
753eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                    post_signature_delay = nfc_hal_cb.prm.patchram_delay;
754eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                NCI_TRACE_DEBUG1 ("Patch downloaded and authenticated. Waiting %i ms for NVM update to complete...", post_signature_delay);
755eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            }
756eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
757eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_AUTH_DONE;
758eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
759eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00,
760eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                            (post_signature_delay * QUICK_TIMER_TICKS_PER_SEC) / 1000);
761eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
762eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
763eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
764eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_ERROR0 ("Got unexpected SECURE_PATCH_DOWNLOAD NTF");
765eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_EVT);
766eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
767eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
768eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
769eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
770eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Invalid response from NFCC during patch download */
771eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR1 ("Invalid response from NFCC during patch download (opcode=0x%02X)", event);
772eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT);
773eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
774eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
775eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NFC_HAL_PRM_STATE ("prm_nci_command_complete_cback");
776eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
777eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
778eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
779eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
780eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_nfcc_ready_to_continue
781eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
782eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Continue to download patch or notify application completition
783eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
784eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
785eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
786eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
787eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_nfcc_ready_to_continue (void)
788eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
789eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Clear the bit for the patch we just downloaded */
790eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.spd_patch_needed_mask &= ~ ((UINT32) 1 << nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode);
791eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
792eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Check if another patch to download */
793eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.spd_cur_patch_idx++;
794eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if ((nfc_hal_cb.prm.spd_patch_needed_mask) && (nfc_hal_cb.prm.spd_cur_patch_idx < nfc_hal_cb.prm.spd_patch_count))
795eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
796eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER;
797eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SIGNATURE_SENT;
798eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
799eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF)
800eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
801eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* If patch is in a buffer, get next patch from buffer */
802eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_handle_next_patch_start ();
803eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
804eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
805eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
806eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Notify adaptation layer to get next patch header (via HAL_NfcPrmDownloadContinue) */
807eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_NEXT_PATCH);
808eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
809eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
810eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
811eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
812eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
813eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Done downloading */
814eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_DEBUG0 ("Patch downloaded and authenticated.");
815eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_COMPLETE_EVT);
816eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
817eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
818eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
819eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
820eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
821eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_spd_reset_ntf
822eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
823eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Received RESET NTF from NFCC, indicating it has completed
824eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  reset after patch download.
825eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
826eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
827eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
828eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
829eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_reset_ntf (UINT8 reset_reason, UINT8 reset_type)
830eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
831eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Check if we were expecting a RESET NTF */
832eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE)
833eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
834eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_DEBUG2 ("Received RESET NTF after patch download (reset_reason=%i, reset_type=%i)", reset_reason, reset_type);
835eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
836eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Stop waiting for RESET NTF */
837eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer);
838eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
839eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
840eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Continue with patch download */
841eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_nfcc_ready_to_continue ();
842eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
843eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
844eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
845eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
846eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR2 ("Received unexpected RESET NTF (reset_reason=%i, reset_type=%i)", reset_reason, reset_type);
847eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
848eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
849eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
850eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
851eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
852eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    nfc_post_final_baud_update
853eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
854eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Called after baud rate udate
855eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
856eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     Nothing
857eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
858eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
859eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_post_baud_update (tHAL_NFC_STATUS status)
860eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
861eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NFC_HAL_PRM_STATE ("nfc_hal_prm_post_baud_update");
862eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
863eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE)
864eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
865eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Proceed with next step of patch download sequence */
866eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_nfcc_ready_to_continue ();
867eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
868eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
869eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
870eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
871eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
872eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         nfc_hal_prm_process_timeout
873eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
874eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Process timer expireation for patch download
875eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
876eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          void
877eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
878eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
879ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chuvoid nfc_hal_prm_process_timeout (void *p_tle)
880eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
881eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NFC_HAL_PRM_STATE ("nfc_hal_prm_process_timeout");
882eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
883eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_IDLE)
884eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
885eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_VERSION;
886eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
887eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Get currently downloaded patch version */
888eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_dm_send_nci_cmd (nfc_hal_prm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, nfc_hal_prm_nci_command_complete_cback);
889eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
890eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE)
891eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
892eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF)
893eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
894eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            /* Timeout waiting for RESET NTF after signature sent */
895eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            NCI_TRACE_ERROR0 ("Timeout waiting for RESET NTF after patch download");
896eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_EVT);
897eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
898eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        else
899eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        {
900eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            nfc_hal_prm_nfcc_ready_to_continue ();
901eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        }
902eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
903eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER)
904eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
905eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_DEBUG0 ("Delay after PreI2C patch download...proceeding to download firmware patch");
906eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_next_patch_start ();
907eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
908eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
909eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
910eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR1 ("Patch download: command timeout (state=%i)", nfc_hal_cb.prm.state);
911eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
912eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_EVT);
913eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
914eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
915eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NFC_HAL_PRM_STATE ("nfc_hal_prm_process_timeout");
916eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
917eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
918eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
919eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
920eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
921eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         HAL_NfcPrmDownloadStart
922eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
923eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Initiate patch download
924eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
925eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Input Params
926eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  format_type     patch format type
927eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                  (NFC_HAL_PRM_FORMAT_BIN, NFC_HAL_PRM_FORMAT_HCD, or
928eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                   NFC_HAL_PRM_FORMAT_NCD)
929eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
930eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  dest_address    destination adderess (needed for BIN format only)
931eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
932eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  p_patchram_buf  pointer to patchram buffer. If NULL,
933eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                  then app must call HAL_NfcPrmDownloadContinue when
934eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                  NFC_HAL_PRM_CONTINUE_EVT is received, to send the next
935eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                  segment of patchram
936eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
937eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  patchram_len    size of p_patchram_buf (if non-NULL)
938eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
939eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  patchram_delay  The delay after each patch.
940eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                  If the given value is less than the size of the patchram,
941eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                  the size of patchram is used instead.
942eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
943eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  p_cback         callback for download status
944eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
945eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
946eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          TRUE if successful, otherwise FALSE
947eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
948eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
949eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
950eb190654c5fbaea2f396bb5523f57062f291879aEvan ChuBOOLEAN HAL_NfcPrmDownloadStart (tNFC_HAL_PRM_FORMAT format_type,
951eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                 UINT32              dest_address,
952eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                 UINT8               *p_patchram_buf,
953eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                 UINT32              patchram_len,
954eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                 UINT32              patchram_delay,
955eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                 tNFC_HAL_PRM_CBACK  *p_cback)
956eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
957eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NCI_TRACE_API0 ("HAL_NfcPrmDownloadStart ()");
958eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
959eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    memset (&nfc_hal_cb.prm, 0, sizeof (tNFC_HAL_PRM_CB));
960eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
961eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (p_patchram_buf)
962eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
963eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.p_cur_patch_data = p_patchram_buf;
964eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.cur_patch_offset = 0;
965eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.cur_patch_len_remaining = (UINT16) patchram_len;
966eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF;
967eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
968eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (patchram_len == 0)
969eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            return FALSE;
970eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
971eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
972eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.p_cback          = p_cback;
973eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.dest_ram         = dest_address;
974eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.format           = format_type;
975eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.patchram_delay   = patchram_delay;
976eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
977eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.timer.p_cback = nfc_hal_prm_process_timeout;
978eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
979eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (format_type == NFC_HAL_PRM_FORMAT_NCD)
980eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
981eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Store patch buffer pointer and length */
982eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.p_spd_patch             = p_patchram_buf;
983eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.spd_patch_len_remaining = (UINT16)patchram_len;
984eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm.spd_patch_offset        = 0;
985eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
986eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        /* Need delay for controller to finish resetting */
987eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00,
988eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                        (NFC_HAL_PRM_SPD_PRE_DOWNLOAD_DELAY * QUICK_TIMER_TICKS_PER_SEC) / 1000);
989eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
990eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
991eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
992eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR0 ("Unexpected patch format.");
993eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        return FALSE;
994eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
995eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
996eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return TRUE;
997eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
998eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
999eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
1000eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1001eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         HAL_NfcPrmDownloadContinue
1002eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1003eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Send next segment of patchram to controller. Called when
1004eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  NFC_HAL_PRM_CONTINUE_EVT is received.
1005eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1006eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  Only needed if HAL_NfcPrmDownloadStart was called with
1007eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  p_patchram_buf=NULL
1008eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1009eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Input Params     p_patch_data    pointer to patch data
1010eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  patch_data_len  patch data len
1011eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1012eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          TRUE if successful, otherwise FALSE
1013eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1014eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
1015eb190654c5fbaea2f396bb5523f57062f291879aEvan ChuBOOLEAN HAL_NfcPrmDownloadContinue (UINT8 *p_patch_data,
1016eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                                    UINT16 patch_data_len)
1017eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
1018eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NCI_TRACE_API2 ("HAL_NfcPrmDownloadContinue ():state = %d, patch_data_len=%d",
1019eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu                     nfc_hal_cb.prm.state, patch_data_len);
1020eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1021eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Check if we are in a valid state for this API */
1022eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (  (nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_COMPARE_VERSION)
1023eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        &&(nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER)
1024eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        &&(nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_DOWNLOADING)  )
1025eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        return FALSE;
1026eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1027eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (patch_data_len == 0)
1028eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        return FALSE;
1029eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1030eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.cur_patch_offset = 0;
1031eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.p_cur_patch_data = p_patch_data;
1032eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm.cur_patch_len_remaining = patch_data_len;
1033eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1034eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Call appropriate handler */
1035eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_COMPARE_VERSION)
1036eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
1037eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_check_version ();
1038eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
1039eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER)
1040eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
1041eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_handle_next_patch_start ();
1042eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
1043eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_DOWNLOADING)
1044eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
1045eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_prm_spd_send_next_segment ();
1046eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
1047eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
1048eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
1049eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR1 ("Unexpected patch state:%d.", nfc_hal_cb.prm.state);
1050eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
1051eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1052eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return TRUE;
1053eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
1054eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1055eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
1056eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1057eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         HAL_NfcPrmSetI2cPatch
1058eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1059eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Specify patchfile for BCM20791B3 I2C fix. This fix
1060eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  must be downloaded prior to initial patch download for I2C
1061eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  transport
1062eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1063eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Input Params     p_i2c_patchfile_buf: pointer to patch for i2c fix
1064eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  i2c_patchfile_len: length of patch
1065eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  prei2c_delay: the delay before downloading main patch
1066eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                                if 0 is given, NFC_HAL_PRM_POST_I2C_FIX_DELAY is used instead.
1067eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1068eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          Nothing
1069eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1070eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1071eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
1072eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid HAL_NfcPrmSetI2cPatch (UINT8 *p_i2c_patchfile_buf, UINT16 i2c_patchfile_len, UINT32 prei2c_delay)
1073eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
1074eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE))
1075eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NCI_TRACE_API0 ("HAL_NfcPrmSetI2cPatch ()");
1076eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1077eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm_i2c.prei2c_delay    = NFC_HAL_PRM_POST_I2C_FIX_DELAY;
1078eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (prei2c_delay)
1079eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.prm_i2c.prei2c_delay = prei2c_delay;
1080eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm_i2c.p_patch = p_i2c_patchfile_buf;
1081eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_hal_cb.prm_i2c.len = i2c_patchfile_len;
1082eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif  /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */
1083eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
1084eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
1085eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
1086eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1087eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function         HAL_NfcPrmSetSpdNciCmdPayloadSize
1088eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1089eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description      Set Host-to-NFCC NCI message size for secure patch download
1090eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1091eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  This API must be called before calling HAL_NfcPrmDownloadStart.
1092eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  If the API is not called, then PRM will use the default
1093eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  message size.
1094eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1095eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  Typically, this API is only called for platforms that have
1096eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  message-size limitations in the transport/driver.
1097eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1098eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  Valid message size range: NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE to 255.
1099eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns          HAL_NFC_STATUS_OK if successful
1101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  HAL_NFC_STATUS_FAILED otherwise
1102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
1104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
1105eb190654c5fbaea2f396bb5523f57062f291879aEvan ChutHAL_NFC_STATUS HAL_NfcPrmSetSpdNciCmdPayloadSize (UINT8 max_payload_size)
1106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
1107eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    /* Validate: minimum size is NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE */
1108eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (max_payload_size < NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE)
1109eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
1110eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_ERROR2 ("HAL_NfcPrmSetSpdNciCmdPayloadSize: invalid size (%i). Must be between %i and 255", max_payload_size, NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE);
1111eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        return (HAL_NFC_STATUS_FAILED);
1112eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
1113eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
1114eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
1115eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        NCI_TRACE_API1 ("HAL_NfcPrmSetSpdNciCmdPayloadSize: new message size during download: %i", max_payload_size);
1116eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        nfc_hal_cb.ncit_cb.nci_ctrl_size = max_payload_size;
1117eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        return (HAL_NFC_STATUS_OK);
1118eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
1119eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
1120