1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the action functions for device manager discovery
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  function.
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_api.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_dm_int.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_p2p_int.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys_int.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE)
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_api.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_int.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_rw_int.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**  static functions
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                            tNFC_DISCOVER_PARAMS disc_params[],
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                            UINT8 max_params);
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask);
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask);
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode,
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                               tNFC_PROTOCOL       protocol);
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data);
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data);
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event, tNFC_DISCOVER *p_data);
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chustatic void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle);
547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chustatic void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status);
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *nfa_dm_disc_state_2_str (UINT8 state);
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *nfa_dm_disc_event_2_str (UINT8 event);
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_get_rf_discover_config
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Build RF discovery configurations from tNFA_DM_DISC_TECH_PROTO_MASK
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          number of RF discovery configurations
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask,
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                            tNFC_DISCOVER_PARAMS         disc_params[],
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                            UINT8 max_params)
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 num_params = 0;
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7767aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu    if (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED)
7867aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu    {
7967aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu        NFA_TRACE_DEBUG1 ("nfa_dm_get_rf_discover_config () listen disabled, rm listen from 0x%x", dm_disc_mask);
8067aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu        dm_disc_mask &= NFA_DM_DISC_MASK_POLL;
8167aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu    }
82a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if (nfa_dm_is_p2p_paused ())
83a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
84a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        dm_disc_mask &= ~NFA_DM_DISC_MASK_NFC_DEP;
85a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
8667aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling A */
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & ( NFA_DM_DISC_MASK_PA_T1T
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_PA_T2T
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_PA_ISO_DEP
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_PA_NFC_DEP
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_P_LEGACY) )
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_A;
9591ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pa;
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling B */
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_PB_ISO_DEP)
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_B;
10691ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pb;
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling F */
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & ( NFA_DM_DISC_MASK_PF_T3T
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_PF_NFC_DEP) )
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_F;
11891ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pf;
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling A Active mode  */
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_PAA_NFC_DEP)
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_A_ACTIVE;
12991ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->paa;
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling F Active mode  */
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_PFA_NFC_DEP)
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_F_ACTIVE;
14091ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pfa;
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check listening A */
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & ( NFA_DM_DISC_MASK_LA_T1T
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_LA_T2T
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_LA_ISO_DEP
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_LA_NFC_DEP) )
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_A;
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].frequency = 1;
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check listening B */
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_B;
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].frequency = 1;
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check listening F */
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & ( NFA_DM_DISC_MASK_LF_T3T
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        |NFA_DM_DISC_MASK_LF_NFC_DEP) )
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_F;
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].frequency = 1;
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check listening A Active mode */
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP)
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE;
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].frequency = 1;
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check listening F Active mode */
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_LFA_NFC_DEP)
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE;
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].frequency = 1;
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling ISO 15693 */
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_P_ISO15693)
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_ISO15693;
21091ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pi93;
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling B' */
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_P_B_PRIME)
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_B_PRIME;
22191ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pbp;
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check polling KOVIO */
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_P_KOVIO)
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_POLL_KOVIO;
23291ada91fa991b4df5372a19a2cf81f074b298712Evan Chu        disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pk;
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check listening ISO 15693 */
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_L_ISO15693)
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_ISO15693;
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].frequency = 1;
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check listening B' */
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dm_disc_mask & NFA_DM_DISC_MASK_L_B_PRIME)
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].type      = NFC_DISCOVERY_TYPE_LISTEN_B_PRIME;
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_params[num_params].frequency = 1;
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_params++;
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (num_params >= max_params)
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return num_params;
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return num_params;
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_set_rf_listen_mode_config
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Update listening protocol to NFCC
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_STATUS_OK if success
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask)
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 params[40], *p;
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 platform  = 0;
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 sens_info = 0;
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_config () tech_proto_mask = 0x%08X",
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       tech_proto_mask);
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** T1T listen     LA_PROT 0x80, LA_SENS_RES byte1:0x00 byte2:0x0C
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** T2T listen     LA_PROT 0x00
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** T3T listen     No bit for T3T in LF_PROT (CE T3T set listen parameters, system code, NFCID2, etc.)
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** ISO-DEP listen LA_PROT 0x01, LB_PROT 0x01
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** NFC-DEP listen LA_PROT 0x02, LF_PROT 0x02
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T1T)
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        platform = NCI_PARAM_PLATFORM_T1T;
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T2T)
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* platform = 0 and sens_info = 0 */
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (tech_proto_mask & NFA_DM_DISC_MASK_LA_ISO_DEP)
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            sens_info |= NCI_PARAM_SEL_INFO_ISODEP;
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (tech_proto_mask & NFA_DM_DISC_MASK_LA_NFC_DEP)
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            sens_info |= NCI_PARAM_SEL_INFO_NFCDEP;
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = params;
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** for Listen A
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    **
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Set ATQA 0x0C00 for T1T listen
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** If the ATQA values are 0x0000, then the FW will use 0x0400
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** which works for ISODEP, T2T and NFCDEP.
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
32067aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu    if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH)
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD);
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0x04);
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG);
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, platform);
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO);
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO);
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, sens_info);
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else /* Let NFCC use UICC configuration by configuring with length = 0 */
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD);
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG);
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO);
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1);
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY);
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* for Listen B */
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH)
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO);
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO);
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (tech_proto_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_ISO_DEP);
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT8_TO_STREAM (p,  0x00);
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else /* Let NFCC use UICC configuration by configuring with length = 0 */
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO);
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0);
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA);
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO);
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO);
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 0);
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* for Listen F */
3757c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */
3767c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL);
3777c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL);
378a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if ((tech_proto_mask & NFA_DM_DISC_MASK_LF_NFC_DEP) &&
379a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        !nfa_dm_is_p2p_paused() )
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
3817c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_NFC_DEP);
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
3857c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        UINT8_TO_STREAM (p, 0x00);
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p > params)
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFA_STATUS_OK;
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_set_total_duration
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Update total duration to NFCC
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_set_total_duration (void)
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 params[10], *p;
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_dm_set_total_duration ()");
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = params;
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* for total duration */
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, NFC_PMID_TOTAL_DURATION);
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_STREAM (p, NCI_PARAM_LEN_TOTAL_DURATION);
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_STREAM (p, nfa_dm_cb.disc_cb.disc_duration);
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p > params)
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_set_rf_listen_mode_raw_config
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set raw listen parameters
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask)
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = 0;
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_LISTEN_CFG  *p_cfg = &nfa_dm_cb.disc_cb.excl_listen_config;
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 params[250], *p, xx;
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_dm_set_rf_listen_mode_raw_config ()");
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Discovery Configuration Parameters for Listen A
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH)
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_cfg->la_enable)  )
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = params;
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD);
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD);
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->la_bit_frame_sdd);
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG);
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG);
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->la_platform_config);
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO);
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO);
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->la_sel_info);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_cfg->la_platform_config == NCI_PARAM_PLATFORM_T1T)
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask |= NFA_DM_DISC_MASK_LA_T1T;
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* If T4T or NFCDEP */
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_ISODEP)
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                disc_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP;
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_NFCDEP)
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                disc_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP;
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* If neither, T4T nor NFCDEP, then its T2T */
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (disc_mask == 0)
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                disc_mask |= NFA_DM_DISC_MASK_LA_T2T;
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1);
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->la_nfcid1_len);
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ARRAY_TO_STREAM (p, p_cfg->la_nfcid1, p_cfg->la_nfcid1_len);
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Discovery Configuration Parameters for Listen B
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH)
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_cfg->lb_enable)  )
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = params;
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO);
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO);
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->lb_sensb_info);
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0);
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->lb_nfcid0_len);
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ARRAY_TO_STREAM (p, p_cfg->lb_nfcid0, p_cfg->lb_nfcid0_len);
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA);
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_APPDATA);
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ARRAY_TO_STREAM (p, p_cfg->lb_app_data, NCI_PARAM_LEN_LB_APPDATA);
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_SFGI);
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 1);
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->lb_adc_fo);
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO);
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_ADC_FO);
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->lb_adc_fo);
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_cfg->lb_sensb_info & NCI_LISTEN_PROTOCOL_ISO_DEP)
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP;
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Discovery Configuration Parameters for Listen F
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F] == NFA_DM_DISC_HOST_ID_DH)
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_cfg->lf_enable)  )
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = params;
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LF_CON_BITR_F);
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 1);
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->lf_con_bitr_f);
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL);
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL);
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->lf_protocol_type);
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_FLAGS2);
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_T3T_FLAGS2);
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_STREAM(p, p_cfg->lf_t3t_flags);
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if the bit at position X is set to 0, SC/NFCID2 with index X shall be ignored */
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (xx = 0; xx < NFA_LF_MAX_SC_NFCID2; xx++)
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((p_cfg->lf_t3t_flags & (0x0001 << xx)) != 0x0000)
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_ID1 + xx);
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT8_TO_STREAM (p, NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ARRAY_TO_STREAM (p, p_cfg->lf_t3t_identifier[xx], NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN);
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p,  NFC_PMID_LF_T3T_PMM);
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p,  NCI_PARAM_LEN_LF_T3T_PMM);
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ARRAY_TO_STREAM (p,  p_cfg->lf_t3t_pmm, NCI_PARAM_LEN_LF_T3T_PMM);
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_cfg->lf_t3t_flags != NCI_LF_T3T_FLAGS2_ALL_DISABLED)
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask |= NFA_DM_DISC_MASK_LF_T3T;
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_cfg->lf_protocol_type & NCI_LISTEN_PROTOCOL_NFC_DEP)
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP;
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Discovery Configuration Parameters for Listen ISO-DEP
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LB_ISO_DEP))
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project      &&(p_cfg->li_enable))
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = params;
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_FWI);
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_FWI);
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->li_fwi);
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP)
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY);
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT8_TO_STREAM (p, p_cfg->la_hist_bytes_len);
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ARRAY_TO_STREAM (p, p_cfg->la_hist_bytes, p_cfg->la_hist_bytes_len);
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO);
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT8_TO_STREAM (p, p_cfg->lb_h_info_resp_len);
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ARRAY_TO_STREAM (p, p_cfg->lb_h_info_resp, p_cfg->lb_h_info_resp_len);
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Discovery Configuration Parameters for Listen NFC-DEP
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP|NFA_DM_DISC_MASK_LF_NFC_DEP))
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_cfg->ln_enable))
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = params;
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_WT);
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NCI_PARAM_LEN_WT);
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->ln_wt);
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_ATR_RES_GEN_BYTES);
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes_len);
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ARRAY_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes, p_cfg->ln_atr_res_gen_bytes_len);
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, NFC_PMID_ATR_RSP_CONFIG);
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, 1);
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_STREAM (p, p_cfg->ln_atr_res_config);
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE);
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_disc_mask = disc_mask;
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_raw_config () disc_mask = 0x%x", disc_mask);
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_get_disc_mask
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Convert RF technology, mode and protocol to bit mask
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFA_DM_DISC_TECH_PROTO_MASK
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode,
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                               tNFC_PROTOCOL       protocol)
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Set initial disc_mask to legacy poll or listen */
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = ((tech_n_mode & 0x80) ? NFA_DM_DISC_MASK_L_LEGACY : NFA_DM_DISC_MASK_P_LEGACY);
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (tech_n_mode)
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_A:
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (protocol)
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_T1T:
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_PA_T1T;
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_T2T:
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_PA_T2T;
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_ISO_DEP:
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_PA_ISO_DEP;
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_NFC_DEP:
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_PA_NFC_DEP;
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_B:
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (protocol == NFC_PROTOCOL_ISO_DEP)
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_PB_ISO_DEP;
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_F:
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (protocol == NFC_PROTOCOL_T3T)
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_PF_T3T;
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (protocol == NFC_PROTOCOL_NFC_DEP)
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_PF_NFC_DEP;
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_ISO15693:
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_P_ISO15693;
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_B_PRIME:
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_P_B_PRIME;
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_KOVIO:
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_P_KOVIO;
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE:
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_PAA_NFC_DEP;
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE:
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_PFA_NFC_DEP;
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_A:
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (protocol)
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_T1T:
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_LA_T1T;
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_T2T:
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_LA_T2T;
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_ISO_DEP:
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP;
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case NFC_PROTOCOL_NFC_DEP:
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_LA_NFC_DEP;
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_B:
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (protocol == NFC_PROTOCOL_ISO_DEP)
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_LB_ISO_DEP;
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_F:
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (protocol == NFC_PROTOCOL_T3T)
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_LF_T3T;
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (protocol == NFC_PROTOCOL_NFC_DEP)
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            disc_mask = NFA_DM_DISC_MASK_LF_NFC_DEP;
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_ISO15693:
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_L_ISO15693;
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME:
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_L_B_PRIME;
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE:
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_LAA_NFC_DEP;
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE:
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        disc_mask = NFA_DM_DISC_MASK_LFA_NFC_DEP;
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG3 ("nfa_dm_disc_get_disc_mask (): tech_n_mode:0x%X, protocol:0x%X, disc_mask:0x%X",
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       tech_n_mode, protocol, disc_mask);
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (disc_mask);
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_discovery_cback
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Discovery callback event from NFC
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_discovery_cback (tNFC_DISCOVER_EVT event, tNFC_DISCOVER *p_data)
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_RF_DISC_SM_EVENT dm_disc_event = NFA_DM_DISC_SM_MAX_EVENT;
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_dm_disc_discovery_cback (): event:0x%X", event);
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_START_DEVT:
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dm_disc_event = NFA_DM_RF_DISCOVER_RSP;
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_RESULT_DEVT:
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dm_disc_event = NFA_DM_RF_DISCOVER_NTF;
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_SELECT_DEVT:
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dm_disc_event = NFA_DM_RF_DISCOVER_SELECT_RSP;
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_ACTIVATE_DEVT:
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dm_disc_event = NFA_DM_RF_INTF_ACTIVATED_NTF;
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DEACTIVATE_DEVT:
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_data->deactivate.is_ntf)
769a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            dm_disc_event = NFA_DM_RF_DEACTIVATE_NTF;
771a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if ((p_data->deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) || (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY))
772a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            {
773a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                NFC_SetReassemblyFlag (TRUE);
774a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                nfa_dm_cb.flags &= ~NFA_DM_FLAGS_RAW_FRAME;
775a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            }
776a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            dm_disc_event = NFA_DM_RF_DEACTIVATE_RSP;
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("Unexpected event");
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_disc_sm_execute (dm_disc_event, (tNFA_DM_RF_DISC_DATA *) p_data);
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_notify_started
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Report NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT or
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFA_RF_DISCOVERY_STARTED_EVT, if needed
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_notify_started (tNFA_STATUS status)
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_CONN_EVT_DATA      evt_data;
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        evt_data.status = status;
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_conn_cback_event_notify (NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &evt_data);
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STARTED_EVT, &evt_data);
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_conn_event_notify
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Notify application of CONN_CBACK event, using appropriate
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  callback
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_disc_conn_event_notify (UINT8 event, tNFA_STATUS status)
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_CONN_EVT_DATA      evt_data;
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        evt_data.status               = status;
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Use exclusive RF mode callback */
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_dm_cb.p_excl_conn_cback)
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*nfa_dm_cb.p_excl_conn_cback) (event, &evt_data);
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*nfa_dm_cb.p_conn_cback) (event, &evt_data);
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
8495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfa_dm_disc_force_to_idle
8505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
8515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Force NFCC to idle state while waiting for deactivation NTF
8525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
8535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          tNFC_STATUS
8545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
8555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
8565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic tNFC_STATUS nfa_dm_disc_force_to_idle (void)
8575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
8585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
8595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
8605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFA_TRACE_DEBUG1 ("nfa_dm_disc_force_to_idle() disc_flags = 0x%x", nfa_dm_cb.disc_cb.disc_flags);
8615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
8625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) /* do not execute more than one */
8635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
8645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_NTF);
8655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP);
8665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
8675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        status = NFC_Deactivate (NFC_DEACTIVATE_TYPE_IDLE);
8685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
8695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
8705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    return (status);
8715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
8725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
8735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
8745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
8755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfa_dm_disc_deact_ntf_timeout_cback
8765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
8775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Timeout while waiting for deactivation NTF
8785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
8795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          void
8805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
8815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
8825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void nfa_dm_disc_deact_ntf_timeout_cback (TIMER_LIST_ENT *p_tle)
8835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
8845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFA_TRACE_ERROR0 ("nfa_dm_disc_deact_ntf_timeout_cback()");
8855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
8865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    nfa_dm_disc_force_to_idle();
8875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
8885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
8895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
8905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_send_deactivate_cmd
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send deactivate command to NFCC, if needed.
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK             - deactivate cmd is sent
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NCI_STATUS_FAILED         - no buffers
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_SEMANTIC_ERROR - this function does not attempt
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                                              to send deactivate cmd
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS nfa_dm_send_deactivate_cmd (tNFC_DEACT_TYPE deactivate_type)
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR;
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    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);
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!w4_flags)
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if deactivate CMD was not sent to NFCC */
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = NFC_Deactivate (deactivate_type);
9125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
9135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!nfa_dm_cb.disc_cb.tle.in_use)
9145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
9155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_cb.disc_cb.tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_deact_ntf_timeout_cback;
9165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.tle, 0, NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF);
9175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
9215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP)
9225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
9235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            status = NFC_STATUS_SEMANTIC_ERROR;
9245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
9255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if (nfa_dm_cb.disc_cb.tle.in_use)
9265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
9275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            status = NFC_STATUS_OK;
9285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
9295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
9305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
9315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            status = nfa_dm_disc_force_to_idle ();
9325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_start_rf_discover
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Start RF discovery
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_start_rf_discover (void)
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_DISCOVER_PARAMS    disc_params[NFA_DM_MAX_DISC_PARAMS];
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask = 0, poll_mask, listen_mask;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8                   num_params, xx;
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_dm_start_rf_discover ()");
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Make sure that RF discovery was enabled, or some app has exclusive control */
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED))
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(nfa_dm_cb.disc_cb.excl_disc_entry.in_use == FALSE)  )
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* get listen mode routing table for technology */
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_ee_get_tech_route (NFA_EE_PWR_STATE_ON, nfa_dm_cb.disc_cb.listen_RT);
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_set_rf_listen_mode_raw_config (&dm_disc_mask);
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dm_disc_mask |= (nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask & NFA_DM_DISC_MASK_POLL);
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.excl_disc_entry.selected_disc_mask = dm_disc_mask;
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Collect RF discovery request from sub-modules */
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_dm_cb.disc_cb.entry[xx].in_use)
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                poll_mask = (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_POLL);
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* clear poll mode technolgies and protocols which are already used by others */
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                poll_mask &= ~(dm_disc_mask & NFA_DM_DISC_MASK_POLL);
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                listen_mask = 0;
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /*
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ** add listen mode technolgies and protocols if host ID is matched to listen mode routing table
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                */
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* NFC-A */
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A])
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   & ( NFA_DM_DISC_MASK_LA_T1T
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      |NFA_DM_DISC_MASK_LA_T2T
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      |NFA_DM_DISC_MASK_LA_ISO_DEP
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      |NFA_DM_DISC_MASK_LA_NFC_DEP
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      |NFA_DM_DISC_MASK_LAA_NFC_DEP );
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* host can listen ISO-DEP based on AID routing */
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask  & NFA_DM_DISC_MASK_LA_ISO_DEP);
100285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
100385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu                    /* host can listen NFC-DEP based on protocol routing */
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask  & NFA_DM_DISC_MASK_LA_NFC_DEP);
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask  & NFA_DM_DISC_MASK_LAA_NFC_DEP);
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* NFC-B */
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* multiple hosts can listen ISO-DEP based on AID routing */
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               & NFA_DM_DISC_MASK_LB_ISO_DEP;
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* NFC-F */
10147c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */
10157c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
10167c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                               & ( NFA_DM_DISC_MASK_LF_T3T
10177c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                                  |NFA_DM_DISC_MASK_LF_NFC_DEP
10187c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                                  |NFA_DM_DISC_MASK_LFA_NFC_DEP );
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* NFC-B Prime */
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP])
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   & NFA_DM_DISC_MASK_L_B_PRIME;
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /*
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ** clear listen mode technolgies and protocols which are already used by others
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                */
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Check if other modules are listening T1T or T2T */
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T))
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    listen_mask &= ~( NFA_DM_DISC_MASK_LA_T1T
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                     |NFA_DM_DISC_MASK_LA_T2T
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                     |NFA_DM_DISC_MASK_LA_ISO_DEP
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                     |NFA_DM_DISC_MASK_LA_NFC_DEP );
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* T1T/T2T has priority on NFC-A */
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (dm_disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LA_NFC_DEP))
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    &&(listen_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T)))
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    dm_disc_mask &= ~( NFA_DM_DISC_MASK_LA_ISO_DEP
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      |NFA_DM_DISC_MASK_LA_NFC_DEP );
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Don't remove ISO-DEP because multiple hosts can listen ISO-DEP based on AID routing */
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Check if other modules are listening NFC-DEP */
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP))
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    listen_mask &= ~( NFA_DM_DISC_MASK_LA_NFC_DEP
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                     |NFA_DM_DISC_MASK_LAA_NFC_DEP );
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask = poll_mask | listen_mask;
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFA_TRACE_DEBUG2 ("nfa_dm_cb.disc_cb.entry[%d].selected_disc_mask = 0x%x",
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   xx, nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask);
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                dm_disc_mask |= nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask;
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Let P2P set GEN bytes for LLCP to NFCC */
1067a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (dm_disc_mask & NFA_DM_DISC_MASK_NFC_DEP)
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_p2p_set_config (dm_disc_mask);
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("dm_disc_mask = 0x%x", dm_disc_mask);
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Get Discovery Technology parameters */
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    num_params = nfa_dm_get_rf_discover_config (dm_disc_mask, disc_params, NFA_DM_MAX_DISC_PARAMS);
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (num_params)
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /*
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** NFCC will abort programming personality slots if not available.
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** NFCC programs the personality slots in the following order of RF technologies:
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        **      NFC-A, NFC-B, NFC-BP, NFC-I93
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        */
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if this is not for exclusive control */
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* update listening protocols in each NFC technology */
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_set_rf_listen_mode_config (dm_disc_mask);
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Set polling duty cycle */
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_set_total_duration ();
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.dm_disc_mask = dm_disc_mask;
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_DiscoveryStart (num_params, disc_params, nfa_dm_disc_discovery_cback);
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* set flag about waiting for response in IDLE state */
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* register callback to get interface error NTF */
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (nfa_dm_disc_data_cback);
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* RF discovery is started but there is no valid technology or protocol to discover */
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_notify_started (NFA_STATUS_OK);
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
11095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
11107c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    /* if Kovio presence check timer is running, timeout callback will reset the activation information */
11117c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    if (  (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO)
11127c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        ||(!nfa_dm_cb.disc_cb.kovio_tle.in_use)  )
11137c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
11147c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* reset protocol and hanlde of activated sub-module */
11157c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
11167c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_dm_cb.disc_cb.activated_handle   = NFA_HANDLE_INVALID;
11177c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_notify_discovery
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send RF discovery notification to upper layer
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data)
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_CONN_EVT_DATA conn_evt;
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* let application select a device */
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    conn_evt.disc_result.status = NFA_STATUS_OK;
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy (&(conn_evt.disc_result.discovery_ntf),
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &(p_data->nfc_discover.result),
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            sizeof (tNFC_RESULT_DEVT));
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_conn_cback_event_notify (NFA_DISC_RESULT_EVT, &conn_evt);
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11427c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11437c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu/*******************************************************************************
11447c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
11457c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Function         nfa_dm_disc_handle_kovio_activation
11467c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
11477c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Description      Handle Kovio activation; whether it's new or repeated activation
11487c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
11497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Returns          TRUE if repeated activation. No need to notify activated event to upper layer
11507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
11517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu*******************************************************************************/
11527c69b2723b60a59df4aaa58b13985b3483b291bfEvan ChuBOOLEAN nfa_dm_disc_handle_kovio_activation (tNFC_DISCOVER *p_data, tNFA_DISCOVER_CBACK *p_disc_cback)
11537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu{
11547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    tNFC_DISCOVER disc_data;
11557c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11567c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
11577c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
11587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* if this is new Kovio bar code tag */
11597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (  (nfa_dm_cb.activated_nfcid_len != p_data->activate.rf_tech_param.param.pk.uid_len)
11607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            ||(memcmp (p_data->activate.rf_tech_param.param.pk.uid,
11617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                       nfa_dm_cb.activated_nfcid, nfa_dm_cb.activated_nfcid_len)))
11627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
11637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            NFA_TRACE_DEBUG0 ("new Kovio tag is detected");
11647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* notify presence check failure for previous tag, if presence check is pending */
11667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_disc_report_kovio_presence_check (NFA_STATUS_FAILED);
11677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* notify deactivation of previous activation before notifying new activation */
11697c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (p_disc_cback)
11707c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
11717c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
11727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                (*(p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
11737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
11747c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11757c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* restart timer */
11767c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
11777c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
11787c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        else
11797c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
11807c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* notify presence check ok, if presence check is pending */
11817c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_OK);
11827c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11837c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* restart timer and do not notify upper layer */
11847c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
11857c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            return (TRUE);
11867c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
11877c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
11887c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    else
11897c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
11907c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* this is the first activation, so start timer and notify upper layer */
11917c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_dm_cb.disc_cb.kovio_tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_kovio_timeout_cback;
11927c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
11937c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
11947c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11957c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    return (FALSE);
11967c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu}
11977c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_notify_activation
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send RF activation notification to sub-module
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_STATUS_OK if success
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data)
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   xx, host_id_in_LRT;
1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   iso_dep_t3t__listen = NFA_DM_DISC_NUM_ENTRIES;
1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_RF_TECH_N_MODE tech_n_mode = p_data->activate.rf_tech_param.mode;
1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_PROTOCOL       protocol    = p_data->activate.protocol;
1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_DISC_TECH_PROTO_MASK activated_disc_mask;
1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG2 ("nfa_dm_disc_notify_activation (): tech_n_mode:0x%X, proto:0x%X",
1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       tech_n_mode, protocol);
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_tech_mode    = tech_n_mode;
1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_rf_disc_id   = p_data->activate.rf_disc_id;
1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_protocol     = protocol;
1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_handle       = NFA_HANDLE_INVALID;
1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12287c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (protocol == NFC_PROTOCOL_KOVIO)
12297c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
12307c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* check whether it's new or repeated activation */
12317c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback))
12327c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
12337c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                /* do not notify activation of Kovio to upper layer */
12347c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                return (NFA_STATUS_OK);
12357c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
12367c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
12377c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFA_STATUS_OK);
1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if this is NFCEE direct RF interface, notify activation to whoever listening UICC */
1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_data->activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF)
1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (nfa_dm_cb.disc_cb.entry[xx].in_use)
1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(nfa_dm_cb.disc_cb.entry[xx].host_id != NFA_DM_DISC_HOST_ID_DH))
1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_cb.disc_cb.activated_rf_disc_id   = p_data->activate.rf_disc_id;
1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_cb.disc_cb.activated_protocol     = NFC_PROTOCOL_UNKNOWN;
1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_cb.disc_cb.activated_handle       = xx;
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFA_TRACE_DEBUG2 ("activated_rf_interface:0x%x, activated_handle: 0x%x",
1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   nfa_dm_cb.disc_cb.activated_rf_interface,
1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   nfa_dm_cb.disc_cb.activated_handle);
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return (NFA_STATUS_OK);
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFA_STATUS_FAILED);
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* get bit mask of technolgies/mode and protocol */
1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    activated_disc_mask = nfa_dm_disc_get_disc_mask (tech_n_mode, protocol);
1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* get host ID of technology from listen mode routing table */
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A)
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A];
1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B)
1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B];
1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F)
1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F];
1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME)
1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP];
1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else    /* DH only */
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
129585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    if (protocol == NFC_PROTOCOL_NFC_DEP)
129685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    {
129785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu        /* Force NFC-DEP to the host */
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH;
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if any matching NFC technology and protocol */
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.disc_cb.entry[xx].in_use)
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_dm_cb.disc_cb.entry[xx].host_id == host_id_in_LRT)
1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & activated_disc_mask)
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* check ISO-DEP listening even if host in LRT is not matched */
1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (protocol == NFC_PROTOCOL_ISO_DEP)
1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (  (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A)
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP))
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        iso_dep_t3t__listen = xx;
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else if (  (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B)
1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP))
1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        iso_dep_t3t__listen = xx;
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* check T3T listening even if host in LRT is not matched */
1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (protocol == NFC_PROTOCOL_T3T)
1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (  (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F)
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LF_T3T))
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        iso_dep_t3t__listen = xx;
1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx >= NFA_DM_DISC_NUM_ENTRIES)
1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if any ISO-DEP or T3T listening even if host in LRT is not matched */
1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        xx = iso_dep_t3t__listen;
1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx < NFA_DM_DISC_NUM_ENTRIES)
1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_tech_mode    = tech_n_mode;
1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_rf_disc_id   = p_data->activate.rf_disc_id;
1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type;
1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_protocol     = protocol;
1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_handle       = xx;
1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_DEBUG2 ("activated_protocol:0x%x, activated_handle: 0x%x",
1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           nfa_dm_cb.disc_cb.activated_protocol,
1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           nfa_dm_cb.disc_cb.activated_handle);
1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (protocol == NFC_PROTOCOL_KOVIO)
13597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
13607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* check whether it's new or repeated activation */
13617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.entry[xx].p_disc_cback))
13627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
13637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                /* do not notify activation of Kovio to upper layer */
13647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                return (NFA_STATUS_OK);
13657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
13667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
13677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data);
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFA_STATUS_OK);
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID;
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.activated_handle   = NFA_HANDLE_INVALID;
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFA_STATUS_FAILED);
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_notify_deactivation
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send deactivation notification to sub-module
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event,
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                             tNFC_DISCOVER *p_data)
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_HANDLE         xx;
13945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNFA_CONN_EVT_DATA  evt_data;
13955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNFC_DISCOVER       disc_data;
1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_dm_disc_notify_deactivation (): activated_handle=%d",
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_cb.disc_cb.activated_handle);
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING)
1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1402c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        NFA_TRACE_DEBUG0 ("nfa_dm_disc_notify_deactivation (): for sleep wakeup");
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (sm_event == NFA_DM_RF_DEACTIVATE_RSP)
1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /*
14095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ** Activation has been aborted by upper layer in NFA_DM_RFST_W4_ALL_DISCOVERIES or NFA_DM_RFST_W4_HOST_SELECT
14105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ** Deactivation by upper layer or RF link loss in NFA_DM_RFST_LISTEN_SLEEP
14115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ** No sub-module is activated at this state.
1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        */
1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_SLEEP)
14155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
14165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
14175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
14185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
14195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
14205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
14215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
14225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
14235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
14245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else
14255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
14265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* let each sub-module handle deactivation */
14275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
14285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
14295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    if (  (nfa_dm_cb.disc_cb.entry[xx].in_use)
14305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                        &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LISTEN)  )
14315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    {
14325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                        disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
14335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                        (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data);
14345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    }
14355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
14365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
14375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
1438df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu        else if (  (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING))
1439df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu                 ||(nfa_dm_cb.disc_cb.deact_notify_pending)  )
14405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
14417c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            xx = nfa_dm_cb.disc_cb.activated_handle;
14427c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
14437c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* notify event to activated module if failed while reactivation */
14447c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
14457c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
14467c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
14477c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                {
14487c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                    disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
14497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                    (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
14507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                }
14517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
14527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            else if (  (xx < NFA_DM_DISC_NUM_ENTRIES)
14537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                     &&(nfa_dm_cb.disc_cb.entry[xx].in_use)
14547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                     &&(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)  )
14557c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
14567c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
14577c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
14587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            else
14597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
14607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                /* notify deactivation to application if there is no activated module */
14617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
14627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
14637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
14645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
14687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)
14697c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
14707c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
14717c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
14727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                /* restart timer and do not notify upper layer */
14737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
14747c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                return;
14757c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
14767c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* Otherwise, upper layer initiated deactivation. */
14777c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
14787c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* notify event to activated module */
14805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
14825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
14835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
14845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE;
14855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
14865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
14885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
14905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            xx = nfa_dm_cb.disc_cb.activated_handle;
14915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
14925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if ((xx < NFA_DM_DISC_NUM_ENTRIES) && (nfa_dm_cb.disc_cb.entry[xx].in_use))
14935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
14945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
14955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data);
14965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* clear activated information */
1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.activated_tech_mode    = 0;
1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.activated_rf_disc_id   = 0;
1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.activated_rf_interface = 0;
1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.activated_protocol     = NFA_PROTOCOL_INVALID;
15055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    nfa_dm_cb.disc_cb.activated_handle       = NFA_HANDLE_INVALID;
1506df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu    nfa_dm_cb.disc_cb.deact_notify_pending   = FALSE;
1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1511c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu** Function         nfa_dm_disc_sleep_wakeup
1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1513c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu** Description      Put tag to sleep, then wake it up. Can be used Perform
1514c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu**                  legacy presence check or to wake up tag that went to HALT
1515c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu**                  state
1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if operation started
1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1520c95c79ccb65d82a65b960919077d5c359cf28cedEvan ChutNFC_STATUS nfa_dm_disc_sleep_wakeup (void)
1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status = NFC_STATUS_FAILED;
1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Deactivate to sleep mode */
1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_SLEEP);
1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status == NFC_STATUS_OK)
1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1530c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu            /* deactivate to sleep is sent on behalf of sleep wakeup.
1531c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu             * set the sleep wakeup information in control block */
15327c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.disc_flags    |= NFA_DM_DISC_FLAGS_CHECKING;
15337c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.deact_pending = FALSE;
1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (status);
1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1542a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function         nfa_dm_is_raw_frame_session
1543a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
1544a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description      If NFA_SendRawFrame is called since RF activation,
1545a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**                  this function returns TRUE.
1546a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
1547a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns          TRUE if NFA_SendRawFrame is called
1548a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
1549a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/
1550a24be4f06674b2707b57904deaa0dff5a95823bdEvan ChuBOOLEAN nfa_dm_is_raw_frame_session (void)
1551a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu{
1552a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    return ((nfa_dm_cb.flags & NFA_DM_FLAGS_RAW_FRAME) ? TRUE : FALSE);
1553a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu}
1554a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
1555a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/*******************************************************************************
1556a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
155767aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu** Function         nfa_dm_is_p2p_paused
155867aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu**
155967aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu** Description      If NFA_PauseP2p is called sand still effective,
156067aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu**                  this function returns TRUE.
156167aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu**
156267aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu** Returns          TRUE if NFA_SendRawFrame is called
156367aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu**
156467aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu*******************************************************************************/
156567aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan ChuBOOLEAN nfa_dm_is_p2p_paused (void)
156667aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu{
156767aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu    return ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) ? TRUE : FALSE);
156867aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu}
156967aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu
157067aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu/*******************************************************************************
157167aef6c6c6f6bc7b8364b97949e874b9dc7175bcEvan Chu**
1572c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu** Function         nfa_dm_disc_end_sleep_wakeup
1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1574c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu** Description      Sleep Wakeup is complete
1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1576c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu** Returns          None
1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1579c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chustatic void nfa_dm_disc_end_sleep_wakeup (tNFC_STATUS status)
1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
15817c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    if (  (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)
15827c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        &&(nfa_dm_cb.disc_cb.kovio_tle.in_use)  )
15837c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
15847c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* ignore it while doing Kovio presence check */
15857c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        return;
15867c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
15877c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING)
1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
15905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
15915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1592c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        /* notify RW module that sleep wakeup is finished */
1593c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        nfa_rw_handle_sleep_wakeup_rsp (status);
15945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
15957c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (nfa_dm_cb.disc_cb.deact_pending)
1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
15977c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.deact_pending = FALSE;
1598df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu            /* Perform pending deactivate command and on response notfiy deactivation */
1599df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu            nfa_dm_cb.disc_cb.deact_notify_pending = TRUE;
1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD,
16017c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                                   (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type);
16027c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
16037c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
16047c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu}
16057c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16067c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu/*******************************************************************************
16077c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16087c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Function         nfa_dm_disc_kovio_timeout_cback
16097c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16107c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Description      Timeout for Kovio bar code tag presence check
16117c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16127c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Returns          void
16137c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16147c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu*******************************************************************************/
16157c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chustatic void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle)
16167c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu{
16177c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    tNFC_DEACTIVATE_DEVT deact;
16187c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16197c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    NFA_TRACE_DEBUG0 ("nfa_dm_disc_kovio_timeout_cback()");
16207c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16217c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    /* notify presence check failure, if presence check is pending */
16227c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_FAILED);
16237c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16247c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
16257c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
16267c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* restart timer in case that upper layer's presence check interval is too long */
16277c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
16287c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
16297c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    else
16307c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
16317c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* notify upper layer deactivated event */
16327c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        deact.status = NFC_STATUS_OK;
16337c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        deact.type   = NFC_DEACTIVATE_TYPE_DISCOVERY;
16347c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        deact.is_ntf = TRUE;
16357c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact);
16367c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
16377c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu}
16387c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16397c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu/*******************************************************************************
16407c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16417c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Function         nfa_dm_disc_start_kovio_presence_check
16427c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16437c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Description      Deactivate to discovery mode and wait for activation
16447c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16457c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Returns          TRUE if operation started
16467c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16477c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu*******************************************************************************/
16487c69b2723b60a59df4aaa58b13985b3483b291bfEvan ChutNFC_STATUS nfa_dm_disc_start_kovio_presence_check (void)
16497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu{
16507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    tNFC_STATUS status = NFC_STATUS_FAILED;
16517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    NFA_TRACE_DEBUG0 ("nfa_dm_disc_start_kovio_presence_check ()");
16537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    if (  (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO)
16557c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        &&(nfa_dm_cb.disc_cb.kovio_tle.in_use)  )
16567c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
16577c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE)
16587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
16597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* restart timer */
16607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK);
16617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* Deactivate to discovery mode */
16637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            status = nfa_dm_send_deactivate_cmd (NFC_DEACTIVATE_TYPE_DISCOVERY);
16647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (status == NFC_STATUS_OK)
16667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
16677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                /* deactivate to sleep is sent on behalf of sleep wakeup.
16687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                 * set the sleep wakeup information in control block */
16697c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_dm_cb.disc_cb.disc_flags    |= NFA_DM_DISC_FLAGS_CHECKING;
16707c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_dm_cb.disc_cb.deact_pending = FALSE;
16717c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
16727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
16737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        else
16747c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
16757c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            /* wait for next activation */
16767c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.disc_flags    |= NFA_DM_DISC_FLAGS_CHECKING;
16777c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.deact_pending = FALSE;
16787c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            status = NFC_STATUS_OK;
16797c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
16807c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
16817c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16827c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    return (status);
16837c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu}
16847c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16857c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu/*******************************************************************************
16867c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16877c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Function         nfa_dm_disc_report_kovio_presence_check
16887c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16897c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Description      Report Kovio presence check status
16907c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16917c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Returns          None
16927c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu**
16937c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu*******************************************************************************/
16947c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chustatic void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status)
16957c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu{
16967c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    NFA_TRACE_DEBUG0 ("nfa_dm_disc_report_kovio_presence_check ()");
16977c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
16987c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING)
16997c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
17007c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING;
17017c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
17027c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        /* notify RW module that sleep wakeup is finished */
17037c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        nfa_rw_handle_presence_check_rsp (status);
17047c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
17057c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (nfa_dm_cb.disc_cb.deact_pending)
17067c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
17077c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.deact_pending = FALSE;
17087c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD,
17097c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                                   (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type);
1710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_data_cback
1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Monitoring interface error through data callback
1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
1724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_dm_disc_data_cback ()");
1726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if selection failed */
1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event == NFC_ERROR_CEVT)
1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_execute (NFA_DM_CORE_INTF_ERROR_NTF, NULL);
1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (event == NFC_DATA_CEVT)
1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_data->data.p_data);
1735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_new_state
1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_IDLE state
1743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_disc_new_state (tNFA_DM_RF_DISC_STATE new_state)
1748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_CONN_EVT_DATA      evt_data;
1750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_RF_DISC_STATE   old_state = nfa_dm_cb.disc_cb.disc_state;
1751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG5 ("nfa_dm_disc_new_state (): old_state: %s (%d), new_state: %s (%d) disc_flags: 0x%x",
1754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state,
1755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_disc_state_2_str (new_state), new_state, nfa_dm_cb.disc_cb.disc_flags);
1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG3 ("nfa_dm_disc_new_state(): old_state: %d, new_state: %d disc_flags: 0x%x",
1758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_cb.disc_cb.disc_state, new_state, nfa_dm_cb.disc_cb.disc_flags);
1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
17607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.disc_state = new_state;
17627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
17635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (  (new_state == NFA_DM_RFST_IDLE)
17645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        &&(!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))  ) /* not error recovering */
1765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)
1767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_STOPPING;
1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if exclusive RF control is stopping */
1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE)
1772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (old_state > NFA_DM_RFST_DISCOVERY)
1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* notify deactivation to application */
1776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
1778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_rel_excl_rf_control_and_notify ();
1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                evt_data.status = NFA_STATUS_OK;
1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data);
1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_DISABLING)
1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING;
1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_sys_check_disabled ();
1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_idle
1799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_IDLE state
1801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_idle (tNFA_DM_RF_DISC_SM_EVENT event,
1806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 tNFA_DM_RF_DISC_DATA *p_data)
1807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8              xx;
1809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
1811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_CMD:
1813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_start_rf_discover ();
1814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_RSP:
1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_data->nfc_discover.status == NFC_STATUS_OK)
1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if RF discovery was stopped while waiting for response */
1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_STOPPING|NFA_DM_DISC_FLAGS_DISABLING))
1825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* stop discovery */
1827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use)
1833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)
1835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
1837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)
1839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data);
1840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* notify event to each module which is waiting for start */
1845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
1846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* if registered module is waiting for starting discovery */
1848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (  (nfa_dm_cb.disc_cb.entry[xx].in_use)
1849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        &&(nfa_dm_cb.disc_cb.dm_disc_mask & nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask)
1850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        &&(nfa_dm_cb.disc_cb.entry[xx].disc_flags & NFA_DM_DISC_FLAGS_NOTIFY)  )
1851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        nfa_dm_cb.disc_cb.entry[xx].disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY;
1853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)
1855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data);
1856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_notify_started (p_data->nfc_discover.status);
1861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* in rare case that the discovery states of NFCC and DH mismatch and NFCC rejects Discover Cmd
1865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * deactivate idle and then start disvocery when got deactivate rsp */
1866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
1872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
18735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
18745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if NFCC goes to idle successfully */
18755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (p_data->nfc_discover.status == NFC_STATUS_OK)
1876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
18775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* if DH forced to go idle while waiting for deactivation NTF */
18785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
18795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
18805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
18815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
18825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */
18835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
18845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* check if need to restart discovery after resync discovery state with NFCC */
18855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_start_rf_discover ();
18865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
18875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* Otherwise, deactivating when getting unexpected activation */
1888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
18895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Otherwise, wait for deactivation NTF */
18905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
18915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
18925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_DM_RF_DEACTIVATE_NTF:
18935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if NFCC sent this after NFCC had rejected deactivate CMD to idle while deactivating */
18945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
18955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
18965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)
18975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
18985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* stop discovery */
18995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
19005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
19015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
19025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else
19035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
19045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
19055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */
19065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
19075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* check if need to restart discovery after resync discovery state with NFCC */
19085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_start_rf_discover ();
19095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
19105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
19115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Otherwise, deactivated when received unexpected activation in idle state */
19125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
19135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
19145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
19155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_DM_RF_INTF_ACTIVATED_NTF:
19165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* unexpected activation, deactivate to idle */
19175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
19185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
1919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_LP_LISTEN_CMD:
1922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN);
1923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_idle (): Unexpected discovery event");
1927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_discovery
1934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_DISCOVERY state
1936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_discovery (tNFA_DM_RF_DISC_SM_EVENT event,
1941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      tNFA_DM_RF_DISC_DATA *p_data)
1942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
1944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_CMD:
1946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if deactivate CMD was not sent to NFCC */
1947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
1948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
1950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_Deactivate (p_data->deactivate_type);
1951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
1954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
19555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
19565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if it's not race condition between deactivate CMD and activate NTF */
19575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
19585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
19595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* do not notify deactivated to idle in RF discovery state
19605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ** because it is internal or stopping RF discovery
19615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            */
19625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
19635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* there was no activation while waiting for deactivation RSP */
19645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
19655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_start_rf_discover ();
19665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
1967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_NTF:
1969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_W4_ALL_DISCOVERIES);
1970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_notify_discovery (p_data);
1971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_INTF_ACTIVATED_NTF:
19735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
1974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
19755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            NFA_TRACE_DEBUG0 ("RF Activated while waiting for deactivation RSP");
19765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* it's race condition. DH has to wait for deactivation NTF */
19775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_NTF;
1978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
19815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (p_data->nfc_discover.activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF)
19825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
19835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE);
19845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
19855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else if (p_data->nfc_discover.activate.rf_tech_param.mode & 0x80)
19865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
19875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* Listen mode */
19885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE);
19895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
19905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else
19915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
19925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* Poll mode */
19935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE);
19945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
19955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
19965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
19975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
19985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
19995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* after receiving deactivate event, restart discovery */
20015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
20025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
20035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
2004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
20055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
2006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_DM_RF_DEACTIVATE_NTF:
20085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if there was race condition between deactivate CMD and activate NTF */
20095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)
2010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
20115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* race condition is resolved */
20125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
2013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
20155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
20165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* do not notify deactivated to idle in RF discovery state
20175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                ** because it is internal or stopping RF discovery
20185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                */
20195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
20215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_start_rf_discover ();
20225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
2023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_LP_LISTEN_CMD:
2026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_CORE_INTF_ERROR_NTF:
2028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_discovery (): Unexpected discovery event");
2031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_w4_all_discoveries
2038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_W4_ALL_DISCOVERIES state
2040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_w4_all_discoveries (tNFA_DM_RF_DISC_SM_EVENT event,
2045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                               tNFA_DM_RF_DISC_DATA *p_data)
2046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_CMD:
2050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if deactivate CMD was not sent to NFCC */
2051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* only IDLE mode is allowed */
2055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
2059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
20605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* notify exiting from w4 all discoverie state */
20615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
20625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_start_rf_discover ();
2065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_NTF:
20675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if deactivate CMD is already sent then ignore discover NTF */
20685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
20705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* Notification Type = NCI_DISCOVER_NTF_LAST or NCI_DISCOVER_NTF_LAST_ABORT */
20715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (p_data->nfc_discover.result.more != NCI_DISCOVER_NTF_MORE)
20725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
20735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT);
20745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
20755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_notify_discovery (p_data);
2076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /*
2080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** This is only for ISO15693.
2081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** FW sends activation NTF when all responses are received from tags without host selecting.
2082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        */
2083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE);
2084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
2086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
2088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* after receiving deactivate event, restart discovery */
2090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_all_discoveries (): Unexpected discovery event");
2095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_w4_host_select
2102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_W4_HOST_SELECT state
2104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_w4_host_select (tNFA_DM_RF_DISC_SM_EVENT event,
2109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                           tNFA_DM_RF_DISC_DATA *p_data)
2110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_CONN_EVT_DATA conn_evt;
2112c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    tNFA_DM_DISC_FLAGS  old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2113c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    BOOLEAN             sleep_wakeup_event = FALSE;
2114c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    BOOLEAN             sleep_wakeup_event_processed = FALSE;
21158adba7675549bb507514c4f602723aa7d8e43f67Sherry Smith    tNFA_STATUS         status;
2116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_SELECT_CMD:
2120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if not waiting to deactivate */
2121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_DiscoverySelect (p_data->select.rf_disc_id,
2124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 p_data->select.protocol,
2125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 p_data->select.rf_interface);
2126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, NFA_STATUS_FAILED);
2130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_SELECT_RSP:
2134c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        sleep_wakeup_event = TRUE;
2135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* notify application status of selection */
2136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_data->nfc_discover.status == NFC_STATUS_OK)
2137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2138c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu            sleep_wakeup_event_processed = TRUE;
2139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            conn_evt.status = NFA_STATUS_OK;
2140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* register callback to get interface error NTF */
2141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_SetStaticRfCback (nfa_dm_disc_data_cback);
2142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            conn_evt.status = NFA_STATUS_FAILED;
2145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2146c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        if (!old_sleep_wakeup_flag)
2147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, p_data->nfc_discover.status);
2149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE);
21538adba7675549bb507514c4f602723aa7d8e43f67Sherry Smith        /* always call nfa_dm_disc_notify_activation to update protocol/interface information in NFA control blocks */
21548adba7675549bb507514c4f602723aa7d8e43f67Sherry Smith        status = nfa_dm_disc_notify_activation (&(p_data->nfc_discover));
2155c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        if (old_sleep_wakeup_flag)
2156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2157c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu            /* Handle sleep wakeup success: notify RW module of sleep wakeup of tag; if deactivation is pending then deactivate  */
2158c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu            nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK);
2159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
21608adba7675549bb507514c4f602723aa7d8e43f67Sherry Smith        else if (status == NFA_STATUS_FAILED)
2161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
2163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* after receiving deactivate event, restart discovery */
2165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_CMD:
2169c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        if (old_sleep_wakeup_flag)
2170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
21717c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.deact_pending      = TRUE;
21727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if deactivate CMD was not sent to NFCC */
2175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
2176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP;
2178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* only IDLE mode is allowed */
2179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
2183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* notify exiting from host select state */
2185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
21865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
21875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
21885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_start_rf_discover ();
2189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_CORE_INTF_ERROR_NTF:
2192c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        sleep_wakeup_event    = TRUE;
2193c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        if (!old_sleep_wakeup_flag)
2194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* target activation failed, upper layer may deactivate or select again */
2196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            conn_evt.status = NFA_STATUS_FAILED;
2197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt);
2198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_host_select (): Unexpected discovery event");
2202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2205c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed)
2206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2207c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        /* performing sleep wakeup and exception conditions happened
2208c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu         * clear sleep wakeup information and report failure */
2209c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED);
2210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_poll_active
2216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_POLL_ACTIVE state
2218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_poll_active (tNFA_DM_RF_DISC_SM_EVENT event,
2223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                        tNFA_DM_RF_DISC_DATA *p_data)
2224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status;
2226c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    tNFA_DM_DISC_FLAGS  old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING);
2227c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    BOOLEAN             sleep_wakeup_event = FALSE;
2228c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    BOOLEAN             sleep_wakeup_event_processed = FALSE;
22295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNFC_DEACTIVATE_DEVT deact;
2230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_CMD:
2234c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        if (old_sleep_wakeup_flag)
2235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2236c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu            /* sleep wakeup is already enabled when deactivate cmd is requested,
2237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             * keep the information in control block to issue it later */
22387c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.deact_pending      = TRUE;
22397c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
2240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
2248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* register callback to get interface error NTF */
2250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (nfa_dm_disc_data_cback);
22515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
22525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
22535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
22545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* it's race condition. received deactivate NTF before receiving RSP */
22555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
22565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            deact.status = NFC_STATUS_OK;
22575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            deact.type   = NFC_DEACTIVATE_TYPE_IDLE;
22585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            deact.is_ntf = TRUE;
22595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact);
22605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
22615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* NFCC is in IDLE state */
22625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
22635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_start_rf_discover ();
22645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
2265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_NTF:
2267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
22685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
22695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
22705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
22715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
22725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
22735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* it's race condition. received deactivate NTF before receiving RSP */
22745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* notify deactivation after receiving deactivate RSP */
22755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP");
22765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            break;
22775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
22785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2279c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        sleep_wakeup_event    = TRUE;
22805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
22815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
22825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP)
2284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)  )
2285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT);
2287c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu            if (old_sleep_wakeup_flag)
2288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2289c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu                sleep_wakeup_event_processed  = TRUE;
2290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* process pending deactivate request */
22917c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                if (nfa_dm_cb.disc_cb.deact_pending)
2292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2293c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu                    /* notify RW module that sleep wakeup is finished */
22945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    /* if deactivation is pending then deactivate  */
2295c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu                    nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK);
2296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
22975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will not call this function */
22985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, TRUE);
2299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2302c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu                    /* Successfully went to sleep mode for sleep wakeup */
2303c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu                    /* Now wake up the tag to complete the operation */
2304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFC_DiscoverySelect (nfa_dm_cb.disc_cb.activated_rf_disc_id,
2305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                         nfa_dm_cb.disc_cb.activated_protocol,
2306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                         nfa_dm_cb.disc_cb.activated_rf_interface);
2307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE)
2312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_start_rf_discover ();
2315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)
2317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
2319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)
2320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* stop discovery */
2322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_CORE_INTF_ERROR_NTF:
2328c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        sleep_wakeup_event    = TRUE;
2329df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu        if (  (!old_sleep_wakeup_flag)
2330df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu            ||(!nfa_dm_cb.disc_cb.deact_pending)  )
2331df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu        {
23321ba9dcccf5b342bd74a2f8213b7ed3be78b9db44Evan Chu            nfa_dm_send_deactivate_cmd (NFA_DEACTIVATE_TYPE_DISCOVERY);
2333df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu        }
2334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_poll_active (): Unexpected discovery event");
2338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2341c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu    if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed)
2342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2343c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        /* performing sleep wakeup and exception conditions happened
2344c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu         * clear sleep wakeup information and report failure */
2345c95c79ccb65d82a65b960919077d5c359cf28cedEvan Chu        nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED);
2346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_listen_active
2352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_LISTEN_ACTIVE state
2354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_listen_active (tNFA_DM_RF_DISC_SM_EVENT event,
2359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                          tNFA_DM_RF_DISC_DATA     *p_data)
2360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
23615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNFC_DEACTIVATE_DEVT deact;
23625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_CMD:
2366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_send_deactivate_cmd(p_data->deactivate_type);
2367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
2369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
23705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
2371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
23725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* it's race condition. received deactivate NTF before receiving RSP */
23735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
23745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            deact.status = NFC_STATUS_OK;
23755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            deact.type   = NFC_DEACTIVATE_TYPE_IDLE;
23765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            deact.is_ntf = TRUE;
23775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact);
23785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
23795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* NFCC is in IDLE state */
2380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_start_rf_discover ();
2382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
23835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
23845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFA_DM_RF_DEACTIVATE_NTF:
23855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
23865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
23875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
23885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
23895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)
2390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
23915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* it's race condition. received deactivate NTF before receiving RSP */
23925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* notify deactivation after receiving deactivate RSP */
23935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP");
2394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
23955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
2396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
23975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
23985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
23995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE)
2400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
24015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
24025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_start_rf_discover ();
24035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
24045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else if (  (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP)
24055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                     ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)  )
24065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
24075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_SLEEP);
24085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
24095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY)
24105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
24115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* Discovery */
24125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
24135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)
24145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
24155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    /* stop discovery */
24165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
24175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
2418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_CORE_INTF_ERROR_NTF:
2423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_active (): Unexpected discovery event");
2426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_listen_sleep
2433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_LISTEN_SLEEP state
2435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_listen_sleep (tNFA_DM_RF_DISC_SM_EVENT event,
2440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                         tNFA_DM_RF_DISC_DATA *p_data)
2441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_CMD:
2445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_send_deactivate_cmd (p_data->deactivate_type);
24465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
24475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if deactivate type is not discovery then NFCC will not sent deactivation NTF */
24485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (p_data->deactivate_type != NFA_DEACTIVATE_TYPE_DISCOVERY)
24495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
24505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF;
24515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
24525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
2453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
2455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP;
2456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if deactivate type in CMD was IDLE */
2457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF))
2458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
24605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
24615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
24625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            nfa_dm_start_rf_discover ();
2463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_NTF:
2466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* clear both W4_RSP and W4_NTF because of race condition between deactivat CMD and link loss */
2467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF);
24685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle);
24695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
24705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* there is no active protocol in this state, so broadcast to all by using NFA_DM_RF_DEACTIVATE_RSP */
24715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover));
24725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE)
2474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_start_rf_discover ();
2477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (p_data->nfc_discover.deactivate.type == NFA_DEACTIVATE_TYPE_DISCOVERY)
2479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY);
2481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_ERROR0 ("Unexpected deactivation type");
2485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
2486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_start_rf_discover ();
2487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE);
2491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
2492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf");
2494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* after receiving deactivate event, restart discovery */
2496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
2497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_sleep (): Unexpected discovery event");
2501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_lp_listen
2508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_LP_LISTEN state
2510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_lp_listen (tNFA_DM_RF_DISC_SM_EVENT event,
2515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                           tNFA_DM_RF_DISC_DATA *p_data)
2516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_LP_ACTIVE);
2521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_notify_activation (&(p_data->nfc_discover));
25227c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED)
25237c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
25247c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            NFA_TRACE_DEBUG0 ("Not matched, unexpected activation");
25257c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
2526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_listen (): Unexpected discovery event");
2530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_lp_active
2537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery events in NFA_DM_RFST_LP_ACTIVE state
2539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfa_dm_disc_sm_lp_active (tNFA_DM_RF_DISC_SM_EVENT event,
2544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                           tNFA_DM_RF_DISC_DATA *p_data)
2545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_NTF:
2549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN);
2550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover));
2551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_active (): Unexpected discovery event");
2554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_sm_execute
2561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Processing discovery related events
2563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_disc_sm_execute (tNFA_DM_RF_DISC_SM_EVENT event, tNFA_DM_RF_DISC_DATA *p_data)
2568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
2570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG5 ("nfa_dm_disc_sm_execute (): state: %s (%d), event: %s(%d) disc_flags: 0x%x",
2571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state,
2572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_disc_event_2_str (event), event, nfa_dm_cb.disc_cb.disc_flags);
2573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
2574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute(): state: %d, event:%d disc_flags: 0x%x",
2575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_cb.disc_cb.disc_state, event, nfa_dm_cb.disc_cb.disc_flags);
2576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
2577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (nfa_dm_cb.disc_cb.disc_state)
2579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*  RF Discovery State - Idle */
2581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_IDLE:
2582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_idle (event, p_data);
2583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* RF Discovery State - Discovery */
2586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_DISCOVERY:
2587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_discovery (event, p_data);
2588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*RF Discovery State - Wait for all discoveries */
2591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_W4_ALL_DISCOVERIES:
2592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_w4_all_discoveries (event, p_data);
2593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* RF Discovery State - Wait for host selection */
2596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_W4_HOST_SELECT:
2597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_w4_host_select (event, p_data);
2598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* RF Discovery State - Poll mode activated */
2601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_POLL_ACTIVE:
2602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_poll_active (event, p_data);
2603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* RF Discovery State - listen mode activated */
2606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LISTEN_ACTIVE:
2607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_listen_active (event, p_data);
2608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* RF Discovery State - listen mode sleep */
2611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LISTEN_SLEEP:
2612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_listen_sleep (event, p_data);
2613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Listening in Low Power mode    */
2616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LP_LISTEN:
2617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_lp_listen (event, p_data);
2618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Activated in Low Power mode    */
2621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LP_ACTIVE:
2622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_lp_active (event, p_data);
2623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
2626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute (): new state: %s (%d), disc_flags: 0x%x",
2627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state,
2628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_cb.disc_cb.disc_flags);
2629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
2630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG2 ("nfa_dm_disc_sm_execute(): new state: %d,  disc_flags: 0x%x",
2631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags);
2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_add_rf_discover
2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Add discovery configuration and callback function
2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          valid handle if success
2642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFA_HANDLE nfa_dm_add_rf_discover (tNFA_DM_DISC_TECH_PROTO_MASK disc_mask,
2645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    tNFA_DM_DISC_HOST_ID         host_id,
2646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    tNFA_DISCOVER_CBACK         *p_disc_cback)
2647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       xx;
2649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_dm_add_rf_discover () disc_mask=0x%x", disc_mask);
2651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++)
2653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!nfa_dm_cb.disc_cb.entry[xx].in_use)
2655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.entry[xx].in_use              = TRUE;
2657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask = disc_mask;
2658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.entry[xx].host_id             = host_id;
2659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.entry[xx].p_disc_cback        = p_disc_cback;
2660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_dm_cb.disc_cb.entry[xx].disc_flags          = NFA_DM_DISC_FLAGS_NOTIFY;
2661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return xx;
2662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFA_HANDLE_INVALID;
2666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_start_excl_discovery
2671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Start exclusive RF discovery
2673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_start_excl_discovery (tNFA_TECHNOLOGY_MASK poll_tech_mask,
2678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  tNFA_LISTEN_CFG *p_listen_cfg,
2679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  tNFA_DISCOVER_CBACK  *p_disc_cback)
2680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0;
2682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_dm_start_excl_discovery ()");
2684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A)
2686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T;
2688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T;
2689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP;
2690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP;
2691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY;
2692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE)
2694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP;
2696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B)
2698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP;
2700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F)
2702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T;
2704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP;
2705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE)
2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP;
2709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ISO15693)
2711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_P_ISO15693;
2713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME)
2715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME;
2717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO)
2719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO;
2721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.excl_disc_entry.in_use              = TRUE;
2724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask = poll_disc_mask;
2725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.excl_disc_entry.host_id             = NFA_DM_DISC_HOST_ID_DH;
2726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback        = p_disc_cback;
2727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags          = NFA_DM_DISC_FLAGS_NOTIFY;
2728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy (&nfa_dm_cb.disc_cb.excl_listen_config, p_listen_cfg, sizeof (tNFA_LISTEN_CFG));
2730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_CMD, NULL);
2732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_stop_excl_discovery
2737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Stop exclusive RF discovery
2739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_stop_excl_discovery (void)
2744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG0 ("nfa_dm_stop_excl_discovery ()");
2746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.excl_disc_entry.in_use       = FALSE;
2748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = NULL;
2749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_delete_rf_discover
2754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Remove discovery configuration and callback function
2756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_delete_rf_discover (tNFA_HANDLE handle)
2761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_dm_delete_rf_discover () handle=0x%x", handle);
2763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (handle < NFA_DM_DISC_NUM_ENTRIES)
2765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.entry[handle].in_use = FALSE;
2767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFA_TRACE_ERROR0 ("Invalid discovery handle");
2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_rf_discover_select
2777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Select target, protocol and RF interface
2779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_dm_rf_discover_select (UINT8             rf_disc_id,
2784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       tNFA_NFC_PROTOCOL protocol,
2785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       tNFA_INTF_TYPE    rf_interface)
2786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_DM_DISC_SELECT_PARAMS select_params;
2788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFA_CONN_EVT_DATA conn_evt;
2789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG3 ("nfa_dm_disc_select () rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
2791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       rf_disc_id, protocol, rf_interface);
2792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT)
2794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* state is OK: notify the status when the response is received from NFCC */
2796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        select_params.rf_disc_id   = rf_disc_id;
2797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        select_params.protocol     = protocol;
2798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        select_params.rf_interface = rf_interface;
2799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_NOTIFY;
2801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_SELECT_CMD, (tNFA_DM_RF_DISC_DATA *) &select_params);
2802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
2804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Wrong state: notify failed status right away */
2806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        conn_evt.status = NFA_STATUS_FAILED;
2807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt);
2808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_rf_deactivate
2814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deactivate NFC link
2816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFA_STATUS_OK if success
2818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFA_STATUS nfa_dm_rf_deactivate (tNFA_DEACTIVATE_TYPE deactivate_type)
2821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFA_TRACE_DEBUG1 ("nfa_dm_rf_deactivate () deactivate_type:0x%X", deactivate_type);
2823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (deactivate_type == NFA_DEACTIVATE_TYPE_SLEEP)
2825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP)
2827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP_AF;
2828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP;
2830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE)
2833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFA_STATUS_FAILED;
2835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
28367c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY)
28377c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    {
28387c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (deactivate_type == NFA_DEACTIVATE_TYPE_DISCOVERY)
28397c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
28407c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
28417c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
28427c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle);
28437c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle);
28447c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                return NFA_STATUS_OK;
28457c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
28467c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            else
28477c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
28487c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                /* it could be race condition. */
28497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                NFA_TRACE_DEBUG0 ("nfa_dm_rf_deactivate (): already in discovery state");
28507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                return NFA_STATUS_FAILED;
28517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
28527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
28537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        else if (deactivate_type == NFA_DEACTIVATE_TYPE_IDLE)
28547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
28557c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            if (nfa_dm_cb.disc_cb.kovio_tle.in_use)
28567c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            {
28577c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle);
28587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu                nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle);
28597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            }
28607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type);
28617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            return NFA_STATUS_OK;
28627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
28637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        else
28647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        {
28657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            return NFA_STATUS_FAILED;
28667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        }
28677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    }
2868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
2869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type);
2871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFA_STATUS_OK;
2872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
2876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_state_2_str
2879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      convert nfc discovery state to string
2881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *nfa_dm_disc_state_2_str (UINT8 state)
2884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (state)
2886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_IDLE:
2888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "IDLE";
2889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_DISCOVERY:
2891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DISCOVERY";
2892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_W4_ALL_DISCOVERIES:
2894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "W4_ALL_DISCOVERIES";
2895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_W4_HOST_SELECT:
2897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "W4_HOST_SELECT";
2898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_POLL_ACTIVE:
2900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "POLL_ACTIVE";
2901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LISTEN_ACTIVE:
2903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "LISTEN_ACTIVE";
2904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LISTEN_SLEEP:
2906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "LISTEN_SLEEP";
2907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LP_LISTEN:
2909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "LP_LISTEN";
2910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RFST_LP_ACTIVE:
2912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "LP_ACTIVE";
2913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return "Unknown";
2915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_dm_disc_event_2_str
2920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      convert nfc discovery RSP/NTF to string
2922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *nfa_dm_disc_event_2_str (UINT8 event)
2925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
2927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_CMD:
2929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DISCOVER_CMD";
2930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_RSP:
2932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DISCOVER_RSP";
2933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_NTF:
2935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DISCOVER_NTF";
2936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_SELECT_CMD:
2938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "SELECT_CMD";
2939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DISCOVER_SELECT_RSP:
2941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "SELECT_RSP";
2942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_INTF_ACTIVATED_NTF:
2944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "ACTIVATED_NTF";
2945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_CMD:
2947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DEACTIVATE_CMD";
2948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_RSP:
2950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DEACTIVATE_RSP";
2951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_RF_DEACTIVATE_NTF:
2953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "DEACTIVATE_NTF";
2954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_LP_LISTEN_CMD:
2956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "NFA_DM_LP_LISTEN_CMD";
2957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFA_DM_CORE_INTF_ERROR_NTF:
2959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return "INTF_ERROR_NTF";
2960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return "Unknown";
2963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* BT_TRACE_VERBOSE */
2965