nfa_dm_discover.c revision 1ba9dcccf5b342bd74a2f8213b7ed3be78b9db44
1dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************
2dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *
3dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  Copyright (C) 2010-2013 Broadcom Corporation
4dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *
5dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  Licensed under the Apache License, Version 2.0 (the "License");
6dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  you may not use this file except in compliance with the License.
7dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  You may obtain a copy of the License at:
8dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *
9dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  http://www.apache.org/licenses/LICENSE-2.0
10dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *
11dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  Unless required by applicable law or agreed to in writing, software
12dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  distributed under the License is distributed on an "AS IS" BASIS,
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  See the License for the specific language governing permissions and
15dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  limitations under the License.
16dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *
17dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ******************************************************************************/
18dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
19dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
20dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *
22dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *  This file contains the action functions for device manager discovery
23e3ba15c794839abe076e3e2bdf6c626396a19d4dWill Dietz *  function.
24dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *
25dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ******************************************************************************/
26dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include <string.h>
27dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_sys.h"
28dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_api.h"
29dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_dm_int.h"
30dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_p2p_int.h"
31dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_sys_int.h"
32dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#if (NFC_NFCEE_INCLUDED == TRUE)
33dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_ee_api.h"
34dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_ee_int.h"
35dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#endif
36dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_rw_int.h"
37dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
38dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*
39dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**  static functions
40dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*/
41dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
42dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
43dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                            tNFC_DISCOVER_PARAMS disc_params[],
44dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                            UINT8 max_params);
45dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask);
46dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask);
47dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode,
48dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                                               tNFC_PROTOCOL       protocol);
49dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data);
50dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data);
51dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event, tNFC_DISCOVER *p_data);
52dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
53dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle);
54dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status);
55dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
56dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#if (BT_TRACE_VERBOSE == TRUE)
57dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic char *nfa_dm_disc_state_2_str (UINT8 state);
58dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic char *nfa_dm_disc_event_2_str (UINT8 event);
59dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#endif
60dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
61dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
62dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
63dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
64dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_get_rf_discover_config
65dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
66dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Build RF discovery configurations from tNFA_DM_DISC_TECH_PROTO_MASK
67dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
68dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          number of RF discovery configurations
69dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
70dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
71dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
72dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                            tNFC_DISCOVER_PARAMS         disc_params[],
73dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                            UINT8 max_params)
74dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
75dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8 num_params = 0;
76dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
77dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED)
78dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
79dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        NFA_TRACE_DEBUG1 ("nfa_dm_get_rf_discover_config () listen disabled, rm listen from 0x%x", dm_disc_mask);
80dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        dm_disc_mask &= NFA_DM_DISC_MASK_POLL;
81dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
82dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
83dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling A */
84dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & ( NFA_DM_DISC_MASK_PA_T1T
85dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_PA_T2T
86dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_PA_ISO_DEP
87dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_PA_NFC_DEP
88dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_P_LEGACY) )
89dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
90dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_A;
91dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pa;
92dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
93dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
94dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
95dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
96dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
97dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
98dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling B */
99dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_PB_ISO_DEP)
100dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
101dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_B;
102dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pb;
103dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
104dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
105dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
106dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
107dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
108dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
109dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling F */
110dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & ( NFA_DM_DISC_MASK_PF_T3T
111dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_PF_NFC_DEP) )
112dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
113dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_F;
114dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pf;
115dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
116dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
117dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
118dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
119dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
120dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
121dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling A Active mode  */
122dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_PAA_NFC_DEP)
123dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
124dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_A_ACTIVE;
125dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->paa;
126dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
127dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
128dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
129dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
130dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
131dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
132dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling F Active mode  */
133dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_PFA_NFC_DEP)
134dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
135dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_F_ACTIVE;
136dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pfa;
137dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
138dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
139dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
140dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
141dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
142dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
143dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check listening A */
144dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & ( NFA_DM_DISC_MASK_LA_T1T
145dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_LA_T2T
146dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_LA_ISO_DEP
147dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_LA_NFC_DEP) )
148dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
149dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_A;
150dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = 1;
151dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
152dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
153dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
154dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
155dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
156dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
157dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check listening B */
158dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)
159dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
160dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_B;
161dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = 1;
162dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
163dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
164dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
165dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
166dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
167dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
168dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check listening F */
169dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & ( NFA_DM_DISC_MASK_LF_T3T
170dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        |NFA_DM_DISC_MASK_LF_NFC_DEP) )
171dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
172dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_F;
173dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = 1;
174dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
175dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
176dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
177dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
178dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
179dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
180dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check listening A Active mode */
181dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP)
182dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
183dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE;
184dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = 1;
185dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
186dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
187dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
188dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
189dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
190dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
191dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check listening F Active mode */
192dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_LFA_NFC_DEP)
193dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
194dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE;
195dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = 1;
196dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
197dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
198dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
199dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
200dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
201dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
202dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling ISO 15693 */
203dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_P_ISO15693)
204dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
205dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_ISO15693;
206dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pi93;
207dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
208dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
209dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
210dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
211dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
212dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
213dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling B' */
214dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_P_B_PRIME)
215dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
216dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_B_PRIME;
217dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pbp;
218dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
219dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
220dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
221dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
222dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
223dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
224dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check polling KOVIO */
225dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_P_KOVIO)
226dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
227dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_KOVIO;
228dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pk;
229dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
230dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
231dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
232dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
233dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
234dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
235dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check listening ISO 15693 */
236dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_L_ISO15693)
237dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
238dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_ISO15693;
239dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = 1;
240dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
241dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
242dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
243dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
244dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
245dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
246dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Check listening B' */
247dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (dm_disc_mask & NFA_DM_DISC_MASK_L_B_PRIME)
248dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
249dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_B_PRIME;
250dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_params[num_params].frequency = 1;
251dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        num_params++;
252dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
253dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (num_params >= max_params)
254dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return num_params;
255dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
256dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
257dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return num_params;
258dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
259dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
260dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
261dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
262dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_set_rf_listen_mode_config
263dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
264dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Update listening protocol to NFCC
265dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
266dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          NFA_STATUS_OK if success
267dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
268dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
269dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask)
270dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
271dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8 params[40], *p;
272dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8 platform  = 0;
273dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8 sens_info = 0;
274dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
275dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_config () tech_proto_mask = 0x%08X",
276dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                       tech_proto_mask);
277dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
278dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /*
279dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** T1T listen     LA_PROT 0x80, LA_SENS_RES byte1:0x00 byte2:0x0C
280dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** T2T listen     LA_PROT 0x00
281dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** T3T listen     No bit for T3T in LF_PROT (CE T3T set listen parameters, system code, NFCID2, etc.)
282dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** ISO-DEP listen LA_PROT 0x01, LB_PROT 0x01
283dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** NFC-DEP listen LA_PROT 0x02, LF_PROT 0x02
284dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    */
285dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
286dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T1T)
287dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
288dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        platform = NCI_PARAM_PLATFORM_T1T;
289dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
290dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T2T)
291dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
292dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* platform = 0 and sens_info = 0 */
293dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
294dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
295dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
296dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (tech_proto_mask & NFA_DM_DISC_MASK_LA_ISO_DEP)
297dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
298dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            sens_info |= NCI_PARAM_SEL_INFO_ISODEP;
299dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
300dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
301dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (tech_proto_mask & NFA_DM_DISC_MASK_LA_NFC_DEP)
302dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
303dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            sens_info |= NCI_PARAM_SEL_INFO_NFCDEP;
304dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
305dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
306dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
307dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    p = params;
308dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
309dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /*
310dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** for Listen A
311dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    **
312dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** Set ATQA 0x0C00 for T1T listen
313dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** If the ATQA values are 0x0000, then the FW will use 0x0400
314dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** which works for ISODEP, T2T and NFCDEP.
315dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    */
316dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH)
317dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
318dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD);
319dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
320dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0x04);
321dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG);
322dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
323dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, platform);
324dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO);
325dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO);
326dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, sens_info);
327dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
328dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else /* Let NFCC use UICC configuration by configuring with length = 0 */
329dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
330dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD);
331dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
332dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG);
333dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
334dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO);
335dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
336dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1);
337dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
338dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY);
339dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
340dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
341dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
342dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* for Listen B */
343dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH)
344dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
345dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO);
346dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO);
347dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (tech_proto_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)
348dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
349dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_ISO_DEP);
350dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
351dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
352dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
353dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            UINT8_TO_STREAM (p,  0x00);
354dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
355dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
356dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else /* Let NFCC use UICC configuration by configuring with length = 0 */
357dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
358dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO);
359dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
360dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0);
361dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
362dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA);
363dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
364dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO);
365dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
366dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO);
367dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0);
368dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
369dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
370dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* for Listen F */
371dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */
372dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL);
373dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL);
374dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (tech_proto_mask & NFA_DM_DISC_MASK_LF_NFC_DEP)
375dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
376dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_NFC_DEP);
377dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
378dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
379dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
380dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 0x00);
381dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
382dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
383dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (p > params)
384dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
385dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
386dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
387dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
388dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return NFA_STATUS_OK;
389dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
390dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
391dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
392dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
393dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_set_total_duration
394dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
395dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Update total duration to NFCC
396dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
397dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          void
398dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
399dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
400dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_set_total_duration (void)
401dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
402dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8 params[10], *p;
403dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
404dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG0 ("nfa_dm_set_total_duration ()");
405dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
406dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    p = params;
407dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
408dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* for total duration */
409dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8_TO_STREAM (p, NFC_PMID_TOTAL_DURATION);
410dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8_TO_STREAM (p, NCI_PARAM_LEN_TOTAL_DURATION);
411dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT16_TO_STREAM (p, nfa_dm_cb.disc_cb.disc_duration);
412dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
413dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (p > params)
414dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
415dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
416dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
417dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
418dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
419dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
420dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
421dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_set_rf_listen_mode_raw_config
422dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
423dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Set raw listen parameters
424dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
425dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          void
426dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
427dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
428dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask)
429dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
430dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = 0;
431dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_LISTEN_CFG  *p_cfg = &nfa_dm_cb.disc_cb.excl_listen_config;
432dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8 params[250], *p, xx;
433dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
434dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG0 ("nfa_dm_set_rf_listen_mode_raw_config ()");
435dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
436dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /*
437dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** Discovery Configuration Parameters for Listen A
438dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    */
439dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (  (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH)
440dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        &&(p_cfg->la_enable)  )
441dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
442dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        p = params;
443dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
444dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD);
445dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
446dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->la_bit_frame_sdd);
447dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
448dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG);
449dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
450dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->la_platform_config);
451dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
452dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO);
453dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO);
454dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->la_sel_info);
455dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
456dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (p_cfg->la_platform_config == NCI_PARAM_PLATFORM_T1T)
457dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
458dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask |= NFA_DM_DISC_MASK_LA_T1T;
459dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
460dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
461dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
462dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* If T4T or NFCDEP */
463dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_ISODEP)
464dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
465dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                disc_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP;
466dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
467dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
468dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_NFCDEP)
469dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
470dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                disc_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP;
471dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
472dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
473dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* If neither, T4T nor NFCDEP, then its T2T */
474dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (disc_mask == 0)
475dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
476dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                disc_mask |= NFA_DM_DISC_MASK_LA_T2T;
477dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
478dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
479dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
480dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1);
481dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->la_nfcid1_len);
482dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ARRAY_TO_STREAM (p, p_cfg->la_nfcid1, p_cfg->la_nfcid1_len);
483dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
484dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
485dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
486dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
487dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /*
488dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** Discovery Configuration Parameters for Listen B
489dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    */
490dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (  (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH)
491dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        &&(p_cfg->lb_enable)  )
492dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
493dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        p = params;
494dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
495dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO);
496dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO);
497dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->lb_sensb_info);
498dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
499dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0);
500dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->lb_nfcid0_len);
501dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ARRAY_TO_STREAM (p, p_cfg->lb_nfcid0, p_cfg->lb_nfcid0_len);
502dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
503dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA);
504dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_APPDATA);
505dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ARRAY_TO_STREAM (p, p_cfg->lb_app_data, NCI_PARAM_LEN_LB_APPDATA);
506dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
507dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_SFGI);
508dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 1);
509dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->lb_adc_fo);
510dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
511dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO);
512dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_ADC_FO);
513dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->lb_adc_fo);
514dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
515dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
516dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
517dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (p_cfg->lb_sensb_info & NCI_LISTEN_PROTOCOL_ISO_DEP)
518dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
519dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP;
520dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
521dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
522dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
523dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /*
524dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** Discovery Configuration Parameters for Listen F
525dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    */
526dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (  (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F] == NFA_DM_DISC_HOST_ID_DH)
527dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        &&(p_cfg->lf_enable)  )
528dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
529dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        p = params;
530dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
531dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LF_CON_BITR_F);
532dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 1);
533dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->lf_con_bitr_f);
534dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
535dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL);
536dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL);
537dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->lf_protocol_type);
538dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
539dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_FLAGS2);
540dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_T3T_FLAGS2);
541dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT16_TO_STREAM(p, p_cfg->lf_t3t_flags);
542dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
543dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* if the bit at position X is set to 0, SC/NFCID2 with index X shall be ignored */
544dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        for (xx = 0; xx < NFA_LF_MAX_SC_NFCID2; xx++)
545dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
546dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if ((p_cfg->lf_t3t_flags & (0x0001 << xx)) != 0x0000)
547dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
548dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_ID1 + xx);
549dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                UINT8_TO_STREAM (p, NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
550dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                ARRAY_TO_STREAM (p, p_cfg->lf_t3t_identifier[xx], NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
551dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
552dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
553dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
554dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p,  NFC_PMID_LF_T3T_PMM);
555dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p,  NCI_PARAM_LEN_LF_T3T_PMM);
556dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ARRAY_TO_STREAM (p,  p_cfg->lf_t3t_pmm, NCI_PARAM_LEN_LF_T3T_PMM);
557dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
558dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
559dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
560dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (p_cfg->lf_t3t_flags != NCI_LF_T3T_FLAGS2_ALL_DISABLED)
561dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
562dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask |= NFA_DM_DISC_MASK_LF_T3T;
563dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
564dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (p_cfg->lf_protocol_type & NCI_LISTEN_PROTOCOL_NFC_DEP)
565dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
566dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP;
567dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
568dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
569dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
570dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /*
571dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** Discovery Configuration Parameters for Listen ISO-DEP
572dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    */
573dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if ((disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LB_ISO_DEP))
574dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor      &&(p_cfg->li_enable))
575dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
576dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        p = params;
577dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
578dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_FWI);
579dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_FWI);
580dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->li_fwi);
581dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
582dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP)
583dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
584dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY);
585dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            UINT8_TO_STREAM (p, p_cfg->la_hist_bytes_len);
586dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            ARRAY_TO_STREAM (p, p_cfg->la_hist_bytes, p_cfg->la_hist_bytes_len);
587dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
588dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
589dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)
590dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
591dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO);
592dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            UINT8_TO_STREAM (p, p_cfg->lb_h_info_resp_len);
593dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            ARRAY_TO_STREAM (p, p_cfg->lb_h_info_resp, p_cfg->lb_h_info_resp_len);
594dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
595dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
596dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
597dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
598dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
599dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /*
600dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    ** Discovery Configuration Parameters for Listen NFC-DEP
601dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    */
602dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (  (disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP|NFA_DM_DISC_MASK_LF_NFC_DEP))
603dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        &&(p_cfg->ln_enable))
604dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
605dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        p = params;
606dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
607dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_WT);
608dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NCI_PARAM_LEN_WT);
609dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->ln_wt);
610dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
611dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_ATR_RES_GEN_BYTES);
612dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes_len);
613dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ARRAY_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes, p_cfg->ln_atr_res_gen_bytes_len);
614dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
615dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, NFC_PMID_ATR_RSP_CONFIG);
616dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, 1);
617dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        UINT8_TO_STREAM (p, p_cfg->ln_atr_res_config);
618dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
619dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
620dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
621dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
622dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    *p_disc_mask = disc_mask;
623dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
624dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_raw_config () disc_mask = 0x%x", disc_mask);
625dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
626dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
627dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
628dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
629dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_get_disc_mask
630dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
631dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Convert RF technology, mode and protocol to bit mask
632dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
633dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          tNFA_DM_DISC_TECH_PROTO_MASK
634dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
635dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
636dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode,
637dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                                               tNFC_PROTOCOL       protocol)
638dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
639dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Set initial disc_mask to legacy poll or listen */
640dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = ((tech_n_mode & 0x80) ? NFA_DM_DISC_MASK_L_LEGACY : NFA_DM_DISC_MASK_P_LEGACY);
641dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
642dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    switch (tech_n_mode)
643dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
644dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_A:
645dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        switch (protocol)
646dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
647dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_T1T:
648dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_PA_T1T;
649dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
650dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_T2T:
651dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_PA_T2T;
652dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
653dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_ISO_DEP:
654dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_PA_ISO_DEP;
655dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
656dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_NFC_DEP:
657dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_PA_NFC_DEP;
658dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
659dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
660dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
661dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_B:
662dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (protocol == NFC_PROTOCOL_ISO_DEP)
663dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_PB_ISO_DEP;
664dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
665dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_F:
666dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (protocol == NFC_PROTOCOL_T3T)
667dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_PF_T3T;
668dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else if (protocol == NFC_PROTOCOL_NFC_DEP)
669dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_PF_NFC_DEP;
670dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
671dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_ISO15693:
672dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_P_ISO15693;
673dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
674dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_B_PRIME:
675dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_P_B_PRIME;
676dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
677dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_KOVIO:
678dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_P_KOVIO;
679dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
680dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE:
681dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_PAA_NFC_DEP;
682dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
683dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE:
684dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_PFA_NFC_DEP;
685dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
686dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
687dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_LISTEN_A:
688dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        switch (protocol)
689dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
690dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_T1T:
691dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_LA_T1T;
692dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
693dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_T2T:
694dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_LA_T2T;
695dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
696dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_ISO_DEP:
697dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP;
698dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
699dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        case NFC_PROTOCOL_NFC_DEP:
700dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_LA_NFC_DEP;
701dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            break;
702dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
703dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
704dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_LISTEN_B:
705dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (protocol == NFC_PROTOCOL_ISO_DEP)
706dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_LB_ISO_DEP;
707dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
708dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_LISTEN_F:
709dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (protocol == NFC_PROTOCOL_T3T)
710dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_LF_T3T;
711dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else if (protocol == NFC_PROTOCOL_NFC_DEP)
712dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            disc_mask = NFA_DM_DISC_MASK_LF_NFC_DEP;
713dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
714dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_LISTEN_ISO15693:
715dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_L_ISO15693;
716dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
717dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME:
71836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        disc_mask = NFA_DM_DISC_MASK_L_B_PRIME;
719dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
720dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE:
721dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_LAA_NFC_DEP;
722dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
723dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE:
724dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        disc_mask = NFA_DM_DISC_MASK_LFA_NFC_DEP;
725dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
726dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
727dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
728dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG3 ("nfa_dm_disc_get_disc_mask (): tech_n_mode:0x%X, protocol:0x%X, disc_mask:0x%X",
729dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                       tech_n_mode, protocol, disc_mask);
730dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return (disc_mask);
731dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
732dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
733dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
734dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
735dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_discovery_cback
736dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
737dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Discovery callback event from NFC
738dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
739dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          void
740dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
741dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
742dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_discovery_cback (tNFC_DISCOVER_EVT event, tNFC_DISCOVER *p_data)
743dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
744dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_DM_RF_DISC_SM_EVENT dm_disc_event = NFA_DM_DISC_SM_MAX_EVENT;
745dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
746dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG1 ("nfa_dm_disc_discovery_cback (): event:0x%X", event);
747dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
748dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    switch (event)
749dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
750dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_START_DEVT:
751dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        dm_disc_event = NFA_DM_RF_DISCOVER_RSP;
752dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
753dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_RESULT_DEVT:
754dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        dm_disc_event = NFA_DM_RF_DISCOVER_NTF;
755dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
756dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_SELECT_DEVT:
757dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        dm_disc_event = NFA_DM_RF_DISCOVER_SELECT_RSP;
758dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
759dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_ACTIVATE_DEVT:
760dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        dm_disc_event = NFA_DM_RF_INTF_ACTIVATED_NTF;
761dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
762dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    case NFC_DEACTIVATE_DEVT:
763dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (p_data->deactivate.is_ntf)
764dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            dm_disc_event = NFA_DM_RF_DEACTIVATE_NTF;
765dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
766dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            dm_disc_event = NFA_DM_RF_DEACTIVATE_RSP;
767dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        break;
768dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    default:
769dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        NFA_TRACE_ERROR0 ("Unexpected event");
770dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        return;
771dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
772dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
773dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_disc_sm_execute (dm_disc_event, (tNFA_DM_RF_DISC_DATA *) p_data);
774dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
775dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
776dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
777dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
778dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_notify_started
779dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
780dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Report NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT or
781dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                  NFA_RF_DISCOVERY_STARTED_EVT, if needed
782dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
783dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          void
784dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
785dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
786dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_notify_started (tNFA_STATUS status)
787dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
788dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_CONN_EVT_DATA      evt_data;
789dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
790dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)
791dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
792dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
793dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
794dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        evt_data.status = status;
795dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
796dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
797dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_conn_cback_event_notify (NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &evt_data);
798dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
799dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
800dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
801dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
802dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
803dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
804dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
805dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_conn_event_notify
806dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
807dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Notify application of CONN_CBACK event, using appropriate
808dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                  callback
809dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
810dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          nothing
811dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
812dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
813dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorvoid nfa_dm_disc_conn_event_notify (UINT8 event, tNFA_STATUS status)
814dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
815dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_CONN_EVT_DATA      evt_data;
816dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
817dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)
818dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
819dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
820dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        evt_data.status               = status;
821dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
822dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)
823dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
824dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* Use exclusive RF mode callback */
825dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_cb.p_excl_conn_cback)
826dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                (*nfa_dm_cb.p_excl_conn_cback) (event, &evt_data);
827dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
828dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
829dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
830dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            (*nfa_dm_cb.p_conn_cback) (event, &evt_data);
831dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
832dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
833dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
834dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
835dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
836dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
837dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_force_to_idle
838dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
839dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Force NFCC to idle state while waiting for deactivation NTF
840dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
841dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          tNFC_STATUS
842dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
843dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
844dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFC_STATUS nfa_dm_disc_force_to_idle (void)
845dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
846dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
847dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
848dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG1 ("nfa_dm_disc_force_to_idle() disc_flags = 0x%x", nfa_dm_cb.disc_cb.disc_flags);
849dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
850dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) /* do not execute more than one */
851dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
852dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_NTF);
853dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP);
854dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
855dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        status = NFC_Deactivate (NFC_DEACTIVATE_TYPE_IDLE);
856dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
857dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
858dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return (status);
859dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
860dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
861dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
862dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
863dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_deact_ntf_timeout_cback
864dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
865dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Timeout while waiting for deactivation NTF
866dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
867dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          void
868dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
869dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
870dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_deact_ntf_timeout_cback (TIMER_LIST_ENT *p_tle)
871dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
872dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_ERROR0 ("nfa_dm_disc_deact_ntf_timeout_cback()");
873dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
874dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_disc_force_to_idle();
875dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
876dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
877dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
878dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
879dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_send_deactivate_cmd
880dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
881dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Send deactivate command to NFCC, if needed.
882dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
883dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          NFC_STATUS_OK             - deactivate cmd is sent
884dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                  NCI_STATUS_FAILED         - no buffers
885dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                  NFC_STATUS_SEMANTIC_ERROR - this function does not attempt
886dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                                              to send deactivate cmd
887dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
888dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
889dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFC_STATUS nfa_dm_send_deactivate_cmd (tNFC_DEACT_TYPE deactivate_type)
890dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
891dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
892dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_DM_DISC_FLAGS w4_flags = nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
893dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
894dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (!w4_flags)
895dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
896dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* if deactivate CMD was not sent to NFCC */
897dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
898dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
899dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        status = NFC_Deactivate (deactivate_type);
900dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
901dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (!nfa_dm_cb.disc_cb.tle.in_use)
902dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
903dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_cb.disc_cb.tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_deact_ntf_timeout_cback;
904dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.tle, 0, NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF);
905dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
906dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
907dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
908dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
909dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP)
910dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
911dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            status = NFC_STATUS_SEMANTIC_ERROR;
912dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
913dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else if (nfa_dm_cb.disc_cb.tle.in_use)
914dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
915dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            status = NFC_STATUS_OK;
916dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
917dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
918dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
919dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            status = nfa_dm_disc_force_to_idle ();
920dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
921dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
922dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
923dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return status;
924dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
925dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
926dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
927dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
928dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_start_rf_discover
929dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
930dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Start RF discovery
931dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
932dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          void
933dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
934dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
935dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorvoid nfa_dm_start_rf_discover (void)
936dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
937dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_DISCOVER_PARAMS    disc_params[NFA_DM_MAX_DISC_PARAMS];
938dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask = 0, poll_mask, listen_mask;
939dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8                   num_params, xx;
940dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
941dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG0 ("nfa_dm_start_rf_discover ()");
942dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Make sure that RF discovery was enabled, or some app has exclusive control */
943dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (  (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED))
944dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        &&(nfa_dm_cb.disc_cb.excl_disc_entry.in_use == FALSE)  )
945dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
946dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        return;
947dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
948dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
949dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* get listen mode routing table for technology */
950dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_ee_get_tech_route (NFA_EE_PWR_STATE_ON, nfa_dm_cb.disc_cb.listen_RT);
951dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
952dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
953dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
954dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_set_rf_listen_mode_raw_config (&dm_disc_mask);
955dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        dm_disc_mask |= (nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask & NFA_DM_DISC_MASK_POLL);
956dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.excl_disc_entry.selected_disc_mask = dm_disc_mask;
957dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
958dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
959dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
960dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* Collect RF discovery request from sub-modules */
961dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
962dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
963dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_cb.disc_cb.entry[xx].in_use)
964dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
965dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                poll_mask = (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_POLL);
966dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
967dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* clear poll mode technolgies and protocols which are already used by others */
968dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                poll_mask &= ~(dm_disc_mask & NFA_DM_DISC_MASK_POLL);
969dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
970dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                listen_mask = 0;
971dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
972dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /*
973dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                ** add listen mode technolgies and protocols if host ID is matched to listen mode routing table
974dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                */
975dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
976dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* NFC-A */
977dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A])
978dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
979dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
980dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                   & ( NFA_DM_DISC_MASK_LA_T1T
981dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                      |NFA_DM_DISC_MASK_LA_T2T
982dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                      |NFA_DM_DISC_MASK_LA_ISO_DEP
983dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                      |NFA_DM_DISC_MASK_LA_NFC_DEP
984dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                      |NFA_DM_DISC_MASK_LAA_NFC_DEP );
985dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
986dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                else
987dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
988dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    /* host can listen ISO-DEP based on AID routing */
989dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask  & NFA_DM_DISC_MASK_LA_ISO_DEP);
990dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
991dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    /* host can listen NFC-DEP based on protocol routing */
992dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask  & NFA_DM_DISC_MASK_LA_NFC_DEP);
993dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask  & NFA_DM_DISC_MASK_LAA_NFC_DEP);
994dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
995dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
996dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* NFC-B */
997dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* multiple hosts can listen ISO-DEP based on AID routing */
998dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
999dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                               & NFA_DM_DISC_MASK_LB_ISO_DEP;
1000dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1001dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* NFC-F */
1002dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */
1003dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
1004dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                               & ( NFA_DM_DISC_MASK_LF_T3T
1005dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                  |NFA_DM_DISC_MASK_LF_NFC_DEP
1006dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                  |NFA_DM_DISC_MASK_LFA_NFC_DEP );
1007dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1008dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* NFC-B Prime */
1009dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP])
1010dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1011dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
1012dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                   & NFA_DM_DISC_MASK_L_B_PRIME;
1013dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1014dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1015dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /*
1016dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                ** clear listen mode technolgies and protocols which are already used by others
1017dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                */
1018dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1019dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* Check if other modules are listening T1T or T2T */
1020dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T))
1021dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1022dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    listen_mask &= ~( NFA_DM_DISC_MASK_LA_T1T
1023dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                     |NFA_DM_DISC_MASK_LA_T2T
1024dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                     |NFA_DM_DISC_MASK_LA_ISO_DEP
1025dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                     |NFA_DM_DISC_MASK_LA_NFC_DEP );
1026dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1027dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1028dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* T1T/T2T has priority on NFC-A */
1029dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (  (dm_disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LA_NFC_DEP))
1030dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    &&(listen_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T)))
1031dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1032dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    dm_disc_mask &= ~( NFA_DM_DISC_MASK_LA_ISO_DEP
1033dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                      |NFA_DM_DISC_MASK_LA_NFC_DEP );
1034dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1035dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1036dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* Don't remove ISO-DEP because multiple hosts can listen ISO-DEP based on AID routing */
1037dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1038dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* Check if other modules are listening NFC-DEP */
1039dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP))
1040dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1041dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    listen_mask &= ~( NFA_DM_DISC_MASK_LA_NFC_DEP
1042dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                     |NFA_DM_DISC_MASK_LAA_NFC_DEP );
1043dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1044dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1045dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask = poll_mask | listen_mask;
1046dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1047dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                NFA_TRACE_DEBUG2 ("nfa_dm_cb.disc_cb.entry[%d].selected_disc_mask = 0x%x",
1048dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                   xx, nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask);
1049dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1050dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                dm_disc_mask |= nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask;
1051dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1052dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1053dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1054dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* Let P2P set GEN bytes for LLCP to NFCC */
1055dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (dm_disc_mask & ( NFA_DM_DISC_MASK_PA_NFC_DEP
1056dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                            |NFA_DM_DISC_MASK_PF_NFC_DEP
1057dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                            |NFA_DM_DISC_MASK_LA_NFC_DEP
1058dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                            |NFA_DM_DISC_MASK_LF_NFC_DEP
1059dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                            |NFA_DM_DISC_MASK_PAA_NFC_DEP
1060dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                            |NFA_DM_DISC_MASK_PFA_NFC_DEP
1061dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                            |NFA_DM_DISC_MASK_LAA_NFC_DEP
1062dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                            |NFA_DM_DISC_MASK_LFA_NFC_DEP ))
1063dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1064dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_p2p_set_config (dm_disc_mask);
1065dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1066dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1067dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1068dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG1 ("dm_disc_mask = 0x%x", dm_disc_mask);
1069dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1070dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* Get Discovery Technology parameters */
1071dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    num_params = nfa_dm_get_rf_discover_config (dm_disc_mask, disc_params, NFA_DM_MAX_DISC_PARAMS);
1072dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1073dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (num_params)
1074dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1075dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /*
1076dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ** NFCC will abort programming personality slots if not available.
1077dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ** NFCC programs the personality slots in the following order of RF technologies:
1078dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        **      NFC-A, NFC-B, NFC-BP, NFC-I93
1079dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        */
1080dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1081dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* if this is not for exclusive control */
1082dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (!nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1083dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1084dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* update listening protocols in each NFC technology */
1085dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_set_rf_listen_mode_config (dm_disc_mask);
1086dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1087dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1088dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* Set polling duty cycle */
1089dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_set_total_duration ();
1090dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.dm_disc_mask = dm_disc_mask;
1091dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1092dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        NFC_DiscoveryStart (num_params, disc_params, nfa_dm_disc_discovery_cback);
1093dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* set flag about waiting for response in IDLE state */
1094dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1095dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1096dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* register callback to get interface error NTF */
1097dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        NFC_SetStaticRfCback (nfa_dm_disc_data_cback);
1098dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1099dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
1100dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1101dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* RF discovery is started but there is no valid technology or protocol to discover */
1102dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_disc_notify_started (NFA_STATUS_OK);
1103dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1104dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1105dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* if Kovio presence check timer is running, timeout callback will reset the activation information */
1106dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (  (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO)
1107dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ||(!nfa_dm_cb.disc_cb.kovio_tle.in_use)  )
1108dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1109dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* reset protocol and hanlde of activated sub-module */
1110dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1111dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_handle   = NFA_HANDLE_INVALID;
1112dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1113dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
1114dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1115dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
1116dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1117dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_notify_discovery
1118dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1119dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Send RF discovery notification to upper layer
1120dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1121dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          void
1122dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1123dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
1124dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data)
1125dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
1126dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_CONN_EVT_DATA conn_evt;
1127dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1128dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* let application select a device */
1129dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    conn_evt.disc_result.status = NFA_STATUS_OK;
1130dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    memcpy (&(conn_evt.disc_result.discovery_ntf),
1131dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            &(p_data->nfc_discover.result),
1132dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            sizeof (tNFC_RESULT_DEVT));
1133dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1134dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_conn_cback_event_notify (NFA_DISC_RESULT_EVT, &conn_evt);
1135dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
1136dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1137dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1138dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
1139dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1140dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_handle_kovio_activation
1141dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1142dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Handle Kovio activation; whether it's new or repeated activation
1143dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1144dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          TRUE if repeated activation. No need to notify activated event to upper layer
1145dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1146dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
1147dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew KaylorBOOLEAN nfa_dm_disc_handle_kovio_activation (tNFC_DISCOVER *p_data, tNFA_DISCOVER_CBACK *p_disc_cback)
1148dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
1149dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_DISCOVER disc_data;
1150dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1151dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
1152dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1153dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* if this is new Kovio bar code tag */
1154dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (  (nfa_dm_cb.activated_nfcid_len != p_data->activate.rf_tech_param.param.pk.uid_len)
1155dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            ||(memcmp (p_data->activate.rf_tech_param.param.pk.uid,
1156dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                       nfa_dm_cb.activated_nfcid, nfa_dm_cb.activated_nfcid_len)))
1157dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1158dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            NFA_TRACE_DEBUG0 ("new Kovio tag is detected");
1159dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1160dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* notify presence check failure for previous tag, if presence check is pending */
1161dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_disc_report_kovio_presence_check (NFA_STATUS_FAILED);
1162dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1163dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* notify deactivation of previous activation before notifying new activation */
1164dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (p_disc_cback)
1165dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1166dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1167dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                (*(p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1168dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1169dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1170dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* restart timer */
1171dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1172dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1173dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
1174dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1175dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* notify presence check ok, if presence check is pending */
1176dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_OK);
1177dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1178dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* restart timer and do not notify upper layer */
1179dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1180dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            return (TRUE);
1181dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1182dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1183dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
1184dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1185dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* this is the first activation, so start timer and notify upper layer */
1186dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.kovio_tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_kovio_timeout_cback;
1187dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1188dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1189dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1190dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return (FALSE);
1191dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
1192dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1193dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
1194dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1195dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_notify_activation
1196dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1197dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Send RF activation notification to sub-module
1198dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1199dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          NFA_STATUS_OK if success
1200dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1201dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
1202dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data)
1203dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
1204dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8   xx, host_id_in_LRT;
1205dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    UINT8   iso_dep_t3t__listen = NFA_DM_DISC_NUM_ENTRIES;
1206dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1207dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_RF_TECH_N_MODE tech_n_mode = p_data->activate.rf_tech_param.mode;
1208dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_PROTOCOL       protocol    = p_data->activate.protocol;
1209dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1210dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_DM_DISC_TECH_PROTO_MASK activated_disc_mask;
1211dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1212dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG2 ("nfa_dm_disc_notify_activation (): tech_n_mode:0x%X, proto:0x%X",
1213dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                       tech_n_mode, protocol);
1214dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1215dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1216dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1217dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_tech_mode    = tech_n_mode;
1218dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_rf_disc_id   = p_data->activate.rf_disc_id;
1219dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1220dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_protocol     = protocol;
1221dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_handle       = NFA_HANDLE_INVALID;
1222dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1223dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (protocol == NFC_PROTOCOL_KOVIO)
1224dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1225dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* check whether it's new or repeated activation */
1226dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))
1227dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1228dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* do not notify activation of Kovio to upper layer */
1229dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                return (NFA_STATUS_OK);
1230dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1231dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1232dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1233dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1234dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1235dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1236dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        return (NFA_STATUS_OK);
1237dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1238dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1239dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* if this is NFCEE direct RF interface, notify activation to whoever listening UICC */
1240dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (p_data->activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF)
1241dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1242dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
1243dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1244dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (  (nfa_dm_cb.disc_cb.entry[xx].in_use)
1245dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                &&(nfa_dm_cb.disc_cb.entry[xx].host_id != NFA_DM_DISC_HOST_ID_DH))
1246dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1247dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                nfa_dm_cb.disc_cb.activated_rf_disc_id   = p_data->activate.rf_disc_id;
1248dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1249dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                nfa_dm_cb.disc_cb.activated_protocol     = NFC_PROTOCOL_UNKNOWN;
1250dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                nfa_dm_cb.disc_cb.activated_handle       = xx;
1251dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1252dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                NFA_TRACE_DEBUG2 ("activated_rf_interface:0x%x, activated_handle: 0x%x",
1253dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                   nfa_dm_cb.disc_cb.activated_rf_interface,
1254dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                   nfa_dm_cb.disc_cb.activated_handle);
1255dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1256dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1257dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1258dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1259dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                return (NFA_STATUS_OK);
1260dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1261dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1262dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        return (NFA_STATUS_FAILED);
1263dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1264dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1265dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* get bit mask of technolgies/mode and protocol */
1266dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    activated_disc_mask = nfa_dm_disc_get_disc_mask (tech_n_mode, protocol);
1267dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1268dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* get host ID of technology from listen mode routing table */
1269dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A)
1270dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1271dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A];
1272dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1273dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B)
1274dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1275dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B];
1276dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1277dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F)
1278dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1279dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F];
1280dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1281dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME)
1282dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1283dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP];
1284dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1285dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else    /* DH only */
1286dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1287dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1288dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1289dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1290dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (protocol == NFC_PROTOCOL_NFC_DEP)
1291dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1292dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* Force NFC-DEP to the host */
1293dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1294dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1295dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1296dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
1297dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1298dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* if any matching NFC technology and protocol */
1299dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.disc_cb.entry[xx].in_use)
1300dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1301dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_cb.disc_cb.entry[xx].host_id == host_id_in_LRT)
1302dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1303dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & activated_disc_mask)
1304dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    break;
1305dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1306dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            else
1307dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1308dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* check ISO-DEP listening even if host in LRT is not matched */
1309dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (protocol == NFC_PROTOCOL_ISO_DEP)
1310dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1311dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    if (  (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A)
1312dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP))
1313dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    {
1314dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        iso_dep_t3t__listen = xx;
1315dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    }
1316dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    else if (  (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B)
1317dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                             &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP))
1318dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    {
1319dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        iso_dep_t3t__listen = xx;
1320dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    }
1321dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1322dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* check T3T listening even if host in LRT is not matched */
1323dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                else if (protocol == NFC_PROTOCOL_T3T)
1324dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1325dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    if (  (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F)
1326dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LF_T3T))
1327dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    {
1328dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        iso_dep_t3t__listen = xx;
1329dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    }
1330dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1331dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1332dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1333dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1334dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1335dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (xx >= NFA_DM_DISC_NUM_ENTRIES)
1336dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1337dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* if any ISO-DEP or T3T listening even if host in LRT is not matched */
1338dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        xx = iso_dep_t3t__listen;
1339dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1340dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1341dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (xx < NFA_DM_DISC_NUM_ENTRIES)
1342dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1343dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_tech_mode    = tech_n_mode;
1344dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_rf_disc_id   = p_data->activate.rf_disc_id;
1345dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1346dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_protocol     = protocol;
1347dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_handle       = xx;
1348dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1349dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        NFA_TRACE_DEBUG2 ("activated_protocol:0x%x, activated_handle: 0x%x",
1350dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                           nfa_dm_cb.disc_cb.activated_protocol,
1351dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                           nfa_dm_cb.disc_cb.activated_handle);
1352dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1353dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (protocol == NFC_PROTOCOL_KOVIO)
1354dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1355dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* check whether it's new or repeated activation */
1356dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))
1357dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1358dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* do not notify activation of Kovio to upper layer */
1359dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                return (NFA_STATUS_OK);
1360dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1361dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1362dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1363dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1364dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1365dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1366dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        return (NFA_STATUS_OK);
1367dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1368dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
1369dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1370dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1371dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        nfa_dm_cb.disc_cb.activated_handle   = NFA_HANDLE_INVALID;
1372dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        return (NFA_STATUS_FAILED);
1373dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1374dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
1375dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1376dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
1377dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1378dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_notify_deactivation
1379dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1380dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Send deactivation notification to sub-module
1381dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1382dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          None
1383dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1384dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
1385dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event,
1386dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                                             tNFC_DISCOVER *p_data)
1387dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
1388dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_HANDLE         xx;
1389dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFA_CONN_EVT_DATA  evt_data;
1390dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_DISCOVER       disc_data;
1391dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1392dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    NFA_TRACE_DEBUG1 ("nfa_dm_disc_notify_deactivation (): activated_handle=%d",
1393dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                       nfa_dm_cb.disc_cb.activated_handle);
1394dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1395dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING)
1396dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1397dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        NFA_TRACE_DEBUG0 ("nfa_dm_disc_notify_deactivation (): for sleep wakeup");
1398dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        return;
1399dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1400dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1401dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (sm_event == NFA_DM_RF_DEACTIVATE_RSP)
1402dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1403dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /*
1404dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ** Activation has been aborted by upper layer in NFA_DM_RFST_W4_ALL_DISCOVERIES or NFA_DM_RFST_W4_HOST_SELECT
1405dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ** Deactivation by upper layer or RF link loss in NFA_DM_RFST_LISTEN_SLEEP
1406dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        ** No sub-module is activated at this state.
1407dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        */
1408dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1409dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_SLEEP)
1410dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1411dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1412dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1413dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1414dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1415dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1416dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1417dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1418dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1419dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            else
1420dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1421dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* let each sub-module handle deactivation */
1422dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
1423dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1424dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    if (  (nfa_dm_cb.disc_cb.entry[xx].in_use)
1425dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LISTEN)  )
1426dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    {
1427dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1428dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                        (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
1429dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    }
1430dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1431dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1432dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1433dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else if (  (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING))
1434dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                 ||(nfa_dm_cb.disc_cb.deact_notify_pending)  )
1435dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1436dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            xx = nfa_dm_cb.disc_cb.activated_handle;
1437dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1438dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* notify event to activated module if failed while reactivation */
1439dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1440dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1441dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1442dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                {
1443dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1444dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1445dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                }
1446dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1447dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            else if (  (xx < NFA_DM_DISC_NUM_ENTRIES)
1448dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                     &&(nfa_dm_cb.disc_cb.entry[xx].in_use)
1449dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                     &&(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)  )
1450dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1451dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1452dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1453dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            else
1454dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1455dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* notify deactivation to application if there is no activated module */
1456dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1457dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
1458dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1459dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1460dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1461dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    else
1462dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1463dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)
1464dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1465dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
1466dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1467dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                /* restart timer and do not notify upper layer */
1468dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1469dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                return;
1470dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1471dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* Otherwise, upper layer initiated deactivation. */
1472dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1473dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1474dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* notify event to activated module */
1475dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1476dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1477dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1478dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1479dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
1480dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1481dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1482dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1483dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        else
1484dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1485dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            xx = nfa_dm_cb.disc_cb.activated_handle;
1486dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1487dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            if ((xx < NFA_DM_DISC_NUM_ENTRIES) && (nfa_dm_cb.disc_cb.entry[xx].in_use))
1488dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            {
1489dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1490dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor                    (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
1491dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            }
1492dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1493dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1494dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1495dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    /* clear activated information */
1496dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_cb.disc_cb.activated_tech_mode    = 0;
1497dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_cb.disc_cb.activated_rf_disc_id   = 0;
1498dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_cb.disc_cb.activated_rf_interface = 0;
1499dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_cb.disc_cb.activated_protocol     = NFA_PROTOCOL_INVALID;
1500dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_cb.disc_cb.activated_handle       = NFA_HANDLE_INVALID;
1501dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    nfa_dm_cb.disc_cb.deact_notify_pending   = FALSE;
1502dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
1503dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1504dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
1505dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1506dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_sleep_wakeup
1507dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1508dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      Put tag to sleep, then wake it up. Can be used Perform
1509dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                  legacy presence check or to wake up tag that went to HALT
1510dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                  state
1511dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1512dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          TRUE if operation started
1513dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1514dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
1515dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew KaylortNFC_STATUS nfa_dm_disc_sleep_wakeup (void)
1516dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
1517dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    tNFC_STATUS status = NFC_STATUS_FAILED;
1518dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1519dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
1520dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    {
1521dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        /* Deactivate to sleep mode */
1522dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_SLEEP);
1523dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        if (status == NFC_STATUS_OK)
1524dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        {
1525dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            /* deactivate to sleep is sent on behalf of sleep wakeup.
1526dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor             * set the sleep wakeup information in control block */
1527dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_cb.disc_cb.disc_flags    |= NFA_DM_DISC_FLAGS_CHECKING;
1528dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor            nfa_dm_cb.disc_cb.deact_pending = FALSE;
1529dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor        }
1530dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    }
1531dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1532dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return (status);
1533dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
1534dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1535dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
1536dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1537dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_is_p2p_paused
1538dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1539dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description      If NFA_PauseP2p is called sand still effective,
1540dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**                  this function returns TRUE.
1541dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1542dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns          TRUE if NFA_SendRawFrame is called
1543dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1544dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/
1545dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew KaylorBOOLEAN nfa_dm_is_p2p_paused (void)
1546dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{
1547dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor    return ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) ? TRUE : FALSE);
1548dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor}
1549dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor
1550dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/*******************************************************************************
1551dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor**
1552dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function         nfa_dm_disc_end_sleep_wakeup
1553**
1554** Description      Sleep Wakeup is complete
1555**
1556** Returns          None
1557**
1558*******************************************************************************/
1559static void nfa_dm_disc_end_sleep_wakeup (tNFC_STATUS status)
1560{
1561    if (  (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)
1562        &&(nfa_dm_cb.disc_cb.kovio_tle.in_use)  )
1563    {
1564        /* ignore it while doing Kovio presence check */
1565        return;
1566    }
1567
1568    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING)
1569    {
1570        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
1571
1572        /* notify RW module that sleep wakeup is finished */
1573        nfa_rw_handle_sleep_wakeup_rsp (status);
1574
1575        if (nfa_dm_cb.disc_cb.deact_pending)
1576        {
1577            nfa_dm_cb.disc_cb.deact_pending = FALSE;
1578            /* Perform pending deactivate command and on response notfiy deactivation */
1579            nfa_dm_cb.disc_cb.deact_notify_pending = TRUE;
1580            nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD,
1581                                   (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type);
1582        }
1583    }
1584}
1585
1586/*******************************************************************************
1587**
1588** Function         nfa_dm_disc_kovio_timeout_cback
1589**
1590** Description      Timeout for Kovio bar code tag presence check
1591**
1592** Returns          void
1593**
1594*******************************************************************************/
1595static void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle)
1596{
1597    tNFC_DEACTIVATE_DEVT deact;
1598
1599    NFA_TRACE_DEBUG0 ("nfa_dm_disc_kovio_timeout_cback()");
1600
1601    /* notify presence check failure, if presence check is pending */
1602    nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_FAILED);
1603
1604    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
1605    {
1606        /* restart timer in case that upper layer's presence check interval is too long */
1607        nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1608    }
1609    else
1610    {
1611        /* notify upper layer deactivated event */
1612        deact.status = NFC_STATUS_OK;
1613        deact.type   = NFC_DEACTIVATE_TYPE_DISCOVERY;
1614        deact.is_ntf = TRUE;
1615        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact);
1616    }
1617}
1618
1619/*******************************************************************************
1620**
1621** Function         nfa_dm_disc_start_kovio_presence_check
1622**
1623** Description      Deactivate to discovery mode and wait for activation
1624**
1625** Returns          TRUE if operation started
1626**
1627*******************************************************************************/
1628tNFC_STATUS nfa_dm_disc_start_kovio_presence_check (void)
1629{
1630    tNFC_STATUS status = NFC_STATUS_FAILED;
1631
1632    NFA_TRACE_DEBUG0 ("nfa_dm_disc_start_kovio_presence_check ()");
1633
1634    if (  (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)
1635        &&(nfa_dm_cb.disc_cb.kovio_tle.in_use)  )
1636    {
1637        if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
1638        {
1639            /* restart timer */
1640            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
1641
1642            /* Deactivate to discovery mode */
1643            status = nfa_dm_send_deactivate_cmd (NFC_DEACTIVATE_TYPE_DISCOVERY);
1644
1645            if (status == NFC_STATUS_OK)
1646            {
1647                /* deactivate to sleep is sent on behalf of sleep wakeup.
1648                 * set the sleep wakeup information in control block */
1649                nfa_dm_cb.disc_cb.disc_flags    |= NFA_DM_DISC_FLAGS_CHECKING;
1650                nfa_dm_cb.disc_cb.deact_pending = FALSE;
1651            }
1652        }
1653        else
1654        {
1655            /* wait for next activation */
1656            nfa_dm_cb.disc_cb.disc_flags    |= NFA_DM_DISC_FLAGS_CHECKING;
1657            nfa_dm_cb.disc_cb.deact_pending = FALSE;
1658            status = NFC_STATUS_OK;
1659        }
1660    }
1661
1662    return (status);
1663}
1664
1665/*******************************************************************************
1666**
1667** Function         nfa_dm_disc_report_kovio_presence_check
1668**
1669** Description      Report Kovio presence check status
1670**
1671** Returns          None
1672**
1673*******************************************************************************/
1674static void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status)
1675{
1676    NFA_TRACE_DEBUG0 ("nfa_dm_disc_report_kovio_presence_check ()");
1677
1678    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING)
1679    {
1680        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
1681
1682        /* notify RW module that sleep wakeup is finished */
1683        nfa_rw_handle_presence_check_rsp (status);
1684
1685        if (nfa_dm_cb.disc_cb.deact_pending)
1686        {
1687            nfa_dm_cb.disc_cb.deact_pending = FALSE;
1688            nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD,
1689                                   (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type);
1690        }
1691    }
1692}
1693
1694/*******************************************************************************
1695**
1696** Function         nfa_dm_disc_data_cback
1697**
1698** Description      Monitoring interface error through data callback
1699**
1700** Returns          void
1701**
1702*******************************************************************************/
1703static void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
1704{
1705    NFA_TRACE_DEBUG0 ("nfa_dm_disc_data_cback ()");
1706
1707    /* if selection failed */
1708    if (event == NFC_ERROR_CEVT)
1709    {
1710        nfa_dm_disc_sm_execute (NFA_DM_CORE_INTF_ERROR_NTF, NULL);
1711    }
1712    else if (event == NFC_DATA_CEVT)
1713    {
1714        GKI_freebuf (p_data->data.p_data);
1715    }
1716}
1717
1718/*******************************************************************************
1719**
1720** Function         nfa_dm_disc_new_state
1721**
1722** Description      Processing discovery events in NFA_DM_RFST_IDLE state
1723**
1724** Returns          void
1725**
1726*******************************************************************************/
1727void nfa_dm_disc_new_state (tNFA_DM_RF_DISC_STATE new_state)
1728{
1729    tNFA_CONN_EVT_DATA      evt_data;
1730    tNFA_DM_RF_DISC_STATE   old_state = nfa_dm_cb.disc_cb.disc_state;
1731
1732#if (BT_TRACE_VERBOSE == TRUE)
1733    NFA_TRACE_DEBUG5 ("nfa_dm_disc_new_state (): old_state: %s (%d), new_state: %s (%d) disc_flags: 0x%x",
1734                       nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state,
1735                       nfa_dm_disc_state_2_str (new_state), new_state, nfa_dm_cb.disc_cb.disc_flags);
1736#else
1737    NFA_TRACE_DEBUG3 ("nfa_dm_disc_new_state(): old_state: %d, new_state: %d disc_flags: 0x%x",
1738                       nfa_dm_cb.disc_cb.disc_state, new_state, nfa_dm_cb.disc_cb.disc_flags);
1739#endif
1740
1741    nfa_dm_cb.disc_cb.disc_state = new_state;
1742
1743    if (  (new_state == NFA_DM_RFST_IDLE)
1744        &&(!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))  ) /* not error recovering */
1745    {
1746        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)
1747        {
1748            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_STOPPING;
1749
1750            /* if exclusive RF control is stopping */
1751            if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)
1752            {
1753                if (old_state > NFA_DM_RFST_DISCOVERY)
1754                {
1755                    /* notify deactivation to application */
1756                    evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1757                    nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
1758                }
1759
1760                nfa_dm_rel_excl_rf_control_and_notify ();
1761            }
1762            else
1763            {
1764                evt_data.status = NFA_STATUS_OK;
1765                nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data);
1766            }
1767        }
1768        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_DISABLING)
1769        {
1770            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING;
1771            nfa_sys_check_disabled ();
1772        }
1773    }
1774}
1775
1776/*******************************************************************************
1777**
1778** Function         nfa_dm_disc_sm_idle
1779**
1780** Description      Processing discovery events in NFA_DM_RFST_IDLE state
1781**
1782** Returns          void
1783**
1784*******************************************************************************/
1785static void nfa_dm_disc_sm_idle (tNFA_DM_RF_DISC_SM_EVENT event,
1786                                 tNFA_DM_RF_DISC_DATA *p_data)
1787{
1788    UINT8              xx;
1789
1790    switch (event)
1791    {
1792    case NFA_DM_RF_DISCOVER_CMD:
1793        nfa_dm_start_rf_discover ();
1794        break;
1795
1796    case NFA_DM_RF_DISCOVER_RSP:
1797        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
1798
1799        if (p_data->nfc_discover.status == NFC_STATUS_OK)
1800        {
1801            nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
1802
1803            /* if RF discovery was stopped while waiting for response */
1804            if (nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_STOPPING|NFA_DM_DISC_FLAGS_DISABLING))
1805            {
1806                /* stop discovery */
1807                nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1808                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1809                break;
1810            }
1811
1812            if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1813            {
1814                if (nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)
1815                {
1816                    nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
1817
1818                    if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1819                        (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data);
1820                }
1821            }
1822            else
1823            {
1824                /* notify event to each module which is waiting for start */
1825                for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
1826                {
1827                    /* if registered module is waiting for starting discovery */
1828                    if (  (nfa_dm_cb.disc_cb.entry[xx].in_use)
1829                        &&(nfa_dm_cb.disc_cb.dm_disc_mask & nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask)
1830                        &&(nfa_dm_cb.disc_cb.entry[xx].disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)  )
1831                    {
1832                        nfa_dm_cb.disc_cb.entry[xx].disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
1833
1834                        if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1835                            (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data);
1836                    }
1837                }
1838
1839            }
1840            nfa_dm_disc_notify_started (p_data->nfc_discover.status);
1841        }
1842        else
1843        {
1844            /* in rare case that the discovery states of NFCC and DH mismatch and NFCC rejects Discover Cmd
1845             * deactivate idle and then start disvocery when got deactivate rsp */
1846            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1847            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1848        }
1849        break;
1850
1851    case NFA_DM_RF_DEACTIVATE_RSP:
1852        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
1853
1854        /* if NFCC goes to idle successfully */
1855        if (p_data->nfc_discover.status == NFC_STATUS_OK)
1856        {
1857            /* if DH forced to go idle while waiting for deactivation NTF */
1858            if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
1859            {
1860                nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
1861
1862                /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */
1863                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
1864                /* check if need to restart discovery after resync discovery state with NFCC */
1865                nfa_dm_start_rf_discover ();
1866            }
1867            /* Otherwise, deactivating when getting unexpected activation */
1868        }
1869        /* Otherwise, wait for deactivation NTF */
1870        break;
1871
1872    case NFA_DM_RF_DEACTIVATE_NTF:
1873        /* if NFCC sent this after NFCC had rejected deactivate CMD to idle while deactivating */
1874        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
1875        {
1876            if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)
1877            {
1878                /* stop discovery */
1879                nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1880                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1881            }
1882            else
1883            {
1884                nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
1885                /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */
1886                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
1887                /* check if need to restart discovery after resync discovery state with NFCC */
1888                nfa_dm_start_rf_discover ();
1889            }
1890        }
1891        /* Otherwise, deactivated when received unexpected activation in idle state */
1892        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
1893        break;
1894
1895    case NFA_DM_RF_INTF_ACTIVATED_NTF:
1896        /* unexpected activation, deactivate to idle */
1897        nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
1898        NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1899        break;
1900
1901    case NFA_DM_LP_LISTEN_CMD:
1902        nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN);
1903        break;
1904
1905    default:
1906        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_idle (): Unexpected discovery event");
1907        break;
1908    }
1909}
1910
1911/*******************************************************************************
1912**
1913** Function         nfa_dm_disc_sm_discovery
1914**
1915** Description      Processing discovery events in NFA_DM_RFST_DISCOVERY state
1916**
1917** Returns          void
1918**
1919*******************************************************************************/
1920static void nfa_dm_disc_sm_discovery (tNFA_DM_RF_DISC_SM_EVENT event,
1921                                      tNFA_DM_RF_DISC_DATA *p_data)
1922{
1923    switch (event)
1924    {
1925    case NFA_DM_RF_DEACTIVATE_CMD:
1926        /* if deactivate CMD was not sent to NFCC */
1927        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
1928        {
1929            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1930            NFC_Deactivate (p_data->deactivate_type);
1931        }
1932        break;
1933    case NFA_DM_RF_DEACTIVATE_RSP:
1934        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
1935
1936        /* if it's not race condition between deactivate CMD and activate NTF */
1937        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
1938        {
1939            /* do not notify deactivated to idle in RF discovery state
1940            ** because it is internal or stopping RF discovery
1941            */
1942
1943            /* there was no activation while waiting for deactivation RSP */
1944            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
1945            nfa_dm_start_rf_discover ();
1946        }
1947        break;
1948    case NFA_DM_RF_DISCOVER_NTF:
1949        nfa_dm_disc_new_state (NFA_DM_RFST_W4_ALL_DISCOVERIES);
1950        nfa_dm_notify_discovery (p_data);
1951        break;
1952    case NFA_DM_RF_INTF_ACTIVATED_NTF:
1953        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
1954        {
1955            NFA_TRACE_DEBUG0 ("RF Activated while waiting for deactivation RSP");
1956            /* it's race condition. DH has to wait for deactivation NTF */
1957            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_NTF;
1958        }
1959        else
1960        {
1961            if (p_data->nfc_discover.activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF)
1962            {
1963                nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE);
1964            }
1965            else if (p_data->nfc_discover.activate.rf_tech_param.mode & 0x80)
1966            {
1967                /* Listen mode */
1968                nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE);
1969            }
1970            else
1971            {
1972                /* Poll mode */
1973                nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE);
1974            }
1975
1976            if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
1977            {
1978                NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
1979
1980                /* after receiving deactivate event, restart discovery */
1981                nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
1982                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1983            }
1984        }
1985        break;
1986
1987    case NFA_DM_RF_DEACTIVATE_NTF:
1988        /* if there was race condition between deactivate CMD and activate NTF */
1989        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)
1990        {
1991            /* race condition is resolved */
1992            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
1993
1994            if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
1995            {
1996                /* do not notify deactivated to idle in RF discovery state
1997                ** because it is internal or stopping RF discovery
1998                */
1999
2000                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2001                nfa_dm_start_rf_discover ();
2002            }
2003        }
2004        break;
2005    case NFA_DM_LP_LISTEN_CMD:
2006        break;
2007    case NFA_DM_CORE_INTF_ERROR_NTF:
2008        break;
2009    default:
2010        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_discovery (): Unexpected discovery event");
2011        break;
2012    }
2013}
2014
2015/*******************************************************************************
2016**
2017** Function         nfa_dm_disc_sm_w4_all_discoveries
2018**
2019** Description      Processing discovery events in NFA_DM_RFST_W4_ALL_DISCOVERIES state
2020**
2021** Returns          void
2022**
2023*******************************************************************************/
2024static void nfa_dm_disc_sm_w4_all_discoveries (tNFA_DM_RF_DISC_SM_EVENT event,
2025                                               tNFA_DM_RF_DISC_DATA *p_data)
2026{
2027    switch (event)
2028    {
2029    case NFA_DM_RF_DEACTIVATE_CMD:
2030        /* if deactivate CMD was not sent to NFCC */
2031        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2032        {
2033            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2034            /* only IDLE mode is allowed */
2035            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2036        }
2037        break;
2038    case NFA_DM_RF_DEACTIVATE_RSP:
2039        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2040        /* notify exiting from w4 all discoverie state */
2041        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
2042
2043        nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2044        nfa_dm_start_rf_discover ();
2045        break;
2046    case NFA_DM_RF_DISCOVER_NTF:
2047        /* if deactivate CMD is already sent then ignore discover NTF */
2048        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2049        {
2050            /* Notification Type = NCI_DISCOVER_NTF_LAST or NCI_DISCOVER_NTF_LAST_ABORT */
2051            if (p_data->nfc_discover.result.more != NCI_DISCOVER_NTF_MORE)
2052            {
2053                nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT);
2054            }
2055            nfa_dm_notify_discovery (p_data);
2056        }
2057        break;
2058    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2059        /*
2060        ** This is only for ISO15693.
2061        ** FW sends activation NTF when all responses are received from tags without host selecting.
2062        */
2063        nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE);
2064
2065        if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
2066        {
2067            NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
2068
2069            /* after receiving deactivate event, restart discovery */
2070            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2071        }
2072        break;
2073    default:
2074        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_all_discoveries (): Unexpected discovery event");
2075        break;
2076    }
2077}
2078
2079/*******************************************************************************
2080**
2081** Function         nfa_dm_disc_sm_w4_host_select
2082**
2083** Description      Processing discovery events in NFA_DM_RFST_W4_HOST_SELECT state
2084**
2085** Returns          void
2086**
2087*******************************************************************************/
2088static void nfa_dm_disc_sm_w4_host_select (tNFA_DM_RF_DISC_SM_EVENT event,
2089                                           tNFA_DM_RF_DISC_DATA *p_data)
2090{
2091    tNFA_CONN_EVT_DATA conn_evt;
2092    tNFA_DM_DISC_FLAGS  old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2093    BOOLEAN             sleep_wakeup_event = FALSE;
2094    BOOLEAN             sleep_wakeup_event_processed = FALSE;
2095
2096    switch (event)
2097    {
2098    case NFA_DM_RF_DISCOVER_SELECT_CMD:
2099        /* if not waiting to deactivate */
2100        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2101        {
2102            NFC_DiscoverySelect (p_data->select.rf_disc_id,
2103                                 p_data->select.protocol,
2104                                 p_data->select.rf_interface);
2105        }
2106        else
2107        {
2108            nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, NFA_STATUS_FAILED);
2109        }
2110        break;
2111
2112    case NFA_DM_RF_DISCOVER_SELECT_RSP:
2113        sleep_wakeup_event = TRUE;
2114        /* notify application status of selection */
2115        if (p_data->nfc_discover.status == NFC_STATUS_OK)
2116        {
2117            sleep_wakeup_event_processed = TRUE;
2118            conn_evt.status = NFA_STATUS_OK;
2119            /* register callback to get interface error NTF */
2120            NFC_SetStaticRfCback (nfa_dm_disc_data_cback);
2121        }
2122        else
2123            conn_evt.status = NFA_STATUS_FAILED;
2124
2125        if (!old_sleep_wakeup_flag)
2126        {
2127            nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, p_data->nfc_discover.status);
2128        }
2129        break;
2130    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2131        nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE);
2132        if (old_sleep_wakeup_flag)
2133        {
2134            /* Handle sleep wakeup success: notify RW module of sleep wakeup of tag; if deactivation is pending then deactivate  */
2135            nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK);
2136        }
2137        else if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
2138        {
2139            NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
2140
2141            /* after receiving deactivate event, restart discovery */
2142            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2143        }
2144        break;
2145    case NFA_DM_RF_DEACTIVATE_CMD:
2146        if (old_sleep_wakeup_flag)
2147        {
2148            nfa_dm_cb.disc_cb.deact_pending      = TRUE;
2149            nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2150        }
2151        /* if deactivate CMD was not sent to NFCC */
2152        else if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2153        {
2154            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2155            /* only IDLE mode is allowed */
2156            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2157        }
2158        break;
2159    case NFA_DM_RF_DEACTIVATE_RSP:
2160        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2161        /* notify exiting from host select state */
2162        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
2163
2164        nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2165        nfa_dm_start_rf_discover ();
2166        break;
2167
2168    case NFA_DM_CORE_INTF_ERROR_NTF:
2169        sleep_wakeup_event    = TRUE;
2170        if (!old_sleep_wakeup_flag)
2171        {
2172            /* target activation failed, upper layer may deactivate or select again */
2173            conn_evt.status = NFA_STATUS_FAILED;
2174            nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt);
2175        }
2176        break;
2177    default:
2178        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_host_select (): Unexpected discovery event");
2179        break;
2180    }
2181
2182    if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed)
2183    {
2184        /* performing sleep wakeup and exception conditions happened
2185         * clear sleep wakeup information and report failure */
2186        nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED);
2187    }
2188}
2189
2190/*******************************************************************************
2191**
2192** Function         nfa_dm_disc_sm_poll_active
2193**
2194** Description      Processing discovery events in NFA_DM_RFST_POLL_ACTIVE state
2195**
2196** Returns          void
2197**
2198*******************************************************************************/
2199static void nfa_dm_disc_sm_poll_active (tNFA_DM_RF_DISC_SM_EVENT event,
2200                                        tNFA_DM_RF_DISC_DATA *p_data)
2201{
2202    tNFC_STATUS status;
2203    tNFA_DM_DISC_FLAGS  old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2204    BOOLEAN             sleep_wakeup_event = FALSE;
2205    BOOLEAN             sleep_wakeup_event_processed = FALSE;
2206    tNFC_DEACTIVATE_DEVT deact;
2207
2208    switch (event)
2209    {
2210    case NFA_DM_RF_DEACTIVATE_CMD:
2211        if (old_sleep_wakeup_flag)
2212        {
2213            /* sleep wakeup is already enabled when deactivate cmd is requested,
2214             * keep the information in control block to issue it later */
2215            nfa_dm_cb.disc_cb.deact_pending      = TRUE;
2216            nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2217        }
2218        else
2219        {
2220            status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2221        }
2222
2223        break;
2224    case NFA_DM_RF_DEACTIVATE_RSP:
2225        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2226        /* register callback to get interface error NTF */
2227        NFC_SetStaticRfCback (nfa_dm_disc_data_cback);
2228
2229        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
2230        {
2231            /* it's race condition. received deactivate NTF before receiving RSP */
2232
2233            deact.status = NFC_STATUS_OK;
2234            deact.type   = NFC_DEACTIVATE_TYPE_IDLE;
2235            deact.is_ntf = TRUE;
2236            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact);
2237
2238            /* NFCC is in IDLE state */
2239            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2240            nfa_dm_start_rf_discover ();
2241        }
2242        break;
2243    case NFA_DM_RF_DEACTIVATE_NTF:
2244        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
2245
2246        nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
2247
2248        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
2249        {
2250            /* it's race condition. received deactivate NTF before receiving RSP */
2251            /* notify deactivation after receiving deactivate RSP */
2252            NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP");
2253            break;
2254        }
2255
2256        sleep_wakeup_event    = TRUE;
2257
2258        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
2259
2260        if (  (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP)
2261            ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)  )
2262        {
2263            nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT);
2264            if (old_sleep_wakeup_flag)
2265            {
2266                sleep_wakeup_event_processed  = TRUE;
2267                /* process pending deactivate request */
2268                if (nfa_dm_cb.disc_cb.deact_pending)
2269                {
2270                    /* notify RW module that sleep wakeup is finished */
2271                    /* if deactivation is pending then deactivate  */
2272                    nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK);
2273
2274                    /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will not call this function */
2275                    nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, TRUE);
2276                }
2277                else
2278                {
2279                    /* Successfully went to sleep mode for sleep wakeup */
2280                    /* Now wake up the tag to complete the operation */
2281                    NFC_DiscoverySelect (nfa_dm_cb.disc_cb.activated_rf_disc_id,
2282                                         nfa_dm_cb.disc_cb.activated_protocol,
2283                                         nfa_dm_cb.disc_cb.activated_rf_interface);
2284                }
2285
2286            }
2287        }
2288        else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE)
2289        {
2290            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2291            nfa_dm_start_rf_discover ();
2292        }
2293        else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)
2294        {
2295            nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
2296            if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)
2297            {
2298                /* stop discovery */
2299                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2300            }
2301        }
2302        break;
2303
2304    case NFA_DM_CORE_INTF_ERROR_NTF:
2305        sleep_wakeup_event    = TRUE;
2306        if (  (!old_sleep_wakeup_flag)
2307            ||(!nfa_dm_cb.disc_cb.deact_pending)  )
2308        {
2309            nfa_dm_send_deactivate_cmd (NFA_DEACTIVATE_TYPE_DISCOVERY);
2310        }
2311        break;
2312
2313    default:
2314        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_poll_active (): Unexpected discovery event");
2315        break;
2316    }
2317
2318    if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed)
2319    {
2320        /* performing sleep wakeup and exception conditions happened
2321         * clear sleep wakeup information and report failure */
2322        nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED);
2323    }
2324}
2325
2326/*******************************************************************************
2327**
2328** Function         nfa_dm_disc_sm_listen_active
2329**
2330** Description      Processing discovery events in NFA_DM_RFST_LISTEN_ACTIVE state
2331**
2332** Returns          void
2333**
2334*******************************************************************************/
2335static void nfa_dm_disc_sm_listen_active (tNFA_DM_RF_DISC_SM_EVENT event,
2336                                          tNFA_DM_RF_DISC_DATA     *p_data)
2337{
2338    tNFC_DEACTIVATE_DEVT deact;
2339
2340    switch (event)
2341    {
2342    case NFA_DM_RF_DEACTIVATE_CMD:
2343        nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2344        break;
2345    case NFA_DM_RF_DEACTIVATE_RSP:
2346        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2347        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
2348        {
2349            /* it's race condition. received deactivate NTF before receiving RSP */
2350
2351            deact.status = NFC_STATUS_OK;
2352            deact.type   = NFC_DEACTIVATE_TYPE_IDLE;
2353            deact.is_ntf = TRUE;
2354            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact);
2355
2356            /* NFCC is in IDLE state */
2357            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2358            nfa_dm_start_rf_discover ();
2359        }
2360        break;
2361    case NFA_DM_RF_DEACTIVATE_NTF:
2362        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
2363
2364        nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
2365
2366        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
2367        {
2368            /* it's race condition. received deactivate NTF before receiving RSP */
2369            /* notify deactivation after receiving deactivate RSP */
2370            NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP");
2371        }
2372        else
2373        {
2374            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
2375
2376            if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE)
2377            {
2378                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2379                nfa_dm_start_rf_discover ();
2380            }
2381            else if (  (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP)
2382                     ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)  )
2383            {
2384                nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_SLEEP);
2385            }
2386            else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)
2387            {
2388                /* Discovery */
2389                nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
2390                if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)
2391                {
2392                    /* stop discovery */
2393                    NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2394                }
2395            }
2396        }
2397        break;
2398
2399    case NFA_DM_CORE_INTF_ERROR_NTF:
2400        break;
2401    default:
2402        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_active (): Unexpected discovery event");
2403        break;
2404    }
2405}
2406
2407/*******************************************************************************
2408**
2409** Function         nfa_dm_disc_sm_listen_sleep
2410**
2411** Description      Processing discovery events in NFA_DM_RFST_LISTEN_SLEEP state
2412**
2413** Returns          void
2414**
2415*******************************************************************************/
2416static void nfa_dm_disc_sm_listen_sleep (tNFA_DM_RF_DISC_SM_EVENT event,
2417                                         tNFA_DM_RF_DISC_DATA *p_data)
2418{
2419    switch (event)
2420    {
2421    case NFA_DM_RF_DEACTIVATE_CMD:
2422        nfa_dm_send_deactivate_cmd (p_data->deactivate_type);
2423
2424        /* if deactivate type is not discovery then NFCC will not sent deactivation NTF */
2425        if (p_data->deactivate_type != NFA_DEACTIVATE_TYPE_DISCOVERY)
2426        {
2427            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
2428            nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
2429        }
2430        break;
2431    case NFA_DM_RF_DEACTIVATE_RSP:
2432        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2433        /* if deactivate type in CMD was IDLE */
2434        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
2435        {
2436            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
2437
2438            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2439            nfa_dm_start_rf_discover ();
2440        }
2441        break;
2442    case NFA_DM_RF_DEACTIVATE_NTF:
2443        /* clear both W4_RSP and W4_NTF because of race condition between deactivat CMD and link loss */
2444        nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
2445        nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
2446
2447        /* there is no active protocol in this state, so broadcast to all by using NFA_DM_RF_DEACTIVATE_RSP */
2448        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
2449
2450        if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE)
2451        {
2452            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2453            nfa_dm_start_rf_discover ();
2454        }
2455        else if (p_data->nfc_discover.deactivate.type == NFA_DEACTIVATE_TYPE_DISCOVERY)
2456        {
2457            nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
2458        }
2459        else
2460        {
2461            NFA_TRACE_ERROR0 ("Unexpected deactivation type");
2462            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2463            nfa_dm_start_rf_discover ();
2464        }
2465        break;
2466    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2467        nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE);
2468        if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
2469        {
2470            NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
2471
2472            /* after receiving deactivate event, restart discovery */
2473            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2474        }
2475        break;
2476    default:
2477        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_sleep (): Unexpected discovery event");
2478        break;
2479    }
2480}
2481
2482/*******************************************************************************
2483**
2484** Function         nfa_dm_disc_sm_lp_listen
2485**
2486** Description      Processing discovery events in NFA_DM_RFST_LP_LISTEN state
2487**
2488** Returns          void
2489**
2490*******************************************************************************/
2491static void nfa_dm_disc_sm_lp_listen (tNFA_DM_RF_DISC_SM_EVENT event,
2492                                           tNFA_DM_RF_DISC_DATA *p_data)
2493{
2494    switch (event)
2495    {
2496    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2497        nfa_dm_disc_new_state (NFA_DM_RFST_LP_ACTIVE);
2498        nfa_dm_disc_notify_activation (&(p_data->nfc_discover));
2499        if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
2500        {
2501            NFA_TRACE_DEBUG0 ("Not matched, unexpected activation");
2502        }
2503        break;
2504
2505    default:
2506        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_listen (): Unexpected discovery event");
2507        break;
2508    }
2509}
2510
2511/*******************************************************************************
2512**
2513** Function         nfa_dm_disc_sm_lp_active
2514**
2515** Description      Processing discovery events in NFA_DM_RFST_LP_ACTIVE state
2516**
2517** Returns          void
2518**
2519*******************************************************************************/
2520static void nfa_dm_disc_sm_lp_active (tNFA_DM_RF_DISC_SM_EVENT event,
2521                                           tNFA_DM_RF_DISC_DATA *p_data)
2522{
2523    switch (event)
2524    {
2525    case NFA_DM_RF_DEACTIVATE_NTF:
2526        nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN);
2527        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
2528        break;
2529    default:
2530        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_active (): Unexpected discovery event");
2531        break;
2532    }
2533}
2534
2535/*******************************************************************************
2536**
2537** Function         nfa_dm_disc_sm_execute
2538**
2539** Description      Processing discovery related events
2540**
2541** Returns          void
2542**
2543*******************************************************************************/
2544void nfa_dm_disc_sm_execute (tNFA_DM_RF_DISC_SM_EVENT event, tNFA_DM_RF_DISC_DATA *p_data)
2545{
2546#if (BT_TRACE_VERBOSE == TRUE)
2547    NFA_TRACE_DEBUG5 ("nfa_dm_disc_sm_execute (): state: %s (%d), event: %s(%d) disc_flags: 0x%x",
2548                       nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state,
2549                       nfa_dm_disc_event_2_str (event), event, nfa_dm_cb.disc_cb.disc_flags);
2550#else
2551    NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute(): state: %d, event:%d disc_flags: 0x%x",
2552                       nfa_dm_cb.disc_cb.disc_state, event, nfa_dm_cb.disc_cb.disc_flags);
2553#endif
2554
2555    switch (nfa_dm_cb.disc_cb.disc_state)
2556    {
2557    /*  RF Discovery State - Idle */
2558    case NFA_DM_RFST_IDLE:
2559        nfa_dm_disc_sm_idle (event, p_data);
2560        break;
2561
2562    /* RF Discovery State - Discovery */
2563    case NFA_DM_RFST_DISCOVERY:
2564        nfa_dm_disc_sm_discovery (event, p_data);
2565        break;
2566
2567    /*RF Discovery State - Wait for all discoveries */
2568    case NFA_DM_RFST_W4_ALL_DISCOVERIES:
2569        nfa_dm_disc_sm_w4_all_discoveries (event, p_data);
2570        break;
2571
2572    /* RF Discovery State - Wait for host selection */
2573    case NFA_DM_RFST_W4_HOST_SELECT:
2574        nfa_dm_disc_sm_w4_host_select (event, p_data);
2575        break;
2576
2577    /* RF Discovery State - Poll mode activated */
2578    case NFA_DM_RFST_POLL_ACTIVE:
2579        nfa_dm_disc_sm_poll_active (event, p_data);
2580        break;
2581
2582    /* RF Discovery State - listen mode activated */
2583    case NFA_DM_RFST_LISTEN_ACTIVE:
2584        nfa_dm_disc_sm_listen_active (event, p_data);
2585        break;
2586
2587    /* RF Discovery State - listen mode sleep */
2588    case NFA_DM_RFST_LISTEN_SLEEP:
2589        nfa_dm_disc_sm_listen_sleep (event, p_data);
2590        break;
2591
2592    /* Listening in Low Power mode    */
2593    case NFA_DM_RFST_LP_LISTEN:
2594        nfa_dm_disc_sm_lp_listen (event, p_data);
2595        break;
2596
2597    /* Activated in Low Power mode    */
2598    case NFA_DM_RFST_LP_ACTIVE:
2599        nfa_dm_disc_sm_lp_active (event, p_data);
2600        break;
2601    }
2602#if (BT_TRACE_VERBOSE == TRUE)
2603    NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute (): new state: %s (%d), disc_flags: 0x%x",
2604                       nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state,
2605                       nfa_dm_cb.disc_cb.disc_flags);
2606#else
2607    NFA_TRACE_DEBUG2 ("nfa_dm_disc_sm_execute(): new state: %d,  disc_flags: 0x%x",
2608                       nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags);
2609#endif
2610}
2611
2612/*******************************************************************************
2613**
2614** Function         nfa_dm_add_rf_discover
2615**
2616** Description      Add discovery configuration and callback function
2617**
2618** Returns          valid handle if success
2619**
2620*******************************************************************************/
2621tNFA_HANDLE nfa_dm_add_rf_discover (tNFA_DM_DISC_TECH_PROTO_MASK disc_mask,
2622                                    tNFA_DM_DISC_HOST_ID         host_id,
2623                                    tNFA_DISCOVER_CBACK         *p_disc_cback)
2624{
2625    UINT8       xx;
2626
2627    NFA_TRACE_DEBUG1 ("nfa_dm_add_rf_discover () disc_mask=0x%x", disc_mask);
2628
2629    for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
2630    {
2631        if (!nfa_dm_cb.disc_cb.entry[xx].in_use)
2632        {
2633            nfa_dm_cb.disc_cb.entry[xx].in_use              = TRUE;
2634            nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask = disc_mask;
2635            nfa_dm_cb.disc_cb.entry[xx].host_id             = host_id;
2636            nfa_dm_cb.disc_cb.entry[xx].p_disc_cback        = p_disc_cback;
2637            nfa_dm_cb.disc_cb.entry[xx].disc_flags          = NFA_DM_DISC_FLAGS_NOTIFY;
2638            return xx;
2639        }
2640    }
2641
2642    return NFA_HANDLE_INVALID;
2643}
2644
2645/*******************************************************************************
2646**
2647** Function         nfa_dm_start_excl_discovery
2648**
2649** Description      Start exclusive RF discovery
2650**
2651** Returns          void
2652**
2653*******************************************************************************/
2654void nfa_dm_start_excl_discovery (tNFA_TECHNOLOGY_MASK poll_tech_mask,
2655                                  tNFA_LISTEN_CFG *p_listen_cfg,
2656                                  tNFA_DISCOVER_CBACK  *p_disc_cback)
2657{
2658    tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;
2659
2660    NFA_TRACE_DEBUG0 ("nfa_dm_start_excl_discovery ()");
2661
2662    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A)
2663    {
2664        poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T;
2665        poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T;
2666        poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP;
2667        poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP;
2668        poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY;
2669    }
2670    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE)
2671    {
2672        poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP;
2673    }
2674    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B)
2675    {
2676        poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP;
2677    }
2678    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F)
2679    {
2680        poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T;
2681        poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP;
2682    }
2683    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE)
2684    {
2685        poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP;
2686    }
2687    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ISO15693)
2688    {
2689        poll_disc_mask |= NFA_DM_DISC_MASK_P_ISO15693;
2690    }
2691    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME)
2692    {
2693        poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME;
2694    }
2695    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO)
2696    {
2697        poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO;
2698    }
2699
2700    nfa_dm_cb.disc_cb.excl_disc_entry.in_use              = TRUE;
2701    nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask = poll_disc_mask;
2702    nfa_dm_cb.disc_cb.excl_disc_entry.host_id             = NFA_DM_DISC_HOST_ID_DH;
2703    nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback        = p_disc_cback;
2704    nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags          = NFA_DM_DISC_FLAGS_NOTIFY;
2705
2706    memcpy (&nfa_dm_cb.disc_cb.excl_listen_config, p_listen_cfg, sizeof (tNFA_LISTEN_CFG));
2707
2708    nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_CMD, NULL);
2709}
2710
2711/*******************************************************************************
2712**
2713** Function         nfa_dm_stop_excl_discovery
2714**
2715** Description      Stop exclusive RF discovery
2716**
2717** Returns          void
2718**
2719*******************************************************************************/
2720void nfa_dm_stop_excl_discovery (void)
2721{
2722    NFA_TRACE_DEBUG0 ("nfa_dm_stop_excl_discovery ()");
2723
2724    nfa_dm_cb.disc_cb.excl_disc_entry.in_use       = FALSE;
2725    nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = NULL;
2726}
2727
2728/*******************************************************************************
2729**
2730** Function         nfa_dm_delete_rf_discover
2731**
2732** Description      Remove discovery configuration and callback function
2733**
2734** Returns          void
2735**
2736*******************************************************************************/
2737void nfa_dm_delete_rf_discover (tNFA_HANDLE handle)
2738{
2739    NFA_TRACE_DEBUG1 ("nfa_dm_delete_rf_discover () handle=0x%x", handle);
2740
2741    if (handle < NFA_DM_DISC_NUM_ENTRIES)
2742    {
2743        nfa_dm_cb.disc_cb.entry[handle].in_use = FALSE;
2744    }
2745    else
2746    {
2747        NFA_TRACE_ERROR0 ("Invalid discovery handle");
2748    }
2749}
2750
2751/*******************************************************************************
2752**
2753** Function         nfa_dm_rf_discover_select
2754**
2755** Description      Select target, protocol and RF interface
2756**
2757** Returns          void
2758**
2759*******************************************************************************/
2760void nfa_dm_rf_discover_select (UINT8             rf_disc_id,
2761                                       tNFA_NFC_PROTOCOL protocol,
2762                                       tNFA_INTF_TYPE    rf_interface)
2763{
2764    tNFA_DM_DISC_SELECT_PARAMS select_params;
2765    tNFA_CONN_EVT_DATA conn_evt;
2766
2767    NFA_TRACE_DEBUG3 ("nfa_dm_disc_select () rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
2768                       rf_disc_id, protocol, rf_interface);
2769
2770    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT)
2771    {
2772        /* state is OK: notify the status when the response is received from NFCC */
2773        select_params.rf_disc_id   = rf_disc_id;
2774        select_params.protocol     = protocol;
2775        select_params.rf_interface = rf_interface;
2776
2777        nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_NOTIFY;
2778        nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_SELECT_CMD, (tNFA_DM_RF_DISC_DATA *) &select_params);
2779    }
2780    else
2781    {
2782        /* Wrong state: notify failed status right away */
2783        conn_evt.status = NFA_STATUS_FAILED;
2784        nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt);
2785    }
2786}
2787
2788/*******************************************************************************
2789**
2790** Function         nfa_dm_rf_deactivate
2791**
2792** Description      Deactivate NFC link
2793**
2794** Returns          NFA_STATUS_OK if success
2795**
2796*******************************************************************************/
2797tNFA_STATUS nfa_dm_rf_deactivate (tNFA_DEACTIVATE_TYPE deactivate_type)
2798{
2799    NFA_TRACE_DEBUG1 ("nfa_dm_rf_deactivate () deactivate_type:0x%X", deactivate_type);
2800
2801    if (deactivate_type == NFA_DEACTIVATE_TYPE_SLEEP)
2802    {
2803        if (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP)
2804            deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP_AF;
2805        else
2806            deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP;
2807    }
2808
2809    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE)
2810    {
2811        return NFA_STATUS_FAILED;
2812    }
2813    else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY)
2814    {
2815        if (deactivate_type == NFA_DEACTIVATE_TYPE_DISCOVERY)
2816        {
2817            if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
2818            {
2819                nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle);
2820                nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle);
2821                return NFA_STATUS_OK;
2822            }
2823            else
2824            {
2825                /* it could be race condition. */
2826                NFA_TRACE_DEBUG0 ("nfa_dm_rf_deactivate (): already in discovery state");
2827                return NFA_STATUS_FAILED;
2828            }
2829        }
2830        else if (deactivate_type == NFA_DEACTIVATE_TYPE_IDLE)
2831        {
2832            if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
2833            {
2834                nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle);
2835                nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle);
2836            }
2837            nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type);
2838            return NFA_STATUS_OK;
2839        }
2840        else
2841        {
2842            return NFA_STATUS_FAILED;
2843        }
2844    }
2845    else
2846    {
2847        nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type);
2848        return NFA_STATUS_OK;
2849    }
2850}
2851
2852#if (BT_TRACE_VERBOSE == TRUE)
2853/*******************************************************************************
2854**
2855** Function         nfa_dm_disc_state_2_str
2856**
2857** Description      convert nfc discovery state to string
2858**
2859*******************************************************************************/
2860static char *nfa_dm_disc_state_2_str (UINT8 state)
2861{
2862    switch (state)
2863    {
2864    case NFA_DM_RFST_IDLE:
2865        return "IDLE";
2866
2867    case NFA_DM_RFST_DISCOVERY:
2868        return "DISCOVERY";
2869
2870    case NFA_DM_RFST_W4_ALL_DISCOVERIES:
2871        return "W4_ALL_DISCOVERIES";
2872
2873    case NFA_DM_RFST_W4_HOST_SELECT:
2874        return "W4_HOST_SELECT";
2875
2876    case NFA_DM_RFST_POLL_ACTIVE:
2877        return "POLL_ACTIVE";
2878
2879    case NFA_DM_RFST_LISTEN_ACTIVE:
2880        return "LISTEN_ACTIVE";
2881
2882    case NFA_DM_RFST_LISTEN_SLEEP:
2883        return "LISTEN_SLEEP";
2884
2885    case NFA_DM_RFST_LP_LISTEN:
2886        return "LP_LISTEN";
2887
2888    case NFA_DM_RFST_LP_ACTIVE:
2889        return "LP_ACTIVE";
2890    }
2891    return "Unknown";
2892}
2893
2894/*******************************************************************************
2895**
2896** Function         nfa_dm_disc_event_2_str
2897**
2898** Description      convert nfc discovery RSP/NTF to string
2899**
2900*******************************************************************************/
2901static char *nfa_dm_disc_event_2_str (UINT8 event)
2902{
2903    switch (event)
2904    {
2905    case NFA_DM_RF_DISCOVER_CMD:
2906        return "DISCOVER_CMD";
2907
2908    case NFA_DM_RF_DISCOVER_RSP:
2909        return "DISCOVER_RSP";
2910
2911    case NFA_DM_RF_DISCOVER_NTF:
2912        return "DISCOVER_NTF";
2913
2914    case NFA_DM_RF_DISCOVER_SELECT_CMD:
2915        return "SELECT_CMD";
2916
2917    case NFA_DM_RF_DISCOVER_SELECT_RSP:
2918        return "SELECT_RSP";
2919
2920    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2921        return "ACTIVATED_NTF";
2922
2923    case NFA_DM_RF_DEACTIVATE_CMD:
2924        return "DEACTIVATE_CMD";
2925
2926    case NFA_DM_RF_DEACTIVATE_RSP:
2927        return "DEACTIVATE_RSP";
2928
2929    case NFA_DM_RF_DEACTIVATE_NTF:
2930        return "DEACTIVATE_NTF";
2931
2932    case NFA_DM_LP_LISTEN_CMD:
2933        return "NFA_DM_LP_LISTEN_CMD";
2934
2935    case NFA_DM_CORE_INTF_ERROR_NTF:
2936        return "INTF_ERROR_NTF";
2937
2938    }
2939    return "Unknown";
2940}
2941#endif /* BT_TRACE_VERBOSE */
2942