nfc_hal_dm.c revision ee00835dfad4b11b2df72ae7caeea1c6ceba2e6c
1/******************************************************************************
2 *
3 *  Copyright (C) 2012 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 *  Vendor-specific handler for DM events
22 *
23 ******************************************************************************/
24#include "nfc_hal_int.h"
25#include "nfc_hal_post_reset.h"
26#include "userial.h"
27#include "upio.h"
28
29/*****************************************************************************
30** Constants and types
31*****************************************************************************/
32
33#define NFC_HAL_I93_RW_CFG_LEN              (5)
34#define NFC_HAL_I93_RW_CFG_PARAM_LEN        (3)
35#define NFC_HAL_I93_AFI                     (0)
36#define NFC_HAL_I93_ENABLE_SMART_POLL       (1)
37
38static UINT8 nfc_hal_dm_i93_rw_cfg[NFC_HAL_I93_RW_CFG_LEN] =
39{
40    NCI_PARAM_ID_I93_DATARATE,
41    NFC_HAL_I93_RW_CFG_PARAM_LEN,
42    NFC_HAL_I93_FLAG_DATA_RATE,    /* Bit0:Sub carrier, Bit1:Data rate, Bit4:Enable/Disable AFI */
43    NFC_HAL_I93_AFI,               /* AFI if Bit 4 is set in the flag byte */
44    NFC_HAL_I93_ENABLE_SMART_POLL  /* Bit0:Enable/Disable smart poll */
45};
46
47static UINT8 nfc_hal_dm_set_fw_fsm_cmd[NCI_MSG_HDR_SIZE + 1] =
48{
49    NCI_MTS_CMD|NCI_GID_PROP,
50    NCI_MSG_SET_FWFSM,
51    0x01,
52    0x00,
53};
54#define NCI_SET_FWFSM_OFFSET_ENABLE      3
55
56const UINT8 nfc_hal_dm_core_reset_cmd[NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET] =
57{
58    NCI_MTS_CMD|NCI_GID_CORE,
59    NCI_MSG_CORE_RESET,
60    NCI_CORE_PARAM_SIZE_RESET,
61    NCI_RESET_TYPE_RESET_CFG
62};
63
64#define NCI_PROP_PARAM_SIZE_XTAL_INDEX      3       /* length of parameters in XTAL_INDEX CMD */
65
66const UINT8 nfc_hal_dm_get_build_info_cmd[NCI_MSG_HDR_SIZE] =
67{
68    NCI_MTS_CMD|NCI_GID_PROP,
69    NCI_MSG_GET_BUILD_INFO,
70    0x00
71};
72#define NCI_BUILD_INFO_OFFSET_HWID  25  /* HW ID offset in build info RSP */
73
74const UINT8 nfc_hal_dm_get_patch_version_cmd [NCI_MSG_HDR_SIZE] =
75{
76    NCI_MTS_CMD|NCI_GID_PROP,
77    NCI_MSG_GET_PATCH_VERSION,
78    0x00
79};
80#define NCI_PATCH_INFO_OFFSET_NVMTYPE  35  /* NVM Type offset in patch info RSP */
81
82/*****************************************************************************
83** Extern function prototypes
84*****************************************************************************/
85extern UINT8 *p_nfc_hal_dm_lptd_cfg;
86extern UINT8 *p_nfc_hal_dm_pll_325_cfg;
87extern UINT8 *p_nfc_hal_dm_start_up_cfg;
88extern UINT8 *p_nfc_hal_dm_start_up_vsc_cfg;
89
90/*****************************************************************************
91** Local function prototypes
92*****************************************************************************/
93
94/*******************************************************************************
95**
96** Function         nfc_hal_dm_set_config
97**
98** Description      Send NCI config items to NFCC
99**
100** Returns          tHAL_NFC_STATUS
101**
102*******************************************************************************/
103tHAL_NFC_STATUS nfc_hal_dm_set_config (UINT8 tlv_size,
104                                       UINT8 *p_param_tlvs,
105                                       tNFC_HAL_NCI_CBACK *p_cback)
106{
107    UINT8  *p_buff, *p;
108    UINT8  num_param = 0, param_len, rem_len, *p_tlv;
109    UINT16 cmd_len = NCI_MSG_HDR_SIZE + tlv_size + 1;
110    tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED;
111
112    if ((tlv_size == 0)||(p_param_tlvs == NULL))
113    {
114        return status;
115    }
116
117    if ((p_buff = (UINT8 *) GKI_getbuf ((UINT16)(NCI_MSG_HDR_SIZE + tlv_size))) != NULL)
118    {
119        p = p_buff;
120
121        NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_CORE);
122        NCI_MSG_BLD_HDR1 (p, NCI_MSG_CORE_SET_CONFIG);
123        UINT8_TO_STREAM  (p, (UINT8) (tlv_size + 1));
124
125        rem_len = tlv_size;
126        p_tlv   = p_param_tlvs;
127        while (rem_len > 1)
128        {
129            num_param++;                /* number of params */
130
131            p_tlv ++;                   /* param type   */
132            param_len = *p_tlv++;       /* param length */
133
134            rem_len -= 2;               /* param type and length */
135            if (rem_len >= param_len)
136            {
137                rem_len -= param_len;
138                p_tlv   += param_len;   /* next param_type */
139
140                if (rem_len == 0)
141                {
142                    status = HAL_NFC_STATUS_OK;
143                    break;
144                }
145            }
146            else
147            {
148                /* error found */
149                break;
150            }
151        }
152
153        if (status == HAL_NFC_STATUS_OK)
154        {
155            UINT8_TO_STREAM (p, num_param);
156            ARRAY_TO_STREAM (p, p_param_tlvs, tlv_size);
157
158            nfc_hal_dm_send_nci_cmd (p_buff, cmd_len, p_cback);
159        }
160        else
161        {
162            NCI_TRACE_ERROR0 ("nfc_hal_dm_set_config ():Bad TLV");
163        }
164
165        GKI_freebuf (p_buff);
166    }
167
168    return status;
169}
170
171/*******************************************************************************
172**
173** Function         nfc_hal_dm_get_xtal_index
174**
175** Description      Convert xtal frequency to index
176**
177** Returns          xtal index
178**
179*******************************************************************************/
180static tNFC_HAL_XTAL_INDEX nfc_hal_dm_get_xtal_index (UINT16 xtal_freq)
181{
182    tNFC_HAL_XTAL_INDEX xtal_index;
183
184    switch (xtal_freq)
185    {
186    case  9600: xtal_index = NFC_HAL_XTAL_INDEX_9600;  break;
187    case 13000: xtal_index = NFC_HAL_XTAL_INDEX_13000; break;
188    case 16200: xtal_index = NFC_HAL_XTAL_INDEX_16200; break;
189    case 19200: xtal_index = NFC_HAL_XTAL_INDEX_19200; break;
190    case 24000: xtal_index = NFC_HAL_XTAL_INDEX_24000; break;
191    case 26000: xtal_index = NFC_HAL_XTAL_INDEX_26000; break;
192    case 38400: xtal_index = NFC_HAL_XTAL_INDEX_38400; break;
193    case 52000: xtal_index = NFC_HAL_XTAL_INDEX_52000; break;
194    case 37400: xtal_index = NFC_HAL_XTAL_INDEX_37400; break;
195    default :   xtal_index = NFC_HAL_XTAL_INDEX_MAX;
196                NCI_TRACE_DEBUG1 ("nfc_hal_dm_get_xtal_index ():No matched index for %d", xtal_freq);
197                break;
198    }
199
200    return xtal_index;
201}
202
203/*******************************************************************************
204**
205** Function         nfc_hal_dm_set_fw_fsm
206**
207** Description      Enable or disable FW FSM
208**
209** Returns          void
210**
211*******************************************************************************/
212void nfc_hal_dm_set_fw_fsm (BOOLEAN enable, tNFC_HAL_NCI_CBACK *p_cback)
213{
214    if (enable)
215        nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x01; /* Enable, default is disabled */
216    else
217        nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x00; /* Disable */
218
219    nfc_hal_dm_send_nci_cmd (nfc_hal_dm_set_fw_fsm_cmd, NCI_MSG_HDR_SIZE + 1, p_cback);
220}
221
222/*******************************************************************************
223**
224** Function         nfc_hal_dm_config_nfcc_cback
225**
226** Description      Callback for NCI vendor specific command complete
227**
228** Returns          void
229**
230*******************************************************************************/
231void nfc_hal_dm_config_nfcc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data)
232{
233    if (nfc_hal_cb.dev_cb.next_dm_config == NFC_HAL_DM_CONFIG_NONE)
234    {
235        nfc_hal_hci_enable ();
236    }
237    else
238    {
239        nfc_hal_dm_config_nfcc ();
240    }
241}
242
243/*******************************************************************************
244**
245** Function         nfc_hal_dm_send_startup_vsc
246**
247** Description      Send VS command before NFA start-up
248**
249** Returns          None
250**
251*******************************************************************************/
252void nfc_hal_dm_send_startup_vsc (void)
253{
254    UINT8  *p, *p_end;
255    UINT16 len;
256
257    NCI_TRACE_DEBUG0 ("nfc_hal_dm_send_startup_vsc ()");
258
259    /* VSC must have NCI header at least */
260    if (nfc_hal_cb.dev_cb.next_startup_vsc + NCI_MSG_HDR_SIZE - 1 <= *p_nfc_hal_dm_start_up_vsc_cfg)
261    {
262        p     = p_nfc_hal_dm_start_up_vsc_cfg + nfc_hal_cb.dev_cb.next_startup_vsc;
263        len   = *(p + 2);
264        p_end = p + NCI_MSG_HDR_SIZE - 1 + len;
265
266        if (p_end <= p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg)
267        {
268            /* move to next VSC */
269            nfc_hal_cb.dev_cb.next_startup_vsc += NCI_MSG_HDR_SIZE + len;
270
271            /* if this is last VSC */
272            if (p_end == p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg)
273                nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE;
274
275            nfc_hal_dm_send_nci_cmd (p, (UINT16)(NCI_MSG_HDR_SIZE + len), nfc_hal_dm_config_nfcc_cback);
276            return;
277        }
278    }
279
280    NCI_TRACE_ERROR0 ("nfc_hal_dm_send_startup_vsc (): Bad start-up VSC");
281
282    NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
283    nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
284}
285
286/*******************************************************************************
287**
288** Function         nfc_hal_dm_config_nfcc
289**
290** Description      Send VS config before NFA start-up
291**
292** Returns          void
293**
294*******************************************************************************/
295void nfc_hal_dm_config_nfcc (void)
296{
297    UINT8   *p;
298    UINT8   xtal_index;
299
300    NCI_TRACE_DEBUG1 ("nfc_hal_dm_config_nfcc (): next_dm_config = %d", nfc_hal_cb.dev_cb.next_dm_config);
301
302    if ((p_nfc_hal_dm_lptd_cfg[0]) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_LPTD))
303    {
304        nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_PLL_325;
305
306        if (nfc_hal_dm_set_config (p_nfc_hal_dm_lptd_cfg[0],
307                                   &p_nfc_hal_dm_lptd_cfg[1],
308                                   nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
309        {
310            return;
311        }
312        else
313        {
314            NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
315            nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
316            return;
317        }
318    }
319
320    if ((p_nfc_hal_dm_pll_325_cfg) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_PLL_325))
321    {
322        xtal_index = nfc_hal_dm_get_xtal_index (nfc_post_reset_cb.dev_init_config.xtal_freq);
323        if (xtal_index < NFC_HAL_XTAL_INDEX_MAX)
324        {
325            nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP;
326            p = p_nfc_hal_dm_pll_325_cfg + (xtal_index * NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN);
327            if (nfc_hal_dm_set_config (NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN,
328                                       p,
329                                       nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
330            {
331                return;
332            }
333            else
334            {
335                NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
336                nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
337                return;
338            }
339        }
340    }
341
342    if ((p_nfc_hal_dm_start_up_cfg[0]) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP))
343    {
344        nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_I93_DATA_RATE;
345        if (nfc_hal_dm_set_config (p_nfc_hal_dm_start_up_cfg[0],
346                                   &p_nfc_hal_dm_start_up_cfg[1],
347                                   nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
348        {
349            return;
350        }
351        else
352        {
353            NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
354            nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
355            return;
356        }
357    }
358
359#if (NFC_HAL_I93_FLAG_DATA_RATE == NFC_HAL_I93_FLAG_DATA_RATE_HIGH)
360    if (nfc_hal_cb.dev_cb.next_dm_config  <= NFC_HAL_DM_CONFIG_I93_DATA_RATE)
361    {
362        nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_FW_FSM;
363        if (nfc_hal_dm_set_config (NFC_HAL_I93_RW_CFG_LEN,
364                                   nfc_hal_dm_i93_rw_cfg,
365                                   nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
366        {
367            return;
368        }
369        else
370        {
371            NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
372            nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
373            return;
374        }
375    }
376#endif
377
378    /* FW FSM is disabled as default in NFCC */
379    if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_FW_FSM)
380    {
381        nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP_VSC;
382        nfc_hal_dm_set_fw_fsm (NFC_HAL_DM_MULTI_TECH_RESP, nfc_hal_dm_config_nfcc_cback);
383        return;
384    }
385
386    if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP_VSC)
387    {
388        if (p_nfc_hal_dm_start_up_vsc_cfg && *p_nfc_hal_dm_start_up_vsc_cfg)
389        {
390            nfc_hal_dm_send_startup_vsc ();
391            return;
392        }
393    }
394
395    /* nothing to config */
396    nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE;
397    nfc_hal_dm_config_nfcc_cback (0, 0, NULL);
398}
399
400/*******************************************************************************
401**
402** Function         nfc_hal_dm_set_xtal_freq_index
403**
404** Description      Set crystal frequency index
405**
406** Returns          void
407**
408*******************************************************************************/
409void nfc_hal_dm_set_xtal_freq_index (void)
410{
411    UINT8 nci_brcm_xtal_index_cmd[NCI_MSG_HDR_SIZE + NCI_PROP_PARAM_SIZE_XTAL_INDEX];
412    UINT8 *p;
413    tNFC_HAL_XTAL_INDEX xtal_index;
414
415    NCI_TRACE_DEBUG1 ("nfc_hal_dm_set_xtal_freq_index (): xtal_freq = %d", nfc_post_reset_cb.dev_init_config.xtal_freq);
416
417    xtal_index = nfc_hal_dm_get_xtal_index (nfc_post_reset_cb.dev_init_config.xtal_freq);
418
419    switch (xtal_index)
420    {
421    case NFC_HAL_XTAL_INDEX_9600:
422    case NFC_HAL_XTAL_INDEX_13000:
423    case NFC_HAL_XTAL_INDEX_19200:
424    case NFC_HAL_XTAL_INDEX_26000:
425    case NFC_HAL_XTAL_INDEX_38400:
426    case NFC_HAL_XTAL_INDEX_52000:
427
428        {
429            /* no need to set xtal index for these frequency */
430            NCI_TRACE_DEBUG0 ("nfc_hal_dm_set_xtal_freq_index (): no need to set xtal index");
431
432            nfc_post_reset_cb.dev_init_config.flags &= ~NFC_HAL_DEV_INIT_FLAGS_SET_XTAL_FREQ;
433            nfc_hal_dm_send_reset_cmd ();
434            return;
435        }
436        break;
437    }
438
439    p = nci_brcm_xtal_index_cmd;
440    UINT8_TO_STREAM  (p, (NCI_MTS_CMD|NCI_GID_PROP));
441    UINT8_TO_STREAM  (p, NCI_MSG_GET_XTAL_INDEX_FROM_DH);
442    UINT8_TO_STREAM  (p, NCI_PROP_PARAM_SIZE_XTAL_INDEX);
443    UINT8_TO_STREAM  (p, xtal_index);
444    UINT16_TO_STREAM (p, nfc_post_reset_cb.dev_init_config.xtal_freq);
445
446    NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_XTAL_SET);
447
448    nfc_hal_dm_send_nci_cmd (nci_brcm_xtal_index_cmd, NCI_MSG_HDR_SIZE + NCI_PROP_PARAM_SIZE_XTAL_INDEX, NULL);
449}
450
451/*******************************************************************************
452**
453** Function         nfc_hal_dm_send_reset_cmd
454**
455** Description      Send CORE RESET CMD
456**
457** Returns          void
458**
459*******************************************************************************/
460void nfc_hal_dm_send_reset_cmd (void)
461{
462    /* Proceed with start up sequence: send CORE_RESET_CMD */
463    NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_RESET);
464
465    nfc_hal_dm_send_nci_cmd (nfc_hal_dm_core_reset_cmd, NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET, NULL);
466}
467
468/*******************************************************************************
469**
470** Function         nfc_hal_dm_proc_msg_during_init
471**
472** Description      Process NCI message while initializing NFCC
473**
474** Returns          void
475**
476*******************************************************************************/
477void nfc_hal_dm_proc_msg_during_init (NFC_HDR *p_msg)
478{
479    UINT8 *p;
480    UINT8 reset_reason, reset_type;
481    UINT8 mt, pbf, gid, op_code;
482    UINT8 *p_old, old_gid, old_oid, old_mt;
483    tNFC_HAL_NCI_CBACK *p_cback = NULL;
484
485    NCI_TRACE_DEBUG1 ("nfc_hal_dm_proc_msg_during_init(): init state:%d", nfc_hal_cb.dev_cb.initializing_state);
486
487    p = (UINT8 *) (p_msg + 1) + p_msg->offset;
488
489    NCI_MSG_PRS_HDR0 (p, mt, pbf, gid);
490    NCI_MSG_PRS_HDR1 (p, op_code);
491
492    /* check if waiting for this response */
493    if (  (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_CMD)
494        ||(nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_VSC)  )
495    {
496        if (mt == NCI_MT_RSP)
497        {
498            p_old = nfc_hal_cb.ncit_cb.last_hdr;
499            NCI_MSG_PRS_HDR0 (p_old, old_mt, pbf, old_gid);
500            old_oid = ((*p_old) & NCI_OID_MASK);
501            /* make sure this is the RSP we are waiting for before updating the command window */
502            if ((old_gid == gid) && (old_oid == op_code))
503            {
504                nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
505                p_cback = (tNFC_HAL_NCI_CBACK *)nfc_hal_cb.ncit_cb.p_vsc_cback;
506                nfc_hal_cb.ncit_cb.p_vsc_cback  = NULL;
507                nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
508            }
509        }
510    }
511
512    if (gid == NCI_GID_CORE)
513    {
514        if (op_code == NCI_MSG_CORE_RESET)
515        {
516            if (mt == NCI_MT_RSP)
517            {
518                if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_RE_INIT)
519                {
520                    NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_APP_COMPLETE);
521                    nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, nfc_hal_cb.p_reinit_cback);
522                }
523                else
524                {
525                    NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_BUILD_INFO);
526
527                    /* get build information to find out HW */
528                    nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_build_info_cmd, NCI_MSG_HDR_SIZE, NULL);
529                }
530            }
531            else
532            {
533                /* Call reset notification callback */
534                p++;                                /* Skip over param len */
535                STREAM_TO_UINT8 (reset_reason, p);
536                STREAM_TO_UINT8 (reset_type, p);
537                nfc_hal_prm_spd_reset_ntf (reset_reason, reset_type);
538            }
539        }
540        else if (p_cback)
541        {
542            (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code),
543                        p_msg->len,
544                        (UINT8 *) (p_msg + 1) + p_msg->offset);
545        }
546    }
547    else if (gid == NCI_GID_PROP) /* this is for download patch */
548    {
549        if (mt == NCI_MT_NTF)
550            op_code |= NCI_NTF_BIT;
551        else
552            op_code |= NCI_RSP_BIT;
553
554        if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_XTAL_SET)
555        {
556            if (op_code == (NCI_RSP_BIT|NCI_MSG_GET_XTAL_INDEX_FROM_DH))
557            {
558                /* wait for crystal setting in NFCC */
559                GKI_delay (100);
560
561                /* Crytal frequency configured. Proceed with start up sequence: send CORE_RESET_CMD */
562                nfc_hal_dm_send_reset_cmd ();
563            }
564        }
565        else if (  (op_code == NFC_VS_GET_BUILD_INFO_EVT)
566                 &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_BUILD_INFO)  )
567        {
568            p += NCI_BUILD_INFO_OFFSET_HWID;
569
570            STREAM_TO_UINT32 (nfc_hal_cb.dev_cb.brcm_hw_id, p);
571
572            NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_PATCH_INFO);
573
574            nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, NULL);
575        }
576        else if (  (op_code == NFC_VS_GET_PATCH_VERSION_EVT)
577                 &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_PATCH_INFO)  )
578        {
579            p += NCI_PATCH_INFO_OFFSET_NVMTYPE;
580
581            NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_APP_COMPLETE);
582
583            /* let platform update baudrate or download patch */
584            nfc_hal_post_reset_init (nfc_hal_cb.dev_cb.brcm_hw_id, *p);
585        }
586        else if (p_cback)
587        {
588            (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code),
589                        p_msg->len,
590                        (UINT8 *) (p_msg + 1) + p_msg->offset);
591        }
592        else if (op_code == NFC_VS_SEC_PATCH_AUTH_EVT)
593        {
594            NCI_TRACE_DEBUG0 ("signature!!");
595            nfc_hal_prm_nci_command_complete_cback ((tNFC_HAL_NCI_EVT) (op_code),
596                                                    p_msg->len,
597                                                    (UINT8 *) (p_msg + 1) + p_msg->offset);
598        }
599    }
600}
601
602/*******************************************************************************
603**
604** Function         nfc_hal_dm_send_nci_cmd
605**
606** Description      Send NCI command to NFCC while initializing BRCM NFCC
607**
608** Returns          void
609**
610*******************************************************************************/
611void nfc_hal_dm_send_nci_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_NCI_CBACK *p_cback)
612{
613    NFC_HDR *p_buf;
614    UINT8  *ps;
615
616    NCI_TRACE_DEBUG1 ("nfc_hal_dm_send_nci_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp);
617
618    if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE)
619    {
620        NCI_TRACE_ERROR0 ("nfc_hal_dm_send_nci_cmd(): no command window");
621        return;
622    }
623
624    if ((p_buf = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
625    {
626        nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_VSC;
627
628        p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
629        p_buf->event  = NFC_HAL_EVT_TO_NFC_NCI;
630        p_buf->len    = len;
631
632        memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len);
633
634        /* Keep a copy of the command and send to NCI transport */
635
636        /* save the message header to double check the response */
637        ps   = (UINT8 *)(p_buf + 1) + p_buf->offset;
638        memcpy(nfc_hal_cb.ncit_cb.last_hdr, ps, NFC_HAL_SAVED_HDR_SIZE);
639        memcpy(nfc_hal_cb.ncit_cb.last_cmd, ps + NCI_MSG_HDR_SIZE, NFC_HAL_SAVED_CMD_SIZE);
640
641        /* save the callback for NCI VSCs */
642        nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback;
643
644        nfc_hal_nci_send_cmd (p_buf);
645
646        /* start NFC command-timeout timer */
647        nfc_hal_main_start_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer, (UINT16)(NFC_HAL_TTYPE_NCI_WAIT_RSP),
648                                        ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
649    }
650}
651
652/*******************************************************************************
653**
654** Function         nfc_hal_dm_send_pend_cmd
655**
656** Description      Send a command to NFCC
657**
658** Returns          void
659**
660*******************************************************************************/
661void nfc_hal_dm_send_pend_cmd (void)
662{
663    NFC_HDR *p_buf = nfc_hal_cb.ncit_cb.p_pend_cmd;
664    UINT8  *p;
665
666    if (p_buf == NULL)
667        return;
668
669    /* check low power mode state */
670    if (!nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TX_DATA_EVT))
671    {
672        return;
673    }
674
675    if (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_PROP)
676    {
677#if (NFC_HAL_TRACE_PROTOCOL == TRUE)
678        DispHciCmd (p_buf);
679#endif
680
681        /* save the message header to double check the response */
682        p = (UINT8 *)(p_buf + 1) + p_buf->offset;
683        memcpy(nfc_hal_cb.ncit_cb.last_hdr, p, NFC_HAL_SAVED_HDR_SIZE);
684
685        /* add packet type for BT message */
686        p_buf->offset--;
687        p_buf->len++;
688
689        p  = (UINT8 *) (p_buf + 1) + p_buf->offset;
690        *p = HCIT_TYPE_COMMAND;
691
692        USERIAL_Write (USERIAL_NFC_PORT, p, p_buf->len);
693
694        GKI_freebuf (p_buf);
695        nfc_hal_cb.ncit_cb.p_pend_cmd = NULL;
696
697        /* start NFC command-timeout timer */
698        nfc_hal_main_start_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer, (UINT16)(NFC_HAL_TTYPE_NCI_WAIT_RSP),
699                                        ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
700
701    }
702}
703
704/*******************************************************************************
705**
706** Function         nfc_hal_dm_send_bt_cmd
707**
708** Description      Send BT message to NFCC while initializing BRCM NFCC
709**
710** Returns          void
711**
712*******************************************************************************/
713void nfc_hal_dm_send_bt_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_BTVSC_CPLT_CBACK *p_cback)
714{
715    NFC_HDR *p_buf;
716
717    NCI_TRACE_DEBUG1 ("nfc_hal_dm_send_bt_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp);
718
719    if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE)
720    {
721        NCI_TRACE_ERROR0 ("nfc_hal_dm_send_bt_cmd(): no command window");
722        return;
723    }
724
725    if ((p_buf = (NFC_HDR *) GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
726    {
727        nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_PROP;
728
729        p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
730        p_buf->len    = len;
731
732        memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len);
733
734        /* save the callback for NCI VSCs)  */
735        nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback;
736
737        nfc_hal_cb.ncit_cb.p_pend_cmd = p_buf;
738        if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_IDLE)
739        {
740            NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_CONTROL_DONE);
741            nfc_hal_cb.p_stack_cback (HAL_NFC_REQUEST_CONTROL_EVT, HAL_NFC_STATUS_OK);
742            return;
743        }
744
745        nfc_hal_dm_send_pend_cmd();
746    }
747}
748
749/*******************************************************************************
750**
751** Function         nfc_hal_dm_set_nfc_wake
752**
753** Description      Set NFC_WAKE line
754**
755** Returns          void
756**
757*******************************************************************************/
758void nfc_hal_dm_set_nfc_wake (UINT8 cmd)
759{
760    NCI_TRACE_DEBUG1 ("nfc_hal_dm_set_nfc_wake () %s",
761                      (cmd == NFC_HAL_ASSERT_NFC_WAKE ? "ASSERT" : "DEASSERT"));
762
763    /*
764    **  nfc_wake_active_mode             cmd              result of voltage on NFC_WAKE
765    **
766    **  NFC_HAL_LP_ACTIVE_LOW (0)    NFC_HAL_ASSERT_NFC_WAKE (0)    pull down NFC_WAKE (GND)
767    **  NFC_HAL_LP_ACTIVE_LOW (0)    NFC_HAL_DEASSERT_NFC_WAKE (1)  pull up NFC_WAKE (VCC)
768    **  NFC_HAL_LP_ACTIVE_HIGH (1)   NFC_HAL_ASSERT_NFC_WAKE (0)    pull up NFC_WAKE (VCC)
769    **  NFC_HAL_LP_ACTIVE_HIGH (1)   NFC_HAL_DEASSERT_NFC_WAKE (1)  pull down NFC_WAKE (GND)
770    */
771
772    if (cmd == nfc_hal_cb.dev_cb.nfc_wake_active_mode)
773        UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_OFF); /* pull down NFC_WAKE */
774    else
775        UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_ON);  /* pull up NFC_WAKE */
776}
777
778/*******************************************************************************
779**
780** Function         nfc_hal_dm_power_mode_execute
781**
782** Description      If snooze mode is enabled in full power mode,
783**                     Assert NFC_WAKE before sending data
784**                     Deassert NFC_WAKE when idle timer expires
785**
786** Returns          TRUE if DH can send data to NFCC
787**
788*******************************************************************************/
789BOOLEAN nfc_hal_dm_power_mode_execute (tNFC_HAL_LP_EVT event)
790{
791    BOOLEAN send_to_nfcc = FALSE;
792
793    NCI_TRACE_DEBUG1 ("nfc_hal_dm_power_mode_execute () event = %d", event);
794
795    if (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL)
796    {
797        if (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)
798        {
799            /* if any transport activity */
800            if (  (event == NFC_HAL_LP_TX_DATA_EVT)
801                ||(event == NFC_HAL_LP_RX_DATA_EVT)  )
802            {
803                /* if idle timer is not running */
804                if (nfc_hal_cb.dev_cb.lp_timer.in_use == FALSE)
805                {
806                    nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE);
807                }
808
809                /* start or extend idle timer */
810                nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00,
811                                                ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
812            }
813            else if (event == NFC_HAL_LP_TIMEOUT_EVT)
814            {
815                /* let NFCC go to snooze mode */
816                nfc_hal_dm_set_nfc_wake (NFC_HAL_DEASSERT_NFC_WAKE);
817            }
818        }
819
820        send_to_nfcc = TRUE;
821    }
822
823    return (send_to_nfcc);
824}
825
826/*******************************************************************************
827**
828** Function         nci_brcm_lp_timeout_cback
829**
830** Description      callback function for low power timeout
831**
832** Returns          void
833**
834*******************************************************************************/
835static void nci_brcm_lp_timeout_cback (void *p_tle)
836{
837    NCI_TRACE_DEBUG0 ("nci_brcm_lp_timeout_cback ()");
838
839    nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TIMEOUT_EVT);
840}
841
842/*******************************************************************************
843**
844** Function         nfc_hal_dm_pre_init_nfcc
845**
846** Description      This function initializes Broadcom specific control blocks for
847**                  NCI transport
848**
849** Returns          void
850**
851*******************************************************************************/
852void nfc_hal_dm_pre_init_nfcc (void)
853{
854    NCI_TRACE_DEBUG0 ("nfc_hal_dm_pre_init_nfcc ()");
855
856    if (nfc_post_reset_cb.dev_init_config.flags & NFC_HAL_DEV_INIT_FLAGS_SET_XTAL_FREQ)
857    {
858        nfc_hal_dm_set_xtal_freq_index ();
859    }
860    else
861    {
862        /* Send RESET CMD if application registered callback for device initialization */
863        nfc_hal_dm_send_reset_cmd ();
864    }
865}
866
867/*******************************************************************************
868**
869** Function         nfc_hal_dm_shutting_down_nfcc
870**
871** Description      This function initializes Broadcom specific control blocks for
872**                  NCI transport
873**
874** Returns          void
875**
876*******************************************************************************/
877void nfc_hal_dm_shutting_down_nfcc (void)
878{
879    NCI_TRACE_DEBUG0 ("nfc_hal_dm_shutting_down_nfcc ()");
880
881    nfc_hal_cb.dev_cb.initializing_state = NFC_HAL_INIT_STATE_CLOSING;
882
883    /* reset low power mode variables */
884    if (  (nfc_hal_cb.dev_cb.power_mode  == NFC_HAL_POWER_MODE_FULL)
885        &&(nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)  )
886    {
887        nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE);
888    }
889
890    nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
891    nfc_hal_cb.hci_cb.b_check_clear_all_pipe_cmd = FALSE;
892
893    nfc_hal_cb.dev_cb.power_mode  = NFC_HAL_POWER_MODE_FULL;
894    nfc_hal_cb.dev_cb.snooze_mode = NFC_HAL_LP_SNOOZE_MODE_NONE;
895
896    /* Stop all timers */
897    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
898    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer);
899    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer);
900    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.hci_cb.hci_timer);
901}
902
903/*******************************************************************************
904**
905** Function         nfc_hal_dm_init
906**
907** Description      This function initializes Broadcom specific control blocks for
908**                  NCI transport
909**
910** Returns          void
911**
912*******************************************************************************/
913void nfc_hal_dm_init (void)
914{
915    NCI_TRACE_DEBUG0 ("nfc_hal_dm_init ()");
916
917    nfc_hal_cb.dev_cb.lp_timer.p_cback = nci_brcm_lp_timeout_cback;
918
919    nfc_hal_cb.ncit_cb.nci_wait_rsp_timer.p_cback = nfc_hal_nci_cmd_timeout_cback;
920
921    nfc_hal_cb.hci_cb.hci_timer.p_cback = nfc_hal_hci_timeout_cback;
922
923}
924
925/*******************************************************************************
926**
927** Function         HAL_NfcDevInitDone
928**
929** Description      Notify that pre-initialization of NFCC is complete
930**
931** Returns          void
932**
933*******************************************************************************/
934void HAL_NfcPreInitDone (tHAL_NFC_STATUS status)
935{
936    NCI_TRACE_DEBUG1 ("HAL_NfcPreInitDone () status=%d", status);
937
938    if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE)
939    {
940        NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
941
942        nfc_hal_main_pre_init_done (status);
943    }
944}
945
946/*******************************************************************************
947**
948** Function         HAL_NfcReInit
949**
950** Description      This function is called to send an RESET and GET_PATCH_VERSION
951**                  command to NFCC.
952**
953**                  p_cback         - The callback function to receive the command
954**                                    status
955**
956** Note             This function should be called only during the HAL init process
957**
958** Returns          HAL_NFC_STATUS_OK if successfully initiated
959**                  HAL_NFC_STATUS_FAILED otherwise
960**
961*******************************************************************************/
962tHAL_NFC_STATUS HAL_NfcReInit (tNFC_HAL_NCI_CBACK *p_cback)
963{
964    tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED;
965    NCI_TRACE_DEBUG1 ("HAL_NfcReInit () init st=0x%x", nfc_hal_cb.dev_cb.initializing_state);
966    if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE)
967    {
968        /* Proceed with start up sequence: send CORE_RESET_CMD */
969        NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_RE_INIT);
970        nfc_hal_cb.p_reinit_cback = p_cback;
971
972        nfc_hal_dm_send_nci_cmd (nfc_hal_dm_core_reset_cmd, NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET, NULL);
973        status = HAL_NFC_STATUS_OK;
974    }
975    return status;
976}
977
978/*******************************************************************************
979**
980** Function         nfc_hal_dm_set_snooze_mode_cback
981**
982** Description      This is baud rate update complete callback.
983**
984** Returns          void
985**
986*******************************************************************************/
987static void nfc_hal_dm_set_snooze_mode_cback (tNFC_HAL_BTVSC_CPLT *pData)
988{
989    UINT8             status = pData->p_param_buf[0];
990    tHAL_NFC_STATUS   hal_status;
991    tHAL_NFC_STATUS_CBACK *p_cback;
992
993    /* if it is completed */
994    if (status == HCI_SUCCESS)
995    {
996        /* update snooze mode */
997        nfc_hal_cb.dev_cb.snooze_mode = nfc_hal_cb.dev_cb.new_snooze_mode;
998
999        nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE);
1000
1001        if ( nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)
1002        {
1003            /* start idle timer */
1004            nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00,
1005                                            ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
1006        }
1007        else
1008        {
1009            nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer);
1010        }
1011        hal_status = HAL_NFC_STATUS_OK;
1012    }
1013    else
1014    {
1015        hal_status = HAL_NFC_STATUS_FAILED;
1016    }
1017
1018    if (nfc_hal_cb.dev_cb.p_prop_cback)
1019    {
1020        p_cback = nfc_hal_cb.dev_cb.p_prop_cback;
1021        nfc_hal_cb.dev_cb.p_prop_cback = NULL;
1022        (*p_cback) (hal_status);
1023    }
1024}
1025
1026/*******************************************************************************
1027**
1028** Function         HAL_NfcSetSnoozeMode
1029**
1030** Description      Set snooze mode
1031**                  snooze_mode
1032**                      NFC_HAL_LP_SNOOZE_MODE_NONE - Snooze mode disabled
1033**                      NFC_HAL_LP_SNOOZE_MODE_UART - Snooze mode for UART
1034**                      NFC_HAL_LP_SNOOZE_MODE_SPI_I2C - Snooze mode for SPI/I2C
1035**
1036**                  idle_threshold_dh/idle_threshold_nfcc
1037**                      Idle Threshold Host in 100ms unit
1038**
1039**                  nfc_wake_active_mode/dh_wake_active_mode
1040**                      NFC_HAL_LP_ACTIVE_LOW - high to low voltage is asserting
1041**                      NFC_HAL_LP_ACTIVE_HIGH - low to high voltage is asserting
1042**
1043**                  p_snooze_cback
1044**                      Notify status of operation
1045**
1046** Returns          tHAL_NFC_STATUS
1047**
1048*******************************************************************************/
1049tHAL_NFC_STATUS HAL_NfcSetSnoozeMode (UINT8 snooze_mode,
1050                                      UINT8 idle_threshold_dh,
1051                                      UINT8 idle_threshold_nfcc,
1052                                      UINT8 nfc_wake_active_mode,
1053                                      UINT8 dh_wake_active_mode,
1054                                      tHAL_NFC_STATUS_CBACK *p_snooze_cback)
1055{
1056    UINT8 cmd[NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH];
1057    UINT8 *p;
1058
1059    NCI_TRACE_API1 ("HAL_NfcSetSnoozeMode (): snooze_mode = %d", snooze_mode);
1060
1061    nfc_hal_cb.dev_cb.new_snooze_mode      = snooze_mode;
1062    nfc_hal_cb.dev_cb.nfc_wake_active_mode = nfc_wake_active_mode;
1063    nfc_hal_cb.dev_cb.p_prop_cback         = p_snooze_cback;
1064
1065    p = cmd;
1066
1067    /* Add the HCI command */
1068    UINT16_TO_STREAM (p, HCI_BRCM_WRITE_SLEEP_MODE);
1069    UINT8_TO_STREAM  (p, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH);
1070
1071    memset (p, 0x00, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH);
1072
1073    UINT8_TO_STREAM  (p, snooze_mode);          /* Sleep Mode               */
1074
1075    UINT8_TO_STREAM  (p, idle_threshold_dh);    /* Idle Threshold Host      */
1076    UINT8_TO_STREAM  (p, idle_threshold_nfcc);  /* Idle Threshold HC        */
1077    UINT8_TO_STREAM  (p, nfc_wake_active_mode); /* BT Wake Active Mode      */
1078    UINT8_TO_STREAM  (p, dh_wake_active_mode);  /* Host Wake Active Mode    */
1079
1080    nfc_hal_dm_send_bt_cmd (cmd,
1081                            NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH,
1082                            nfc_hal_dm_set_snooze_mode_cback);
1083    return (NCI_STATUS_OK);
1084}
1085
1086
1087
1088
1089
1090
1091
1092
1093