15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors 35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License. 65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at 75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * http://www.apache.org/licenses/LICENSE-2.0 95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software 115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and 145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License. 155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* =========================================================================== * 195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* * 205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* * 215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \file hHciNfc_AdminMgmt.c * 225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief HCI Admin Gate Management Routines. * 235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* * 245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* * 255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI-1.1 * 265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* * 275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Date: Mon Apr 5 19:23:34 2010 $ * 285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Author: ing04880 $ * 295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Revision: 1.47 $ * 305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ 315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* * 325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* =========================================================================== * 335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly***************************** Header File Inclusion **************************** 375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcCompId.h> 395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_Pipe.h> 405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_AdminMgmt.h> 415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_DevMgmt.h> 425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h> 435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly****************************** Macro Definitions ******************************* 455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define SESSION_INDEX 0x01U 485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define MAX_PIPE_INDEX 0x02U 495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define WHITELIST_INDEX 0x03U 505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define HOST_LIST_INDEX 0x04U 515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Max Whitelist Supported by the Device*/ 535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define SESSIONID_LEN 0x08U 545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define WHITELIST_MAX_LEN 0x03U 555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define HOST_LIST_MAX_LEN 0x05U 565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Address Definitions for HW Configuration */ 585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define NFC_ADDRESS_UICC_SESSION 0x9EA2U 595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Structure and Enumeration *************************** 645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellytypedef enum phHciNfc_Admin_Seq{ 675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_PIPE_OPEN = 0x00U, 685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_GET_HOST_LIST, 695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_GET_WHITE_LIST, 705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_GET_SESSION, 715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_VERIFY_SESSION, 725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_CLEAR_UICC_PIPES, 735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_CLEAR_PIPES, 745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_PIPE_REOPEN, 755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_CREATE_PIPES, 765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_SET_SESSION, 775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_SET_WHITE_LIST, 785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_UPDATE_PIPES, 795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_PIPE_CLOSE, 805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_DELETE_PIPES, 815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ADMIN_END_SEQUENCE 825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} phHciNfc_Admin_Seq_t; 835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Information structure for the Admin Gate */ 865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellytypedef struct phHciNfc_AdminGate_Info{ 875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Current running Sequence of the Admin Management */ 885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Admin_Seq_t current_seq; 895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Next running Sequence of the Admin Management */ 905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Admin_Seq_t next_seq; 915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Pointer to the Admin Pipe Information */ 925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *admin_pipe_info; 935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Sequence for the Pipe Initialisation */ 945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_PipeMgmt_Seq_t pipe_seq; 955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Session ID of the Device */ 965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t session_id[SESSIONID_LEN]; 975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Max number of pipes that can be created on the Device */ 985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t max_pipe; 995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* List of Hosts that can be access the device Admin Gate. */ 1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t whitelist[WHITELIST_MAX_LEN]; 1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Host List from the Host Controller */ 1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t host_list[HOST_LIST_MAX_LEN]; 1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} phHciNfc_AdminGate_Info_t; 1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Static Function Declaration ************************** 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \ingroup grp_hci_nfc 1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * The phHciNfc_Recv_Admin_Response function interprets the received AdminGate 1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * response from the Host Controller Gate. 1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in] psHciContext psHciContext is the pointer to HCI Layer 1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * context Structure. 1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in] pHwRef pHwRef is the Information of 1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * the Device Interface Link . 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in,out] pResponse Response received from the Host Cotroller 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Admin gate. 1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in] length length contains the length of the 1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * response received from the Host Controller. 1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \retval NFCSTATUS_PENDING AdminGate Response to be received is pending. 1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \retval NFCSTATUS_SUCCESS AdminGate Response received Successfully. 1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * could not be interpreted properly. 1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \retval Other errors Errors related to the other layers 1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Admin_Response( 1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psHciContext, 1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pResponse, 1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_InfoUpdate( 1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sHwReference_t *pHwRef, 1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index, 1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *reg_value, 1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t reg_length 1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS 1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Cmd ( 1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pCmd, 1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Event ( 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pEvent, 1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Function Definitions *************************** 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Initialisation of Admin Gate and Establish the Session . 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function initialses the Admin Gates and Establishes the Session by creating 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * all the required pipes and sets the Session ID 1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_Initialise( 2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef 2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_AdminGate_Info_t *p_admin_info=NULL; 2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length = 0; 2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) 2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NULL == pHwRef ) 2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( ( NULL == psHciContext->p_admin_info ) 2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly && (phHciNfc_Allocate_Resource((void **)(&p_admin_info), 2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sizeof(phHciNfc_AdminGate_Info_t))== NFCSTATUS_SUCCESS) 2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_admin_info = (void *) p_admin_info; 2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->current_seq = ADMIN_PIPE_OPEN; 2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_END_SEQUENCE; 2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info = NULL; 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info = (phHciNfc_AdminGate_Info_t * ) 2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_admin_info ; 2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NULL == p_admin_info) 2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INSUFFICIENT_RESOURCES); 2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(p_admin_info->current_seq) 2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Admin pipe open sequence , Initially open the Admin Pipe */ 2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_PIPE_OPEN: 2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(phHciNfc_Allocate_Resource((void **)(&p_pipe_info), 2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sizeof(phHciNfc_Pipe_Info_t))!= NFCSTATUS_SUCCESS) 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INSUFFICIENT_RESOURCES); 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Populate the pipe information in the pipe handle */ 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((phHciNfc_Pipe_Info_t *)p_pipe_info)->pipe.pipe_id = 2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PIPETYPE_STATIC_ADMIN; 2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((phHciNfc_Pipe_Info_t *)p_pipe_info)->recv_resp = 2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &phHciNfc_Recv_Admin_Response; 2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((phHciNfc_Pipe_Info_t *)p_pipe_info)->recv_cmd = 2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &phHciNfc_Recv_Admin_Cmd; 2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((phHciNfc_Pipe_Info_t *)p_pipe_info)->recv_event = 2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &phHciNfc_Recv_Admin_Event; 2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN] = 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info ; 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Open_Pipe( psHciContext, 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef,p_pipe_info ); 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info = p_pipe_info ; 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_GET_SESSION; 2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_GET_SESSION: 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->reg_index = SESSION_INDEX; 2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->prev_status = 2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)HCI_ADMIN_PIPE_ID, 2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)ANY_GET_PARAMETER); 2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_PENDING == p_pipe_info->prev_status ) 2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef UICC_SESSION_RESET 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_CLEAR_UICC_PIPES; 2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#elif defined (ESTABLISH_SESSION) 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_VERIFY_SESSION; 2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_CLEAR_PIPES; 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef UICC_SESSION_RESET 2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_CLEAR_UICC_PIPES: 2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t config = 0x00; 3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TODO: Implement the Clear UICC PIPES Using 3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Memory configuration. 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFC_ADDRESS_UICC_SESSION , config ); 3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_PENDING == status ) 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_CLEAR_PIPES; 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_VERIFY_SESSION: 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sHwConfig_t *p_hw_config = 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHal_sHwConfig_t *) psHciContext->p_config_params; 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sHwReference_t *p_hw_ref = 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHal_sHwReference_t *) pHwRef; 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int cmp_val = 0; 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly cmp_val = phOsalNfc_MemCompare(p_hw_config->session_id , 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_hw_ref->session_id , 3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sizeof(p_hw_ref->session_id)); 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((cmp_val == 0) 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly && ( HCI_SESSION == psHciContext->init_mode) 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->hci_mode = hciMode_Session; 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Update_Pipe( psHciContext, pHwRef, 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &p_admin_info->pipe_seq ); 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((status == NFCSTATUS_SUCCESS) 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly && (NULL != p_pipe_info)) 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->reg_index = MAX_PIPE_INDEX; 3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_Generic_Cmd( psHciContext, 3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, (uint8_t)HCI_ADMIN_PIPE_ID, 3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)ANY_GET_PARAMETER ); 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->prev_status = status; 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_PENDING == status ) 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_PIPE_CLOSE; 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_SEQUENCE); 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To clear the pipe information*/ 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->hci_mode = hciMode_Override; 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->current_seq = ADMIN_CLEAR_PIPES; 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* fall through */ 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_CLEAR_PIPES: 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->prev_status = 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Send_Admin_Cmd( psHciContext, 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, ADM_CLEAR_ALL_PIPE, 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly length, p_pipe_info); 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = ((p_pipe_info->prev_status == NFCSTATUS_PENDING)? 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_SUCCESS : 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->prev_status); 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_PIPE_REOPEN; 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Admin pipe Re-Open sequence , Re-Open the Admin Pipe */ 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_PIPE_REOPEN: 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Open_Pipe( psHciContext, 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef,p_pipe_info ); 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_CREATE_PIPES; 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_CREATE_PIPES: 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Create_All_Pipes( psHciContext, pHwRef, 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &p_admin_info->pipe_seq ); 3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_GET_WHITE_LIST; 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_PENDING; 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_GET_WHITE_LIST: 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == p_pipe_info ) 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_SEQUENCE); 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->reg_index = WHITELIST_INDEX; 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_Generic_Cmd( psHciContext, 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, (uint8_t)HCI_ADMIN_PIPE_ID, 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)ANY_GET_PARAMETER ); 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->prev_status = status; 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(HCI_SELF_TEST == psHciContext->init_mode) 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = ((NFCSTATUS_PENDING == status )? 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_SUCCESS : status); 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_PENDING == status ) 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_GET_HOST_LIST; 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* status = NFCSTATUS_SUCCESS; */ 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_GET_HOST_LIST: 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == p_pipe_info ) 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_SEQUENCE); 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->reg_index = HOST_LIST_INDEX; 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_Generic_Cmd( psHciContext, 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, (uint8_t)HCI_ADMIN_PIPE_ID, 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)ANY_GET_PARAMETER ); 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->prev_status = status; 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_PENDING == status ) 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined(HOST_WHITELIST) 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_SET_WHITE_LIST; 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_SET_SESSION; 4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_SET_WHITE_LIST: 4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == p_pipe_info ) 4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_HCI_SEQUENCE); 4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t i = 0; 4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for (i = 0; i < WHITELIST_MAX_LEN - 2; i++ ) 4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->whitelist[i] = i + 2; 4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Set_Param(psHciContext, pHwRef, 4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info, WHITELIST_INDEX, 4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t *)p_admin_info->whitelist, i ); 4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_PENDING == status ) 4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_SET_SESSION; 4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADMIN_SET_SESSION: 4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sHwConfig_t *p_hw_config = 4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHal_sHwConfig_t *) psHciContext->p_config_params; 4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = p_admin_info->admin_pipe_info; 4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Set_Param(psHciContext, pHwRef, p_pipe_info, 4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly SESSION_INDEX, (uint8_t *)(p_hw_config->session_id), 4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sizeof(p_hw_config->session_id)); 4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_PENDING == p_pipe_info->prev_status ) 4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_PIPE_CLOSE; 5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); 5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* End of the Sequence Switch */ 5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* End of the Admin Info Memory Check */ 5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* End of Null context Check */ 5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef HOST_EMULATION 5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Creates the Card Emulation Gate Pipes . 5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function Creates the Card Emulation Gate. 5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_CE_Init( 5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_GateID_t ce_gate 5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* phHciNfc_Pipe_Info_t *pipe_info = NULL; */ 5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_AdminGate_Info_t *p_admin_info=NULL; 5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) || (NULL == pHwRef) ) 5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NULL != psHciContext->p_admin_info ) 5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info = psHciContext->p_admin_info; 5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(ce_gate) 5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Card Emulation A Gate Pipe Creation */ 5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHciNfc_CETypeAGate: 5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->pipe_seq = PIPE_CARD_A_CREATE; 5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Card Emulation B Gate Pipe Creation */ 5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHciNfc_CETypeBGate: 5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->pipe_seq = PIPE_CARD_B_CREATE; 5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED); 5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* End of CE Gate Switch */ 5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NFCSTATUS_SUCCESS == status) 5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_CE_Pipes_OP( psHciContext, 5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, &p_admin_info->pipe_seq ); 5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(status == NFCSTATUS_SUCCESS) 5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->next_seq = ADMIN_END_SEQUENCE; 5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* status = NFCSTATUS_PENDING; */ 5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* End of NULL Check for the Admin_Info */ 5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* End of Null Check for the Context */ 5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Releases the resources allocated the Admin Management. 5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function Releases the resources allocated the Admin Management 5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * and resets the hardware to the reset state. 5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_Release( 5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HostID_t host_type 6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) || (NULL == pHwRef) ) 6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NULL != psHciContext->p_admin_info ) 6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(phHciNfc_UICCHostID != host_type) 6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN]; 6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Close_Pipe( psHciContext, 6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef, p_pipe_info ); 6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* End of NULL Check for the Admin_Info */ 6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* End of Null Check for the Context */ 6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Sends the HCI Admin Event to the corresponding peripheral device. 6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function sends the HCI Admin Events to the connected NFC Pheripheral 6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device 6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS 6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Send_Admin_Event ( 6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t event, 6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length, 6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *params 6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Packet_t *hcp_packet = NULL; 6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_AdminGate_Info_t *p_admin_info=NULL; 6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) 6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NULL == pHwRef) 6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->tx_total = 0 ; 6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly length += HCP_HEADER_LEN ; 6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info = psHciContext->p_admin_info; 6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( EVT_HOT_PLUG == event ) 6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Use the HCP Packet Structure to Construct the send HCP 6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Packet data. 6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t) HCI_ADMIN_PIPE_ID, 6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_TYPE_EVENT, event); 6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INSTRUCTION); 6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NFCSTATUS_SUCCESS == status ) 6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT; 6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->prev_msg = event ; 6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->param_info = params ; 6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->tx_total = length; 6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->response_pending = FALSE ; 6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef ); 6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_PENDING; 6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Sends the HCI Admin Commands to the corresponding peripheral device. 6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function sends the HCI Admin Commands to the connected NFC Pheripheral 6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device 6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS 6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Send_Admin_Cmd ( 7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t cmd, 7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length, 7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *params 7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Packet_t *hcp_packet = NULL; 7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Message_t *hcp_message = NULL; 7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_AdminGate_Info_t *p_admin_info=NULL; 7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t i=0; 7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) 7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NULL == pHwRef) 7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NULL == params) 7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = (phHciNfc_Pipe_Info_t *) params; 7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->tx_total = 0 ; 7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly length += HCP_HEADER_LEN ; 7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info = psHciContext->p_admin_info; 7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch( cmd ) 7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_CREATE_PIPE: 7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Use the HCP Packet Structure to Construct the send HCP 7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Packet data. 7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t) HCI_ADMIN_PIPE_ID, 7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_TYPE_COMMAND, cmd); 7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message = &(hcp_packet->msg.message); 7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Source HOST ID Parameter is not passed as a 7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * parameter in the HCI SPEC */ 7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* hcp_message->payload[i++] = p_pipe_info->pipe.source.host_id; */ 7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[i++] = p_pipe_info->pipe.source.gate_id; 7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[i++] = p_pipe_info->pipe.dest.host_id; 7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[i++] = p_pipe_info->pipe.dest.gate_id; 7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_DELETE_PIPE: 7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; 7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pipe_id = p_pipe_info->pipe.pipe_id; 7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( pipe_id < PIPETYPE_DYNAMIC ) 7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The Static Pipes cannot be Deleted */ 7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, 7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_PARAMETER ); 7595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_DEBUG("phHciNfc_Send_Admin_Cmd: Static Pipe %u " 7605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly "Cannot be Deleted \n",pipe_id); 7615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Use the HCP Packet Structure to Construct the send HCP 7665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Packet data. 7675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 7685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 7695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 7705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t) HCI_ADMIN_PIPE_ID, 7715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_TYPE_COMMAND, cmd); 7725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message = &(hcp_packet->msg.message); 7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[i++] = pipe_id ; 7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_CLEAR_ALL_PIPE: 7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Use the HCP Packet Structure to Construct the send HCP 7815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Packet data. 7825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t) HCI_ADMIN_PIPE_ID, 7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_TYPE_COMMAND, cmd); 7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message = &(hcp_packet->msg.message); 7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* These are notifications and can not be sent by the Host */ 7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* case ADM_NOTIFY_PIPE_CREATED: */ 7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* case ADM_NOTIFY_PIPE_DELETED: */ 7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* case ADM_NOTIFY_ALL_PIPE_CLEARED: */ 7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 7955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND); 7965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NFCSTATUS_SUCCESS == status ) 7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND; 8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->prev_msg = cmd; 8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->param_info = p_pipe_info; 8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->tx_total = length; 8045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->response_pending = TRUE; 8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef ); 8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_PENDING; 8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Receives the HCI Response from the corresponding peripheral device. 8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 8175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function receives the HCI Command Response from the connected NFC 8185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Pheripheral device. 8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 8235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Admin_Response( 8245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 8265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pResponse, 8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext = 8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHciNfc_sContext_t *)psContext ; 8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Packet_t *hcp_packet = NULL; 8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Message_t *hcp_message = NULL; 8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_AdminGate_Info_t *p_admin_info = NULL; 8405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 8415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; 8425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t prev_cmd = 0; 8435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS prev_status = NFCSTATUS_SUCCESS; 8445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) || (NULL == pHwRef) ) 8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if ( NULL == psHciContext->p_admin_info ) 8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); 8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *)pResponse; 8565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message = &hcp_packet->msg.message; 8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info = psHciContext->p_admin_info; 8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly prev_cmd = p_admin_info->admin_pipe_info->prev_msg ; 8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly prev_status = p_admin_info->admin_pipe_info->prev_status ; 8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(prev_status == NFCSTATUS_PENDING) 8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(prev_cmd) 8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_SET_PARAMETER: 8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_GET_PARAMETER: 8695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Admin_InfoUpdate(psHciContext, 8715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHal_sHwReference_t *)pHwRef, 8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->reg_index, 8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &pResponse[HCP_HEADER_LEN], 8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)(length - HCP_HEADER_LEN)); 8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_OPEN_PIPE: 8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ANY_CLOSE_PIPE: 8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phOsalNfc_FreeMemory(p_admin_info->admin_pipe_info); 8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info = NULL; 8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN] = NULL; 8865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_CREATE_PIPE: 8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = (phHciNfc_Pipe_Info_t *) 8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->param_info; 8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pipe_id = hcp_message->payload[RESPONSE_PIPEID_OFFSET]; 8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Update_PipeInfo(psHciContext, 8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &(p_admin_info->pipe_seq), pipe_id, p_pipe_info); 8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_SUCCESS == status ) 8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_pipe_list[pipe_id] = p_pipe_info; 8985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->pipe.pipe_id = pipe_id; 8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_DELETE_PIPE: 9035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = (phHciNfc_Pipe_Info_t *) 9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->param_info; 9065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NULL != p_pipe_info ) 9075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pipe_id = p_pipe_info->pipe.pipe_id; 9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Update_PipeInfo( 9105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext, &(p_admin_info->pipe_seq), 9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t) HCI_UNKNOWN_PIPE_ID, p_pipe_info); 9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_SUCCESS == status ) 9135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phOsalNfc_FreeMemory(p_pipe_info); 9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_pipe_list[pipe_id] = NULL; 9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_CLEAR_ALL_PIPE: 9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 9255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 9275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_DEBUG("%s: Default Statement Should Not Occur \n", 9285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly "phHciNfc_Recv_Admin_Response"); 9295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NFCSTATUS_SUCCESS == status ) 9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NULL != p_admin_info->admin_pipe_info) 9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_SUCCESS; 9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->current_seq = p_admin_info->next_seq; 9405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 9445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 9465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Receives the HCI Admin Commands from the corresponding peripheral device. 9475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 9485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function receives the HCI Admin Commands from the connected NFC Pheripheral 9495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device 9505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 9525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS 9535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Cmd ( 9545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 9555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 9565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pCmd, 9575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 9585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 9595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 9615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 9625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 9635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 9645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext = 9655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHciNfc_sContext_t *)psContext ; 9665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Packet_t *hcp_packet = NULL; 9675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Message_t *hcp_message = NULL; 9685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_AdminGate_Info_t *p_admin_info=NULL; 9695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 9705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index=0; 9715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; 9725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t cmd = (uint8_t) HCP_MSG_INSTRUCTION_INVALID; 9735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t response = (uint8_t) ANY_OK; 9745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 9755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) 9775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NULL == pHwRef) 9785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (HCP_HEADER_LEN > length ) 9795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 9805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 9825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 9845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *)pCmd; 9865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message = &hcp_packet->msg.message; 9875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info = psHciContext->p_admin_info; 9885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the Command instruction bits from the Message Header */ 9895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly cmd = (uint8_t) GET_BITS8( hcp_message->msg_header, 9905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); 9915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch( cmd ) 9935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* These are notifications sent by the Host Controller */ 9955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_NOTIFY_PIPE_CREATED: 9965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pipe_id = hcp_message->payload[RESPONSE_PIPEID_OFFSET]; 9985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = (phHciNfc_Pipe_Info_t *) 9995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phOsalNfc_GetMemory(sizeof(phHciNfc_Pipe_Info_t)); 1000f0096a6bac78ff99f255332771867f59b2d6d73bDejan REBRACA memset(p_pipe_info, 0, sizeof(phHciNfc_Pipe_Info_t)); 10015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL != p_pipe_info) 10025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The Source Host is the UICC Host */ 10045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->pipe.source.host_id = 10055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[index++]; 10065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The Source Gate is same as the Destination Gate */ 10075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->pipe.source.gate_id = 10085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[index++]; 10095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The Source Host is the Terminal Host */ 10105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->pipe.dest.host_id = 10115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[index++]; 10125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->pipe.dest.gate_id = 10135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[index++]; 10145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->pipe.pipe_id = 10155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message->payload[index++]; 10165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Update_PipeInfo(psHciContext, 10185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &(p_admin_info->pipe_seq), pipe_id, p_pipe_info); 10195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( NFCSTATUS_SUCCESS == status ) 10215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_pipe_list[pipe_id] = p_pipe_info; 10235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NULL != p_pipe_info) 10245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info->pipe.pipe_id = pipe_id; 10265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_NOTIFY_PIPE_DELETED: 10315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pipe_id = hcp_message->payload[index++]; 10335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_pipe_info = psHciContext->p_pipe_list[pipe_id]; 10345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NULL != p_pipe_info ) 10355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Update_PipeInfo( 10375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext, &(p_admin_info->pipe_seq), 10385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t) HCI_UNKNOWN_PIPE_ID, p_pipe_info); 10395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_SUCCESS == status ) 10405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phOsalNfc_FreeMemory(p_pipe_info); 10425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->p_pipe_list[pipe_id] = NULL; 10435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TODO: Since we receive the Host ID, we need to clear 10485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * all the pipes created with the host 10495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 10505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case ADM_NOTIFY_ALL_PIPE_CLEARED: 10515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* case ADM_CREATE_PIPE: */ 10555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* case ADM_DELETE_PIPE: */ 10565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* case ADM_CLEAR_ALL_PIPE: */ 10575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 10585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly response = ANY_E_CMD_NOT_SUPPORTED; 10605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_COMMAND_NOT_SUPPORTED); 10615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 10655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 10665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t) HCI_ADMIN_PIPE_ID, 10675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_TYPE_RESPONSE, response ); 10685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psHciContext->tx_total = HCP_HEADER_LEN; 10695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef ); 10705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->recv_msg_type = HCP_MSG_TYPE_COMMAND; 10725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->sent_msg_type = HCP_MSG_TYPE_RESPONSE; 10735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->prev_msg = response; 10745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_PENDING; 10755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 10775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 10785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 10805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Receives the HCI Admin Event from the corresponding peripheral device. 10815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 10825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function receives the HCI Admin Events from the connected NFC Pheripheral 10835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device 10845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 10855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 10865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS 10875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Event ( 10885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *psContext, 10895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pHwRef, 10905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *pEvent, 10915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN 10925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t length 10935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 10945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t length 10955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 10965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 10975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 10985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext = 10995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHciNfc_sContext_t *)psContext ; 11005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Packet_t *hcp_packet = NULL; 11015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_HCP_Message_t *hcp_message = NULL; 11025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t event = (uint8_t) HCP_MSG_INSTRUCTION_INVALID; 11035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 11045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NULL == psHciContext) 11065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NULL == pHwRef) 11075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (HCP_HEADER_LEN > length ) 11085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 11095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 11115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 11135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_packet = (phHciNfc_HCP_Packet_t *)pEvent; 11155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hcp_message = &hcp_packet->msg.message; 11165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the Command instruction bits from the Message Header */ 11175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly event = (uint8_t) GET_BITS8( hcp_message->msg_header, 11185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); 11195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( EVT_HOT_PLUG == event ) 11215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phHciNfc_Send_Admin_Event ( psHciContext, pHwRef, 11235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly EVT_HOT_PLUG, 0 ,NULL); 11245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 11275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INSTRUCTION); 11295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 11345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 11355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 11385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 11395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_InfoUpdate( 11405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_sContext_t *psHciContext, 11415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sHwReference_t *pHwRef, 11425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index, 11435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *reg_value, 11445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t reg_length 11455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 11465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 11475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_AdminGate_Info_t *p_admin_info=NULL; 11485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t i=0; 11495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 11505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == reg_value) 11515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 11535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 11555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info = psHciContext->p_admin_info ; 11575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly HCI_PRINT_BUFFER("Admin Mgmt Info Buffer",reg_value,reg_length); 11585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(index) 11595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case SESSION_INDEX : 11615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for(i=0 ;(reg_length == SESSIONID_LEN)&&(i < reg_length); i++) 11635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->session_id[i] = reg_value[i]; 11655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pHwRef->session_id[i] = reg_value[i]; 11665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 11685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case MAX_PIPE_INDEX : 11705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->max_pipe = reg_value[i]; 11725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 11735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case WHITELIST_INDEX : 11755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for(i=0 ;(reg_length <= WHITELIST_MAX_LEN)&&(i < reg_length); i++) 11775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->whitelist[i] = reg_value[i]; 11795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 11815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case HOST_LIST_INDEX : 11835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for(i=0 ;(reg_length <= HOST_LIST_MAX_LEN)&&(i < reg_length); i++) 11855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly p_admin_info->host_list[i] = reg_value[i]; 11875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 11895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 11915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 11935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 11945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /*End of the default Switch Case */ 11955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /*End of the Index Switch */ 11975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* End of Context and the Identity information validity check */ 11995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 12015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 12025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1203