1 /****************************************************************************** 2 * 3 * Copyright (C) 1999-2014 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * This file contains functions that interface with the NFC NCI transport. 22 * On the receive side, it routes events to the appropriate handler 23 * (callback). On the transmit side, it manages the command transmission. 24 * 25 ******************************************************************************/ 26 #include <android-base/stringprintf.h> 27 #include <base/logging.h> 28 29 #include "bt_types.h" 30 #include "nfc_api.h" 31 #include "nfc_int.h" 32 33 using android::base::StringPrintf; 34 35 extern bool nfc_debug_enabled; 36 37 /******************************************************************************* 38 ** 39 ** Function nfc_alloc_conn_cb 40 ** 41 ** Description This function is called to allocation a control block for 42 ** NCI logical connection 43 ** 44 ** Returns The allocated control block or NULL 45 ** 46 *******************************************************************************/ 47 tNFC_CONN_CB* nfc_alloc_conn_cb(tNFC_CONN_CBACK* p_cback) { 48 int xx, max = NCI_MAX_CONN_CBS; 49 tNFC_CONN_CB* p_conn_cb = NULL; 50 51 NFC_CHECK_MAX_CONN(); 52 for (xx = 0; xx < max; xx++) { 53 if (nfc_cb.conn_cb[xx].conn_id == NFC_ILLEGAL_CONN_ID) { 54 nfc_cb.conn_cb[xx].conn_id = 55 NFC_PEND_CONN_ID; /* to indicate this cb is used */ 56 p_conn_cb = &nfc_cb.conn_cb[xx]; 57 p_conn_cb->p_cback = p_cback; 58 break; 59 } 60 } 61 return p_conn_cb; 62 } 63 64 /******************************************************************************* 65 ** 66 ** Function nfc_set_conn_id 67 ** 68 ** Description This function is called to set the connection id to the 69 ** connection control block and the id mapping table 70 ** 71 ** Returns void 72 ** 73 *******************************************************************************/ 74 void nfc_set_conn_id(tNFC_CONN_CB* p_cb, uint8_t conn_id) { 75 uint8_t handle; 76 77 if (p_cb == NULL) return; 78 79 p_cb->conn_id = conn_id; 80 handle = (uint8_t)(p_cb - nfc_cb.conn_cb + 1); 81 nfc_cb.conn_id[conn_id] = handle; 82 DLOG_IF(INFO, nfc_debug_enabled) 83 << StringPrintf("nfc_set_conn_id conn_id:%d, handle:%d", conn_id, handle); 84 } 85 86 /******************************************************************************* 87 ** 88 ** Function nfc_find_conn_cb_by_handle 89 ** 90 ** Description This function is called to locate the control block for 91 ** loopback test. 92 ** 93 ** Returns The loopback test control block or NULL 94 ** 95 *******************************************************************************/ 96 tNFC_CONN_CB* nfc_find_conn_cb_by_handle(uint8_t id) { 97 int xx; 98 tNFC_CONN_CB* p_conn_cb = NULL; 99 100 for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++) { 101 if (nfc_cb.conn_cb[xx].id == id) { 102 p_conn_cb = &nfc_cb.conn_cb[xx]; 103 break; 104 } 105 } 106 return p_conn_cb; 107 } 108 109 /******************************************************************************* 110 ** 111 ** Function nfc_find_conn_cb_by_conn_id 112 ** 113 ** Description This function is called to locate the control block for 114 ** the given connection id 115 ** 116 ** Returns The control block or NULL 117 ** 118 *******************************************************************************/ 119 tNFC_CONN_CB* nfc_find_conn_cb_by_conn_id(uint8_t conn_id) { 120 tNFC_CONN_CB* p_conn_cb = NULL; 121 uint8_t handle; 122 uint8_t id; 123 int xx; 124 125 if (conn_id == NFC_PEND_CONN_ID) { 126 for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++) { 127 if (nfc_cb.conn_cb[xx].conn_id == NFC_PEND_CONN_ID) { 128 p_conn_cb = &nfc_cb.conn_cb[xx]; 129 break; 130 } 131 } 132 } else { 133 id = conn_id & NFC_CONN_ID_ID_MASK; 134 if (id < NFC_MAX_CONN_ID) { 135 handle = nfc_cb.conn_id[id]; 136 if (handle > 0) p_conn_cb = &nfc_cb.conn_cb[handle - 1]; 137 } 138 } 139 140 return p_conn_cb; 141 } 142 143 /******************************************************************************* 144 ** 145 ** Function nfc_free_conn_cb 146 ** 147 ** Description This function is called to free the control block and 148 ** resources and id mapping table 149 ** 150 ** Returns void 151 ** 152 *******************************************************************************/ 153 void nfc_free_conn_cb(tNFC_CONN_CB* p_cb) { 154 void* p_buf; 155 156 if (p_cb == NULL) return; 157 158 while ((p_buf = GKI_dequeue(&p_cb->rx_q)) != NULL) GKI_freebuf(p_buf); 159 160 while ((p_buf = GKI_dequeue(&p_cb->tx_q)) != NULL) GKI_freebuf(p_buf); 161 162 nfc_cb.conn_id[p_cb->conn_id] = 0; 163 p_cb->p_cback = NULL; 164 p_cb->conn_id = NFC_ILLEGAL_CONN_ID; 165 } 166 167 /******************************************************************************* 168 ** 169 ** Function nfc_reset_all_conn_cbs 170 ** 171 ** Description This function is called to free all the control blocks and 172 ** resources and id mapping table 173 ** 174 ** Returns void 175 ** 176 *******************************************************************************/ 177 extern void nfc_reset_all_conn_cbs(void) { 178 int xx; 179 tNFC_CONN_CB* p_conn_cb = &nfc_cb.conn_cb[0]; 180 tNFC_DEACTIVATE_DEVT deact; 181 182 deact.status = NFC_STATUS_NOT_INITIALIZED; 183 deact.type = NFC_DEACTIVATE_TYPE_IDLE; 184 deact.is_ntf = TRUE; 185 for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++, p_conn_cb++) { 186 if (p_conn_cb->conn_id != NFC_ILLEGAL_CONN_ID) { 187 if (p_conn_cb->p_cback) { 188 tNFC_CONN nfc_conn; 189 nfc_conn.deactivate = deact; 190 (*p_conn_cb->p_cback)(p_conn_cb->conn_id, NFC_DEACTIVATE_CEVT, 191 &nfc_conn); 192 } 193 nfc_free_conn_cb(p_conn_cb); 194 } 195 } 196 } 197